From b1aecfc1c4c577a8aa175dacc172a9b02f228077 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Wed, 23 Apr 2025 04:42:24 +0000 Subject: [PATCH] feat(editor): link inline extension (#11910) Closes: BS-3216 --- blocksuite/affine/all/package.json | 4 ++- .../affine/all/src/__tests__/utils/store.ts | 2 ++ .../affine/all/src/extensions/effects.ts | 2 -- .../src/inlines/{link.ts => link/index.ts} | 0 .../affine/all/src/inlines/link/store.ts | 1 + .../affine/all/src/inlines/link/view.ts | 1 + blocksuite/affine/inlines/link/package.json | 5 +++- blocksuite/affine/inlines/link/src/store.ts | 27 +++++++++++++++++++ blocksuite/affine/inlines/link/src/view.ts | 23 ++++++++++++++++ blocksuite/affine/inlines/link/tsconfig.json | 1 + .../preset/src/adapters/html/html-inline.ts | 2 -- .../preset/src/adapters/html/inline-delta.ts | 2 -- .../src/adapters/markdown/inline-delta.ts | 2 -- .../src/adapters/markdown/markdown-inline.ts | 2 -- .../src/adapters/notion-html/html-inline.ts | 2 -- .../src/adapters/plain-text/inline-delta.ts | 2 -- .../affine/inlines/preset/src/inline-spec.ts | 2 -- .../affine/inlines/preset/src/markdown.ts | 2 -- blocksuite/integration-test/src/store.ts | 2 ++ blocksuite/integration-test/src/view.ts | 2 ++ .../src/blocksuite/manager/migrating-store.ts | 2 ++ .../src/blocksuite/manager/migrating-view.ts | 2 ++ tools/utils/src/workspace.gen.ts | 1 + yarn.lock | 1 + 24 files changed, 72 insertions(+), 20 deletions(-) rename blocksuite/affine/all/src/inlines/{link.ts => link/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/inlines/link/store.ts create mode 100644 blocksuite/affine/all/src/inlines/link/view.ts create mode 100644 blocksuite/affine/inlines/link/src/store.ts create mode 100644 blocksuite/affine/inlines/link/src/view.ts diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index bd2c83c582..bf213537e3 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -143,7 +143,9 @@ "./blocks/table/view": "./src/blocks/table/view.ts", "./data-view": "./src/data-view/index.ts", "./data-view/effects": "./src/data-view/effects.ts", - "./inlines/link": "./src/inlines/link.ts", + "./inlines/link": "./src/inlines/link/index.ts", + "./inlines/link/store": "./src/inlines/link/store.ts", + "./inlines/link/view": "./src/inlines/link/view.ts", "./inlines/reference": "./src/inlines/reference.ts", "./inlines/preset": "./src/inlines/preset.ts", "./inlines/footnote": "./src/inlines/footnote/index.ts", diff --git a/blocksuite/affine/all/src/__tests__/utils/store.ts b/blocksuite/affine/all/src/__tests__/utils/store.ts index ed1bad8708..0cd702d00c 100644 --- a/blocksuite/affine/all/src/__tests__/utils/store.ts +++ b/blocksuite/affine/all/src/__tests__/utils/store.ts @@ -17,6 +17,7 @@ import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/s import { TableStoreExtension } from '@blocksuite/affine-block-table/store'; import { StoreExtensionManager } from '@blocksuite/affine-ext-loader'; import { FootnoteStoreExtension } from '@blocksuite/affine-inline-footnote/store'; +import { LinkStoreExtension } from '@blocksuite/affine-inline-link/store'; import { MigratingStoreExtension } from '../../extensions/store'; @@ -40,6 +41,7 @@ const manager = new StoreExtensionManager([ TableStoreExtension, FootnoteStoreExtension, + LinkStoreExtension, MigratingStoreExtension, ]); diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts index ae33a9dca5..54da702a55 100644 --- a/blocksuite/affine/all/src/extensions/effects.ts +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -30,7 +30,6 @@ import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment- import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects'; import { effects as fragmentOutlineEffects } from '@blocksuite/affine-fragment-outline/effects'; import { effects as inlineLatexEffects } from '@blocksuite/affine-inline-latex/effects'; -import { effects as inlineLinkEffects } from '@blocksuite/affine-inline-link/effects'; import { effects as inlineMentionEffects } from '@blocksuite/affine-inline-mention'; import { effects as inlinePresetEffects } from '@blocksuite/affine-inline-preset/effects'; import { effects as inlineReferenceEffects } from '@blocksuite/affine-inline-reference/effects'; @@ -53,7 +52,6 @@ export function effects() { inlineReferenceEffects(); inlinePresetEffects(); - inlineLinkEffects(); inlineLatexEffects(); inlineMentionEffects(); diff --git a/blocksuite/affine/all/src/inlines/link.ts b/blocksuite/affine/all/src/inlines/link/index.ts similarity index 100% rename from blocksuite/affine/all/src/inlines/link.ts rename to blocksuite/affine/all/src/inlines/link/index.ts diff --git a/blocksuite/affine/all/src/inlines/link/store.ts b/blocksuite/affine/all/src/inlines/link/store.ts new file mode 100644 index 0000000000..fef24e2429 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/link/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-link/store'; diff --git a/blocksuite/affine/all/src/inlines/link/view.ts b/blocksuite/affine/all/src/inlines/link/view.ts new file mode 100644 index 0000000000..31932c8314 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/link/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-link/view'; diff --git a/blocksuite/affine/inlines/link/package.json b/blocksuite/affine/inlines/link/package.json index ffa06b4aba..f27a96e152 100644 --- a/blocksuite/affine/inlines/link/package.json +++ b/blocksuite/affine/inlines/link/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-inline-reference": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-shared": "workspace:*", @@ -34,7 +35,9 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./store": "./src/store.ts", + "./view": "./src/view.ts" }, "files": [ "src", diff --git a/blocksuite/affine/inlines/link/src/store.ts b/blocksuite/affine/inlines/link/src/store.ts new file mode 100644 index 0000000000..2434837184 --- /dev/null +++ b/blocksuite/affine/inlines/link/src/store.ts @@ -0,0 +1,27 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { + htmlLinkElementToDeltaMatcher, + linkDeltaMarkdownAdapterMatch, + linkDeltaToHtmlAdapterMatcher, + linkDeltaToMarkdownAdapterMatcher, + markdownLinkToDeltaMatcher, + notionHtmlLinkElementToDeltaMatcher, +} from './adapters'; + +export class LinkStoreExtension extends StoreExtensionProvider { + override name = 'affine-link-inline'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(linkDeltaMarkdownAdapterMatch); + context.register(linkDeltaToMarkdownAdapterMatcher); + context.register(notionHtmlLinkElementToDeltaMatcher); + context.register(markdownLinkToDeltaMatcher); + context.register(htmlLinkElementToDeltaMatcher); + context.register(linkDeltaToHtmlAdapterMatcher); + } +} diff --git a/blocksuite/affine/inlines/link/src/view.ts b/blocksuite/affine/inlines/link/src/view.ts new file mode 100644 index 0000000000..e87a984cac --- /dev/null +++ b/blocksuite/affine/inlines/link/src/view.ts @@ -0,0 +1,23 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { LinkInlineSpecExtension } from './inline-spec'; +import { linkToolbar } from './toolbar'; + +export class LinkViewExtension extends ViewExtensionProvider { + override name = 'affine-link-inline'; + + override effect(): void { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext): void { + super.setup(context); + context.register(LinkInlineSpecExtension); + context.register(linkToolbar); + } +} diff --git a/blocksuite/affine/inlines/link/tsconfig.json b/blocksuite/affine/inlines/link/tsconfig.json index 3718e88b07..2aa5c154f4 100644 --- a/blocksuite/affine/inlines/link/tsconfig.json +++ b/blocksuite/affine/inlines/link/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../reference" }, { "path": "../../model" }, { "path": "../../shared" }, diff --git a/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts index da5f10f35c..fe53ae8a28 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/html/html-inline.ts @@ -1,4 +1,3 @@ -import { htmlLinkElementToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { type HtmlAST, HtmlASTToDeltaExtension, @@ -169,7 +168,6 @@ export const HtmlInlineToDeltaAdapterExtensions = [ htmlCodeElementToDeltaMatcher, htmlDelElementToDeltaMatcher, htmlUnderlineElementToDeltaMatcher, - htmlLinkElementToDeltaMatcher, htmlMarkElementToDeltaMatcher, htmlBrElementToDeltaMatcher, ]; diff --git a/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts index 2bcd787fdc..fc9b4e0258 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/html/inline-delta.ts @@ -1,4 +1,3 @@ -import { linkDeltaToHtmlAdapterMatcher } from '@blocksuite/affine-inline-link'; import { referenceDeltaToHtmlAdapterMatcher } from '@blocksuite/affine-inline-reference'; import type { InlineHtmlAST } from '@blocksuite/affine-shared/adapters'; import { InlineDeltaToHtmlAdapterExtension } from '@blocksuite/affine-shared/adapters'; @@ -154,5 +153,4 @@ export const InlineDeltaToHtmlAdapterExtensions = [ highlightColorDeltaToHtmlAdapterMatcher, inlineCodeDeltaToHtmlAdapterMatcher, referenceDeltaToHtmlAdapterMatcher, - linkDeltaToHtmlAdapterMatcher, ]; diff --git a/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts index cdcc5f0c9e..ea65a42d0a 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts @@ -1,5 +1,4 @@ import { latexDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-latex'; -import { linkDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-link'; import { referenceDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-reference'; import { InlineDeltaToMarkdownAdapterExtension } from '@blocksuite/affine-shared/adapters'; @@ -54,7 +53,6 @@ export const inlineCodeDeltaToMarkdownAdapterMatcher = export const InlineDeltaToMarkdownAdapterExtensions = [ referenceDeltaToMarkdownAdapterMatcher, - linkDeltaToMarkdownAdapterMatcher, inlineCodeDeltaToMarkdownAdapterMatcher, boldDeltaToMarkdownAdapterMatcher, italicDeltaToMarkdownAdapterMatcher, diff --git a/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts index 9c1674b638..e0ec7a7ab0 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts @@ -1,5 +1,4 @@ import { markdownInlineMathToDeltaMatcher } from '@blocksuite/affine-inline-latex'; -import { markdownLinkToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { MarkdownASTToDeltaExtension } from '@blocksuite/affine-shared/adapters'; export const markdownTextToDeltaMatcher = MarkdownASTToDeltaExtension({ @@ -95,7 +94,6 @@ export const MarkdownInlineToDeltaAdapterExtensions = [ markdownStrongToDeltaMatcher, markdownEmphasisToDeltaMatcher, markdownDeleteToDeltaMatcher, - markdownLinkToDeltaMatcher, markdownInlineMathToDeltaMatcher, markdownListToDeltaMatcher, markdownHtmlToDeltaMatcher, diff --git a/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts b/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts index 99a9e90ab6..932f12b9d9 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/notion-html/html-inline.ts @@ -1,4 +1,3 @@ -import { notionHtmlLinkElementToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { HastUtils, type HtmlAST, @@ -249,7 +248,6 @@ export const NotionHtmlInlineToDeltaAdapterExtensions: ExtensionType[] = [ notionHtmlCodeElementToDeltaMatcher, notionHtmlDelElementToDeltaMatcher, notionHtmlUnderlineElementToDeltaMatcher, - notionHtmlLinkElementToDeltaMatcher, notionHtmlMarkElementToDeltaMatcher, notionHtmlListToDeltaMatcher, notionHtmlLiElementToDeltaMatcher, diff --git a/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts index cd191dd5f8..93bb0c74a9 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts @@ -1,10 +1,8 @@ import { latexDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-latex'; -import { linkDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-link'; import { referenceDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-reference'; import type { ExtensionType } from '@blocksuite/store'; export const InlineDeltaToPlainTextAdapterExtensions: ExtensionType[] = [ referenceDeltaMarkdownAdapterMatch, - linkDeltaMarkdownAdapterMatch, latexDeltaMarkdownAdapterMatch, ]; diff --git a/blocksuite/affine/inlines/preset/src/inline-spec.ts b/blocksuite/affine/inlines/preset/src/inline-spec.ts index bb27129993..88c613af0e 100644 --- a/blocksuite/affine/inlines/preset/src/inline-spec.ts +++ b/blocksuite/affine/inlines/preset/src/inline-spec.ts @@ -1,5 +1,4 @@ import { inlineLatexExtensions } from '@blocksuite/affine-inline-latex'; -import { inlineLinkExtensions } from '@blocksuite/affine-inline-link'; import { inlineMentionExtensions } from '@blocksuite/affine-inline-mention'; import { inlineReferenceExtensions } from '@blocksuite/affine-inline-reference'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; @@ -105,7 +104,6 @@ export const InlineSpecExtensions: ExtensionType[] = [ CodeInlineSpecExtension, BackgroundInlineSpecExtension, ColorInlineSpecExtension, - ...inlineLinkExtensions, ...inlineReferenceExtensions, ...inlineLatexExtensions, ...inlineMentionExtensions, diff --git a/blocksuite/affine/inlines/preset/src/markdown.ts b/blocksuite/affine/inlines/preset/src/markdown.ts index b45d6ffb4e..56bdebb705 100644 --- a/blocksuite/affine/inlines/preset/src/markdown.ts +++ b/blocksuite/affine/inlines/preset/src/markdown.ts @@ -1,5 +1,4 @@ import { LatexExtension } from '@blocksuite/affine-inline-latex'; -import { LinkExtension } from '@blocksuite/affine-inline-link'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { InlineMarkdownExtension } from '@blocksuite/std/inline'; import type { ExtensionType } from '@blocksuite/store'; @@ -371,6 +370,5 @@ export const MarkdownExtensions: ExtensionType[] = [ StrikethroughExtension, UnderthroughExtension, CodeExtension, - LinkExtension, LatexExtension, ]; diff --git a/blocksuite/integration-test/src/store.ts b/blocksuite/integration-test/src/store.ts index 3f472a032e..8d5ccb8af3 100644 --- a/blocksuite/integration-test/src/store.ts +++ b/blocksuite/integration-test/src/store.ts @@ -18,6 +18,7 @@ import { TableStoreExtension } from '@blocksuite/affine/blocks/table/store'; import { StoreExtensionManager } from '@blocksuite/affine/ext-loader'; import { MigratingStoreExtension } from '@blocksuite/affine/extensions/store'; import { FootnoteStoreExtension } from '@blocksuite/affine/inlines/footnote/store'; +import { LinkStoreExtension } from '@blocksuite/affine/inlines/link/store'; const manager = new StoreExtensionManager([ AttachmentStoreExtension, @@ -39,6 +40,7 @@ const manager = new StoreExtensionManager([ TableStoreExtension, FootnoteStoreExtension, + LinkStoreExtension, MigratingStoreExtension, ]); diff --git a/blocksuite/integration-test/src/view.ts b/blocksuite/integration-test/src/view.ts index 39234fa035..ad8fc8d051 100644 --- a/blocksuite/integration-test/src/view.ts +++ b/blocksuite/integration-test/src/view.ts @@ -18,6 +18,7 @@ import { TableViewExtension } from '@blocksuite/affine/blocks/table/view'; import { ViewExtensionManager } from '@blocksuite/affine/ext-loader'; import { MigratingViewExtension } from '@blocksuite/affine/extensions/view'; import { FootnoteViewExtension } from '@blocksuite/affine/inlines/footnote/view'; +import { LinkViewExtension } from '@blocksuite/affine/inlines/link/view'; export function getTestViewManager() { const manager = new ViewExtensionManager([ @@ -44,6 +45,7 @@ export function getTestViewManager() { // Inline FootnoteViewExtension, + LinkViewExtension, ]); return manager; } diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts index 2da233c1a8..ddaee13664 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts @@ -22,6 +22,7 @@ import { } from '@blocksuite/affine/ext-loader'; import { MigratingStoreExtension } from '@blocksuite/affine/extensions/store'; import { FootnoteStoreExtension } from '@blocksuite/affine/inlines/footnote/store'; +import { LinkStoreExtension } from '@blocksuite/affine/inlines/link/store'; import { AIChatBlockSchemaExtension } from '../ai/blocks/ai-chat-block/model'; @@ -55,6 +56,7 @@ const manager = new StoreExtensionManager([ TableStoreExtension, // Inline FootnoteStoreExtension, + LinkStoreExtension, MigratingStoreExtension, MigratingAffineStoreExtension, diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts index 06fa45e8a5..d08c5e30aa 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts @@ -24,6 +24,7 @@ import { } from '@blocksuite/affine/ext-loader'; import { MigratingViewExtension } from '@blocksuite/affine/extensions/view'; import { FootnoteViewExtension } from '@blocksuite/affine/inlines/footnote/view'; +import { LinkViewExtension } from '@blocksuite/affine/inlines/link/view'; import { ToolbarModuleExtension } from '@blocksuite/affine/shared/services'; import { BlockFlavourIdentifier } from '@blocksuite/affine/std'; import { FrameworkProvider } from '@toeverything/infra'; @@ -168,6 +169,7 @@ const manager = new ViewExtensionManager([ TableViewExtension, // Inline FootnoteViewExtension, + LinkViewExtension, MigratingAffineViewExtension, ]); diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 219770e15a..6da97709bb 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -666,6 +666,7 @@ export const PackageList = [ name: '@blocksuite/affine-inline-link', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/shared', diff --git a/yarn.lock b/yarn.lock index 63664b1e44..e330507931 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3388,6 +3388,7 @@ __metadata: resolution: "@blocksuite/affine-inline-link@workspace:blocksuite/affine/inlines/link" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*"