From 16831e8c0e811700b98b1df5cded04f13a643d3c Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Wed, 23 Apr 2025 09:22:15 +0000 Subject: [PATCH] feat(editor): reference, mention and latex inline extension (#11914) Closes: BS-3215 Closes: BS-3218 Closes: BS-3217 --- blocksuite/affine/all/package.json | 12 +- .../src/__tests__/adapters/html.unit.spec.ts | 6 +- .../affine/all/src/__tests__/utils/store.ts | 46 +---- .../affine/all/src/adapters/extension.ts | 6 +- .../affine/all/src/extensions/effects.ts | 6 - .../all/src/extensions/migrating-store.ts | 118 ++++++++++++ .../all/src/extensions/migrating-view.ts | 42 +++++ blocksuite/affine/all/src/extensions/store.ts | 168 +++++------------- blocksuite/affine/all/src/extensions/view.ts | 88 +++++---- .../src/inlines/{latex.ts => latex/index.ts} | 0 .../affine/all/src/inlines/latex/store.ts | 1 + .../affine/all/src/inlines/latex/view.ts | 1 + .../inlines/{mention.ts => mention/index.ts} | 0 .../affine/all/src/inlines/mention/view.ts | 1 + .../{reference.ts => reference/index.ts} | 0 .../affine/all/src/inlines/reference/store.ts | 1 + .../affine/all/src/inlines/reference/view.ts | 1 + .../affine/blocks/code/src/adapters/html.ts | 43 +++-- blocksuite/affine/inlines/latex/package.json | 5 +- blocksuite/affine/inlines/latex/src/store.ts | 21 +++ blocksuite/affine/inlines/latex/src/view.ts | 29 +++ blocksuite/affine/inlines/latex/tsconfig.json | 1 + .../affine/inlines/mention/package.json | 4 +- blocksuite/affine/inlines/mention/src/view.ts | 21 +++ .../affine/inlines/mention/tsconfig.json | 1 + .../inlines/preset/src/adapters/extensions.ts | 3 - .../preset/src/adapters/html/inline-delta.ts | 2 - .../src/adapters/markdown/inline-delta.ts | 4 - .../src/adapters/markdown/markdown-inline.ts | 2 - .../src/adapters/plain-text/inline-delta.ts | 8 - .../affine/inlines/preset/src/inline-spec.ts | 6 - .../affine/inlines/reference/package.json | 5 +- .../affine/inlines/reference/src/store.ts | 21 +++ .../affine/inlines/reference/src/view.ts | 25 +++ .../affine/inlines/reference/tsconfig.json | 1 + blocksuite/integration-test/src/store.ts | 46 +---- blocksuite/integration-test/src/view.ts | 49 +---- .../nbstore/src/sync/indexer/bs-store.ts | 8 + .../nbstore/src/sync/indexer/crawler.ts | 10 +- packages/frontend/apps/android/src/app.tsx | 10 +- packages/frontend/apps/ios/src/app.tsx | 9 +- .../blocksuite/ai/components/text-renderer.ts | 10 +- .../__tests__/mindmap-preview.unit.spec.ts | 10 +- .../src/blocksuite/manager/migrating-store.ts | 45 +---- .../src/blocksuite/manager/migrating-view.ts | 45 +---- tools/utils/src/workspace.gen.ts | 3 + yarn.lock | 3 + 47 files changed, 489 insertions(+), 458 deletions(-) create mode 100644 blocksuite/affine/all/src/extensions/migrating-store.ts create mode 100644 blocksuite/affine/all/src/extensions/migrating-view.ts rename blocksuite/affine/all/src/inlines/{latex.ts => latex/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/inlines/latex/store.ts create mode 100644 blocksuite/affine/all/src/inlines/latex/view.ts rename blocksuite/affine/all/src/inlines/{mention.ts => mention/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/inlines/mention/view.ts rename blocksuite/affine/all/src/inlines/{reference.ts => reference/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/inlines/reference/store.ts create mode 100644 blocksuite/affine/all/src/inlines/reference/view.ts create mode 100644 blocksuite/affine/inlines/latex/src/store.ts create mode 100644 blocksuite/affine/inlines/latex/src/view.ts create mode 100644 blocksuite/affine/inlines/mention/src/view.ts delete mode 100644 blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts create mode 100644 blocksuite/affine/inlines/reference/src/store.ts create mode 100644 blocksuite/affine/inlines/reference/src/view.ts create mode 100644 packages/common/nbstore/src/sync/indexer/bs-store.ts diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index bf213537e..70c385f9a 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -146,13 +146,18 @@ "./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/reference": "./src/inlines/reference/index.ts", + "./inlines/reference/store": "./src/inlines/reference/store.ts", + "./inlines/reference/view": "./src/inlines/reference/view.ts", "./inlines/preset": "./src/inlines/preset.ts", "./inlines/footnote": "./src/inlines/footnote/index.ts", "./inlines/footnote/view": "./src/inlines/footnote/view.ts", "./inlines/footnote/store": "./src/inlines/footnote/store.ts", - "./inlines/latex": "./src/inlines/latex.ts", - "./inlines/mention": "./src/inlines/mention.ts", + "./inlines/latex": "./src/inlines/latex/index.ts", + "./inlines/latex/store": "./src/inlines/latex/store.ts", + "./inlines/latex/view": "./src/inlines/latex/view.ts", + "./inlines/mention": "./src/inlines/mention/index.ts", + "./inlines/mention/view": "./src/inlines/mention/view.ts", "./widgets/drag-handle": "./src/widgets/drag-handle.ts", "./widgets/edgeless-auto-connect": "./src/widgets/edgeless-auto-connect.ts", "./widgets/edgeless-toolbar": "./src/widgets/edgeless-toolbar.ts", @@ -215,7 +220,6 @@ "./schemas": "./src/schemas.ts", "./model": "./src/model/index.ts", "./sync": "./src/sync/index.ts", - "./adapters": "./src/adapters/index.ts", "./extensions/store": "./src/extensions/store.ts", "./extensions/view": "./src/extensions/view.ts" }, diff --git a/blocksuite/affine/all/src/__tests__/adapters/html.unit.spec.ts b/blocksuite/affine/all/src/__tests__/adapters/html.unit.spec.ts index 3016e8a11..1e97ac503 100644 --- a/blocksuite/affine/all/src/__tests__/adapters/html.unit.spec.ts +++ b/blocksuite/affine/all/src/__tests__/adapters/html.unit.spec.ts @@ -125,7 +125,7 @@ describe('snapshot to html', () => { }; const html = template( - `
import this
` + `
import this
` ); const htmlAdapter = new HtmlAdapter(createJob(), provider); @@ -191,7 +191,7 @@ describe('snapshot to html', () => { }; const html = template( - `
import this
` + `
import this
` ); const htmlAdapter = new HtmlAdapter(createJob(), provider); @@ -257,7 +257,7 @@ describe('snapshot to html', () => { }; const html = template( - `
import this
` + `
import this
` ); const htmlAdapter = new HtmlAdapter(createJob(), provider); diff --git a/blocksuite/affine/all/src/__tests__/utils/store.ts b/blocksuite/affine/all/src/__tests__/utils/store.ts index 0cd702d00..92e80e8f7 100644 --- a/blocksuite/affine/all/src/__tests__/utils/store.ts +++ b/blocksuite/affine/all/src/__tests__/utils/store.ts @@ -1,49 +1,7 @@ -import { AttachmentStoreExtension } from '@blocksuite/affine-block-attachment/store'; -import { BookmarkStoreExtension } from '@blocksuite/affine-block-bookmark/store'; -import { CalloutStoreExtension } from '@blocksuite/affine-block-callout/store'; -import { CodeStoreExtension } from '@blocksuite/affine-block-code/store'; -import { DataViewStoreExtension } from '@blocksuite/affine-block-data-view/store'; -import { DatabaseStoreExtension } from '@blocksuite/affine-block-database/store'; -import { DividerStoreExtension } from '@blocksuite/affine-block-divider/store'; -import { EdgelessTextStoreExtension } from '@blocksuite/affine-block-edgeless-text/store'; -import { EmbedStoreExtension } from '@blocksuite/affine-block-embed/store'; -import { FrameStoreExtension } from '@blocksuite/affine-block-frame/store'; -import { ImageStoreExtension } from '@blocksuite/affine-block-image/store'; -import { LatexStoreExtension } from '@blocksuite/affine-block-latex/store'; -import { ListStoreExtension } from '@blocksuite/affine-block-list/store'; -import { NoteStoreExtension } from '@blocksuite/affine-block-note/store'; -import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/store'; -import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store'; -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'; +import { getInternalStoreExtensions } from '../../extensions/store'; -const manager = new StoreExtensionManager([ - AttachmentStoreExtension, - BookmarkStoreExtension, - CalloutStoreExtension, - CodeStoreExtension, - DataViewStoreExtension, - DatabaseStoreExtension, - DividerStoreExtension, - EdgelessTextStoreExtension, - EmbedStoreExtension, - FrameStoreExtension, - ImageStoreExtension, - LatexStoreExtension, - ListStoreExtension, - NoteStoreExtension, - ParagraphStoreExtension, - SurfaceRefStoreExtension, - TableStoreExtension, - - FootnoteStoreExtension, - LinkStoreExtension, - - MigratingStoreExtension, -]); +const manager = new StoreExtensionManager(getInternalStoreExtensions()); export const testStoreExtensions = manager.get('store'); diff --git a/blocksuite/affine/all/src/adapters/extension.ts b/blocksuite/affine/all/src/adapters/extension.ts index cd9ba3f99..3e5961c2a 100644 --- a/blocksuite/affine/all/src/adapters/extension.ts +++ b/blocksuite/affine/all/src/adapters/extension.ts @@ -2,7 +2,6 @@ import { HtmlInlineToDeltaAdapterExtensions, InlineDeltaToHtmlAdapterExtensions, InlineDeltaToMarkdownAdapterExtensions, - InlineDeltaToPlainTextAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, NotionHtmlInlineToDeltaAdapterExtensions, } from '@blocksuite/affine-inline-preset'; @@ -62,8 +61,5 @@ export function getNotionHtmlAdapterExtensions(): ExtensionType[] { } export function getPlainTextAdapterExtensions(): ExtensionType[] { - return [ - ...defaultBlockPlainTextAdapterMatchers, - ...InlineDeltaToPlainTextAdapterExtensions, - ]; + return [...defaultBlockPlainTextAdapterMatchers]; } diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts index 54da702a5..13cb3b7bc 100644 --- a/blocksuite/affine/all/src/extensions/effects.ts +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -29,10 +29,7 @@ import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine- import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects'; 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 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'; import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects'; import { effects as widgetDragHandleEffects } from '@blocksuite/affine-widget-drag-handle/effects'; import { effects as widgetEdgelessAutoConnectEffects } from '@blocksuite/affine-widget-edgeless-auto-connect/effects'; @@ -50,10 +47,7 @@ export function effects() { dataViewEffects(); richTextEffects(); - inlineReferenceEffects(); inlinePresetEffects(); - inlineLatexEffects(); - inlineMentionEffects(); blockSurfaceEffects(); blockRootEffects(); diff --git a/blocksuite/affine/all/src/extensions/migrating-store.ts b/blocksuite/affine/all/src/extensions/migrating-store.ts new file mode 100644 index 000000000..76a332636 --- /dev/null +++ b/blocksuite/affine/all/src/extensions/migrating-store.ts @@ -0,0 +1,118 @@ +import { DatabaseSelectionExtension } from '@blocksuite/affine-block-database'; +import { + RootBlockHtmlAdapterExtension, + RootBlockMarkdownAdapterExtension, + RootBlockNotionHtmlAdapterExtension, +} from '@blocksuite/affine-block-root'; +import { SurfaceBlockSchemaExtension } from '@blocksuite/affine-block-surface'; +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { + HtmlInlineToDeltaAdapterExtensions, + InlineDeltaToHtmlAdapterExtensions, + InlineDeltaToMarkdownAdapterExtensions, + MarkdownInlineToDeltaAdapterExtensions, + NotionHtmlInlineToDeltaAdapterExtensions, +} from '@blocksuite/affine-inline-preset'; +import { + RootBlockSchemaExtension, + TranscriptionBlockSchemaExtension, +} from '@blocksuite/affine-model'; +import { + HtmlAdapterFactoryExtension, + MarkdownAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, +} from '@blocksuite/affine-shared/adapters'; +import { HighlightSelectionExtension } from '@blocksuite/affine-shared/selection'; +import { + BlockMetaService, + FeatureFlagService, + FileSizeLimitService, + LinkPreviewerService, +} from '@blocksuite/affine-shared/services'; +import { + BlockSelectionExtension, + CursorSelectionExtension, + SurfaceSelectionExtension, + TextSelectionExtension, +} from '@blocksuite/std'; +import type { ExtensionType } from '@blocksuite/store'; + +function getAdapterFactoryExtensions(): ExtensionType[] { + return [ + MarkdownAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, + HtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + ]; +} + +const defaultBlockHtmlAdapterMatchers = [RootBlockHtmlAdapterExtension]; + +const defaultBlockMarkdownAdapterMatchers = [RootBlockMarkdownAdapterExtension]; + +const defaultBlockNotionHtmlAdapterMatchers: ExtensionType[] = [ + RootBlockNotionHtmlAdapterExtension, +]; + +function getHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...HtmlInlineToDeltaAdapterExtensions, + ...defaultBlockHtmlAdapterMatchers, + ...InlineDeltaToHtmlAdapterExtensions, + ]; +} + +function getMarkdownAdapterExtensions(): ExtensionType[] { + return [ + ...MarkdownInlineToDeltaAdapterExtensions, + ...defaultBlockMarkdownAdapterMatchers, + ...InlineDeltaToMarkdownAdapterExtensions, + ]; +} + +function getNotionHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...NotionHtmlInlineToDeltaAdapterExtensions, + ...defaultBlockNotionHtmlAdapterMatchers, + ]; +} + +const MigratingStoreExtensions: ExtensionType[] = [ + RootBlockSchemaExtension, + SurfaceBlockSchemaExtension, + TranscriptionBlockSchemaExtension, + + BlockSelectionExtension, + TextSelectionExtension, + SurfaceSelectionExtension, + CursorSelectionExtension, + HighlightSelectionExtension, + DatabaseSelectionExtension, + + getHtmlAdapterExtensions(), + getMarkdownAdapterExtensions(), + getNotionHtmlAdapterExtensions(), + getAdapterFactoryExtensions(), + + FeatureFlagService, + LinkPreviewerService, + FileSizeLimitService, + BlockMetaService, +].flat(); + +export class MigratingStoreExtension extends StoreExtensionProvider { + override name = 'migrating'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(MigratingStoreExtensions); + } +} diff --git a/blocksuite/affine/all/src/extensions/migrating-view.ts b/blocksuite/affine/all/src/extensions/migrating-view.ts new file mode 100644 index 000000000..92078eae4 --- /dev/null +++ b/blocksuite/affine/all/src/extensions/migrating-view.ts @@ -0,0 +1,42 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { + MigratingEdgelessEditorBlockSpecs, + MigratingPageEditorBlockSpecs, + MigratingPreviewEdgelessEditorBlockSpecs, + MigratingPreviewPageEditorBlockSpecs, +} from './migrating'; + +export class MigratingViewExtension extends ViewExtensionProvider { + override name = 'migrating'; + + override effect() { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + const scope = context.scope; + if (scope === 'preview-page') { + context.register(MigratingPreviewPageEditorBlockSpecs); + return; + } + if (scope === 'preview-edgeless') { + context.register(MigratingPreviewEdgelessEditorBlockSpecs); + return; + } + if (scope === 'page' || scope === 'mobile-page') { + context.register(MigratingPageEditorBlockSpecs); + return; + } + if (scope === 'edgeless' || scope === 'mobile-edgeless') { + context.register(MigratingEdgelessEditorBlockSpecs); + return; + } + } +} diff --git a/blocksuite/affine/all/src/extensions/store.ts b/blocksuite/affine/all/src/extensions/store.ts index f1e972dac..b8df7ce44 100644 --- a/blocksuite/affine/all/src/extensions/store.ts +++ b/blocksuite/affine/all/src/extensions/store.ts @@ -1,124 +1,52 @@ -import { DatabaseSelectionExtension } from '@blocksuite/affine-block-database'; -import { - RootBlockHtmlAdapterExtension, - RootBlockMarkdownAdapterExtension, - RootBlockNotionHtmlAdapterExtension, -} from '@blocksuite/affine-block-root'; -import { SurfaceBlockSchemaExtension } from '@blocksuite/affine-block-surface'; -import { - type StoreExtensionContext, - StoreExtensionProvider, -} from '@blocksuite/affine-ext-loader'; -import { - HtmlInlineToDeltaAdapterExtensions, - InlineDeltaToHtmlAdapterExtensions, - InlineDeltaToMarkdownAdapterExtensions, - InlineDeltaToPlainTextAdapterExtensions, - MarkdownInlineToDeltaAdapterExtensions, - NotionHtmlInlineToDeltaAdapterExtensions, -} from '@blocksuite/affine-inline-preset'; -import { - RootBlockSchemaExtension, - TranscriptionBlockSchemaExtension, -} from '@blocksuite/affine-model'; -import { - HtmlAdapterFactoryExtension, - MarkdownAdapterFactoryExtension, - MixTextAdapterFactoryExtension, - NotionHtmlAdapterFactoryExtension, - NotionTextAdapterFactoryExtension, - PlainTextAdapterFactoryExtension, -} from '@blocksuite/affine-shared/adapters'; -import { HighlightSelectionExtension } from '@blocksuite/affine-shared/selection'; -import { - BlockMetaService, - FeatureFlagService, - FileSizeLimitService, - LinkPreviewerService, -} from '@blocksuite/affine-shared/services'; -import { - BlockSelectionExtension, - CursorSelectionExtension, - SurfaceSelectionExtension, - TextSelectionExtension, -} from '@blocksuite/std'; -import type { ExtensionType } from '@blocksuite/store'; +import { AttachmentStoreExtension } from '@blocksuite/affine-block-attachment/store'; +import { BookmarkStoreExtension } from '@blocksuite/affine-block-bookmark/store'; +import { CalloutStoreExtension } from '@blocksuite/affine-block-callout/store'; +import { CodeStoreExtension } from '@blocksuite/affine-block-code/store'; +import { DataViewStoreExtension } from '@blocksuite/affine-block-data-view/store'; +import { DatabaseStoreExtension } from '@blocksuite/affine-block-database/store'; +import { DividerStoreExtension } from '@blocksuite/affine-block-divider/store'; +import { EdgelessTextStoreExtension } from '@blocksuite/affine-block-edgeless-text/store'; +import { EmbedStoreExtension } from '@blocksuite/affine-block-embed/store'; +import { FrameStoreExtension } from '@blocksuite/affine-block-frame/store'; +import { ImageStoreExtension } from '@blocksuite/affine-block-image/store'; +import { LatexStoreExtension } from '@blocksuite/affine-block-latex/store'; +import { ListStoreExtension } from '@blocksuite/affine-block-list/store'; +import { NoteStoreExtension } from '@blocksuite/affine-block-note/store'; +import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/store'; +import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store'; +import { TableStoreExtension } from '@blocksuite/affine-block-table/store'; +import { FootnoteStoreExtension } from '@blocksuite/affine-inline-footnote/store'; +import { LatexStoreExtension as InlineLatexStoreExtension } from '@blocksuite/affine-inline-latex/store'; +import { LinkStoreExtension } from '@blocksuite/affine-inline-link/store'; +import { ReferenceStoreExtension } from '@blocksuite/affine-inline-reference/store'; -function getAdapterFactoryExtensions(): ExtensionType[] { +import { MigratingStoreExtension } from './migrating-store'; + +export function getInternalStoreExtensions() { return [ - MarkdownAdapterFactoryExtension, - PlainTextAdapterFactoryExtension, - HtmlAdapterFactoryExtension, - NotionTextAdapterFactoryExtension, - NotionHtmlAdapterFactoryExtension, - MixTextAdapterFactoryExtension, + AttachmentStoreExtension, + BookmarkStoreExtension, + CalloutStoreExtension, + CodeStoreExtension, + DataViewStoreExtension, + DatabaseStoreExtension, + DividerStoreExtension, + EdgelessTextStoreExtension, + EmbedStoreExtension, + FrameStoreExtension, + ImageStoreExtension, + LatexStoreExtension, + ListStoreExtension, + NoteStoreExtension, + ParagraphStoreExtension, + SurfaceRefStoreExtension, + TableStoreExtension, + + FootnoteStoreExtension, + LinkStoreExtension, + ReferenceStoreExtension, + InlineLatexStoreExtension, + + MigratingStoreExtension, ]; } - -const defaultBlockHtmlAdapterMatchers = [RootBlockHtmlAdapterExtension]; - -const defaultBlockMarkdownAdapterMatchers = [RootBlockMarkdownAdapterExtension]; - -const defaultBlockNotionHtmlAdapterMatchers: ExtensionType[] = [ - RootBlockNotionHtmlAdapterExtension, -]; - -function getHtmlAdapterExtensions(): ExtensionType[] { - return [ - ...HtmlInlineToDeltaAdapterExtensions, - ...defaultBlockHtmlAdapterMatchers, - ...InlineDeltaToHtmlAdapterExtensions, - ]; -} - -function getMarkdownAdapterExtensions(): ExtensionType[] { - return [ - ...MarkdownInlineToDeltaAdapterExtensions, - ...defaultBlockMarkdownAdapterMatchers, - ...InlineDeltaToMarkdownAdapterExtensions, - ]; -} - -function getNotionHtmlAdapterExtensions(): ExtensionType[] { - return [ - ...NotionHtmlInlineToDeltaAdapterExtensions, - ...defaultBlockNotionHtmlAdapterMatchers, - ]; -} - -function getPlainTextAdapterExtensions(): ExtensionType[] { - return [...InlineDeltaToPlainTextAdapterExtensions]; -} - -const MigratingStoreExtensions: ExtensionType[] = [ - RootBlockSchemaExtension, - SurfaceBlockSchemaExtension, - TranscriptionBlockSchemaExtension, - - BlockSelectionExtension, - TextSelectionExtension, - SurfaceSelectionExtension, - CursorSelectionExtension, - HighlightSelectionExtension, - DatabaseSelectionExtension, - - getHtmlAdapterExtensions(), - getMarkdownAdapterExtensions(), - getNotionHtmlAdapterExtensions(), - getPlainTextAdapterExtensions(), - getAdapterFactoryExtensions(), - - FeatureFlagService, - LinkPreviewerService, - FileSizeLimitService, - BlockMetaService, -].flat(); - -export class MigratingStoreExtension extends StoreExtensionProvider { - override name = 'migrating'; - - override setup(context: StoreExtensionContext) { - super.setup(context); - context.register(MigratingStoreExtensions); - } -} diff --git a/blocksuite/affine/all/src/extensions/view.ts b/blocksuite/affine/all/src/extensions/view.ts index 92078eae4..bb1e0603f 100644 --- a/blocksuite/affine/all/src/extensions/view.ts +++ b/blocksuite/affine/all/src/extensions/view.ts @@ -1,42 +1,56 @@ -import { - type ViewExtensionContext, - ViewExtensionProvider, -} from '@blocksuite/affine-ext-loader'; +import { AttachmentViewExtension } from '@blocksuite/affine-block-attachment/view'; +import { BookmarkViewExtension } from '@blocksuite/affine-block-bookmark/view'; +import { CalloutViewExtension } from '@blocksuite/affine-block-callout/view'; +import { CodeBlockViewExtension } from '@blocksuite/affine-block-code/view'; +import { DataViewViewExtension } from '@blocksuite/affine-block-data-view/view'; +import { DatabaseViewExtension } from '@blocksuite/affine-block-database/view'; +import { DividerViewExtension } from '@blocksuite/affine-block-divider/view'; +import { EdgelessTextViewExtension } from '@blocksuite/affine-block-edgeless-text/view'; +import { EmbedViewExtension } from '@blocksuite/affine-block-embed/view'; +import { FrameViewExtension } from '@blocksuite/affine-block-frame/view'; +import { ImageViewExtension } from '@blocksuite/affine-block-image/view'; +import { LatexViewExtension } from '@blocksuite/affine-block-latex/view'; +import { ListViewExtension } from '@blocksuite/affine-block-list/view'; +import { NoteViewExtension } from '@blocksuite/affine-block-note/view'; +import { ParagraphViewExtension } from '@blocksuite/affine-block-paragraph/view'; +import { SurfaceRefViewExtension } from '@blocksuite/affine-block-surface-ref/view'; +import { TableViewExtension } from '@blocksuite/affine-block-table/view'; +import { FootnoteViewExtension } from '@blocksuite/affine-inline-footnote/view'; +import { LatexViewExtension as InlineLatexViewExtension } from '@blocksuite/affine-inline-latex/view'; +import { LinkViewExtension } from '@blocksuite/affine-inline-link/view'; +import { MentionViewExtension } from '@blocksuite/affine-inline-mention/view'; +import { ReferenceViewExtension } from '@blocksuite/affine-inline-reference/view'; -import { effects } from './effects'; -import { - MigratingEdgelessEditorBlockSpecs, - MigratingPageEditorBlockSpecs, - MigratingPreviewEdgelessEditorBlockSpecs, - MigratingPreviewPageEditorBlockSpecs, -} from './migrating'; +import { MigratingViewExtension } from './migrating-view'; -export class MigratingViewExtension extends ViewExtensionProvider { - override name = 'migrating'; +export function getInternalViewExtensions() { + return [ + MigratingViewExtension, - override effect() { - super.effect(); - effects(); - } + // Block + AttachmentViewExtension, + BookmarkViewExtension, + CalloutViewExtension, + CodeBlockViewExtension, + DataViewViewExtension, + DatabaseViewExtension, + DividerViewExtension, + EdgelessTextViewExtension, + EmbedViewExtension, + FrameViewExtension, + ImageViewExtension, + LatexViewExtension, + ListViewExtension, + NoteViewExtension, + ParagraphViewExtension, + SurfaceRefViewExtension, + TableViewExtension, - override setup(context: ViewExtensionContext) { - super.setup(context); - const scope = context.scope; - if (scope === 'preview-page') { - context.register(MigratingPreviewPageEditorBlockSpecs); - return; - } - if (scope === 'preview-edgeless') { - context.register(MigratingPreviewEdgelessEditorBlockSpecs); - return; - } - if (scope === 'page' || scope === 'mobile-page') { - context.register(MigratingPageEditorBlockSpecs); - return; - } - if (scope === 'edgeless' || scope === 'mobile-edgeless') { - context.register(MigratingEdgelessEditorBlockSpecs); - return; - } - } + // Inline + FootnoteViewExtension, + LinkViewExtension, + ReferenceViewExtension, + InlineLatexViewExtension, + MentionViewExtension, + ]; } diff --git a/blocksuite/affine/all/src/inlines/latex.ts b/blocksuite/affine/all/src/inlines/latex/index.ts similarity index 100% rename from blocksuite/affine/all/src/inlines/latex.ts rename to blocksuite/affine/all/src/inlines/latex/index.ts diff --git a/blocksuite/affine/all/src/inlines/latex/store.ts b/blocksuite/affine/all/src/inlines/latex/store.ts new file mode 100644 index 000000000..e3341819b --- /dev/null +++ b/blocksuite/affine/all/src/inlines/latex/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-latex/store'; diff --git a/blocksuite/affine/all/src/inlines/latex/view.ts b/blocksuite/affine/all/src/inlines/latex/view.ts new file mode 100644 index 000000000..50eae0e84 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/latex/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-latex/view'; diff --git a/blocksuite/affine/all/src/inlines/mention.ts b/blocksuite/affine/all/src/inlines/mention/index.ts similarity index 100% rename from blocksuite/affine/all/src/inlines/mention.ts rename to blocksuite/affine/all/src/inlines/mention/index.ts diff --git a/blocksuite/affine/all/src/inlines/mention/view.ts b/blocksuite/affine/all/src/inlines/mention/view.ts new file mode 100644 index 000000000..38591c509 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/mention/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-mention/view'; diff --git a/blocksuite/affine/all/src/inlines/reference.ts b/blocksuite/affine/all/src/inlines/reference/index.ts similarity index 100% rename from blocksuite/affine/all/src/inlines/reference.ts rename to blocksuite/affine/all/src/inlines/reference/index.ts diff --git a/blocksuite/affine/all/src/inlines/reference/store.ts b/blocksuite/affine/all/src/inlines/reference/store.ts new file mode 100644 index 000000000..34ca4d25d --- /dev/null +++ b/blocksuite/affine/all/src/inlines/reference/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-reference/store'; diff --git a/blocksuite/affine/all/src/inlines/reference/view.ts b/blocksuite/affine/all/src/inlines/reference/view.ts new file mode 100644 index 000000000..ffab9a0a5 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/reference/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-reference/view'; diff --git a/blocksuite/affine/blocks/code/src/adapters/html.ts b/blocksuite/affine/blocks/code/src/adapters/html.ts index 5663db387..19b0075bb 100644 --- a/blocksuite/affine/blocks/code/src/adapters/html.ts +++ b/blocksuite/affine/blocks/code/src/adapters/html.ts @@ -7,7 +7,6 @@ import { } from '@blocksuite/affine-shared/adapters'; import type { DeltaInsert } from '@blocksuite/store'; import { nanoid } from '@blocksuite/store'; -import { bundledLanguagesInfo, codeToHast } from 'shiki'; export const codeBlockHtmlAdapterMatcher: BlockHtmlAdapterMatcher = { flavour: CodeBlockSchema.model.flavour, @@ -69,24 +68,38 @@ export const codeBlockHtmlAdapterMatcher: BlockHtmlAdapterMatcher = { enter: async (o, context) => { const { walkerContext } = context; const rawLang = o.node.props.language as string | null; - const matchedLang = rawLang - ? (bundledLanguagesInfo.find( - info => - info.id === rawLang || - info.name === rawLang || - info.aliases?.includes(rawLang) - )?.id ?? 'text') - : 'text'; - const text = (o.node.props.text as Record) .delta as DeltaInsert[]; const code = text.map(delta => delta.insert).join(''); - const hast = await codeToHast(code, { - lang: matchedLang, - theme: 'light-plus', - }); - walkerContext.openNode(hast as never, 'children').closeNode(); + walkerContext + .openNode( + { + type: 'element', + tagName: 'pre', + properties: {}, + children: [], + }, + 'children' + ) + .openNode( + { + type: 'element', + tagName: 'code', + properties: { + className: [`code-${rawLang ?? 'text'}`], + }, + children: [ + { + type: 'text', + value: code, + }, + ], + }, + 'children' + ) + .closeNode() + .closeNode(); }, }, }; diff --git a/blocksuite/affine/inlines/latex/package.json b/blocksuite/affine/inlines/latex/package.json index dd788b6e8..aad4066e4 100644 --- a/blocksuite/affine/inlines/latex/package.json +++ b/blocksuite/affine/inlines/latex/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-rich-text": "workspace:*", @@ -40,7 +41,9 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./view": "./src/view.ts", + "./store": "./src/store.ts" }, "files": [ "src", diff --git a/blocksuite/affine/inlines/latex/src/store.ts b/blocksuite/affine/inlines/latex/src/store.ts new file mode 100644 index 000000000..9d8338c81 --- /dev/null +++ b/blocksuite/affine/inlines/latex/src/store.ts @@ -0,0 +1,21 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { + latexDeltaMarkdownAdapterMatch, + latexDeltaToMarkdownAdapterMatcher, + markdownInlineMathToDeltaMatcher, +} from './adapters'; + +export class LatexStoreExtension extends StoreExtensionProvider { + override name = 'affine-latex-inline'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(latexDeltaMarkdownAdapterMatch); + context.register(latexDeltaToMarkdownAdapterMatcher); + context.register(markdownInlineMathToDeltaMatcher); + } +} diff --git a/blocksuite/affine/inlines/latex/src/view.ts b/blocksuite/affine/inlines/latex/src/view.ts new file mode 100644 index 000000000..b9b018308 --- /dev/null +++ b/blocksuite/affine/inlines/latex/src/view.ts @@ -0,0 +1,29 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { + LatexEditorUnitSpecExtension, + LatexInlineSpecExtension, +} from './inline-spec'; +import { LatexEditorInlineManagerExtension } from './latex-node/latex-editor-menu'; + +export class LatexViewExtension extends ViewExtensionProvider { + override name = 'affine-latex-inline'; + + override effect(): void { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register([ + LatexInlineSpecExtension, + LatexEditorUnitSpecExtension, + LatexEditorInlineManagerExtension, + ]); + } +} diff --git a/blocksuite/affine/inlines/latex/tsconfig.json b/blocksuite/affine/inlines/latex/tsconfig.json index 6ca999e07..0a33c7d79 100644 --- a/blocksuite/affine/inlines/latex/tsconfig.json +++ b/blocksuite/affine/inlines/latex/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../reference" }, { "path": "../../model" }, { "path": "../../rich-text" }, diff --git a/blocksuite/affine/inlines/mention/package.json b/blocksuite/affine/inlines/mention/package.json index 7012fec69..333460243 100644 --- a/blocksuite/affine/inlines/mention/package.json +++ b/blocksuite/affine/inlines/mention/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-shared": "workspace:*", "@blocksuite/global": "workspace:*", @@ -33,7 +34,8 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./view": "./src/view.ts" }, "files": [ "src", diff --git a/blocksuite/affine/inlines/mention/src/view.ts b/blocksuite/affine/inlines/mention/src/view.ts new file mode 100644 index 000000000..ba1bc825d --- /dev/null +++ b/blocksuite/affine/inlines/mention/src/view.ts @@ -0,0 +1,21 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { MentionInlineSpecExtension } from './inline-spec'; + +export class MentionViewExtension extends ViewExtensionProvider { + override name = 'affine-mention-inline'; + + override effect(): void { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext): void { + super.setup(context); + context.register(MentionInlineSpecExtension); + } +} diff --git a/blocksuite/affine/inlines/mention/tsconfig.json b/blocksuite/affine/inlines/mention/tsconfig.json index 76a74f340..d60ba97d5 100644 --- a/blocksuite/affine/inlines/mention/tsconfig.json +++ b/blocksuite/affine/inlines/mention/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../../model" }, { "path": "../../shared" }, { "path": "../../../framework/global" }, diff --git a/blocksuite/affine/inlines/preset/src/adapters/extensions.ts b/blocksuite/affine/inlines/preset/src/adapters/extensions.ts index 75d2ecaa2..e963ac49c 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/extensions.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/extensions.ts @@ -5,12 +5,10 @@ import { InlineDeltaToHtmlAdapterExtensions } from './html/inline-delta'; import { InlineDeltaToMarkdownAdapterExtensions } from './markdown/inline-delta'; import { MarkdownInlineToDeltaAdapterExtensions } from './markdown/markdown-inline'; import { NotionHtmlInlineToDeltaAdapterExtensions } from './notion-html/html-inline'; -import { InlineDeltaToPlainTextAdapterExtensions } from './plain-text/inline-delta'; export const InlineAdapterExtensions: ExtensionType[] = [ HtmlInlineToDeltaAdapterExtensions, InlineDeltaToHtmlAdapterExtensions, - InlineDeltaToPlainTextAdapterExtensions, NotionHtmlInlineToDeltaAdapterExtensions, InlineDeltaToMarkdownAdapterExtensions, MarkdownInlineToDeltaAdapterExtensions, @@ -21,4 +19,3 @@ export * from './html/inline-delta'; export * from './markdown/inline-delta'; export * from './markdown/markdown-inline'; export * from './notion-html/html-inline'; -export * from './plain-text/inline-delta'; 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 fc9b4e025..f65a09c23 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 { referenceDeltaToHtmlAdapterMatcher } from '@blocksuite/affine-inline-reference'; import type { InlineHtmlAST } from '@blocksuite/affine-shared/adapters'; import { InlineDeltaToHtmlAdapterExtension } from '@blocksuite/affine-shared/adapters'; import { ThemeProvider } from '@blocksuite/affine-shared/services'; @@ -152,5 +151,4 @@ export const InlineDeltaToHtmlAdapterExtensions = [ highlightBackgroundDeltaToHtmlAdapterMatcher, highlightColorDeltaToHtmlAdapterMatcher, inlineCodeDeltaToHtmlAdapterMatcher, - referenceDeltaToHtmlAdapterMatcher, ]; 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 ea65a42d0..0b672e9d3 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,3 @@ -import { latexDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-latex'; -import { referenceDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-reference'; import { InlineDeltaToMarkdownAdapterExtension } from '@blocksuite/affine-shared/adapters'; export const boldDeltaToMarkdownAdapterMatcher = @@ -52,10 +50,8 @@ export const inlineCodeDeltaToMarkdownAdapterMatcher = }); export const InlineDeltaToMarkdownAdapterExtensions = [ - referenceDeltaToMarkdownAdapterMatcher, inlineCodeDeltaToMarkdownAdapterMatcher, boldDeltaToMarkdownAdapterMatcher, italicDeltaToMarkdownAdapterMatcher, strikeDeltaToMarkdownAdapterMatcher, - latexDeltaToMarkdownAdapterMatcher, ]; 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 e0ec7a7ab..8192dfb79 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts @@ -1,4 +1,3 @@ -import { markdownInlineMathToDeltaMatcher } from '@blocksuite/affine-inline-latex'; import { MarkdownASTToDeltaExtension } from '@blocksuite/affine-shared/adapters'; export const markdownTextToDeltaMatcher = MarkdownASTToDeltaExtension({ @@ -94,7 +93,6 @@ export const MarkdownInlineToDeltaAdapterExtensions = [ markdownStrongToDeltaMatcher, markdownEmphasisToDeltaMatcher, markdownDeleteToDeltaMatcher, - markdownInlineMathToDeltaMatcher, markdownListToDeltaMatcher, markdownHtmlToDeltaMatcher, ]; 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 deleted file mode 100644 index 93bb0c74a..000000000 --- a/blocksuite/affine/inlines/preset/src/adapters/plain-text/inline-delta.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { latexDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-latex'; -import { referenceDeltaMarkdownAdapterMatch } from '@blocksuite/affine-inline-reference'; -import type { ExtensionType } from '@blocksuite/store'; - -export const InlineDeltaToPlainTextAdapterExtensions: ExtensionType[] = [ - referenceDeltaMarkdownAdapterMatch, - latexDeltaMarkdownAdapterMatch, -]; diff --git a/blocksuite/affine/inlines/preset/src/inline-spec.ts b/blocksuite/affine/inlines/preset/src/inline-spec.ts index 88c613af0..d586d4811 100644 --- a/blocksuite/affine/inlines/preset/src/inline-spec.ts +++ b/blocksuite/affine/inlines/preset/src/inline-spec.ts @@ -1,6 +1,3 @@ -import { inlineLatexExtensions } from '@blocksuite/affine-inline-latex'; -import { inlineMentionExtensions } from '@blocksuite/affine-inline-mention'; -import { inlineReferenceExtensions } from '@blocksuite/affine-inline-reference'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { type InlineRootElement, @@ -104,7 +101,4 @@ export const InlineSpecExtensions: ExtensionType[] = [ CodeInlineSpecExtension, BackgroundInlineSpecExtension, ColorInlineSpecExtension, - ...inlineReferenceExtensions, - ...inlineLatexExtensions, - ...inlineMentionExtensions, ]; diff --git a/blocksuite/affine/inlines/reference/package.json b/blocksuite/affine/inlines/reference/package.json index 1dd91ac68..3aedd5054 100644 --- a/blocksuite/affine/inlines/reference/package.json +++ b/blocksuite/affine/inlines/reference/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-shared": "workspace:*", "@blocksuite/global": "workspace:*", @@ -33,7 +34,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/reference/src/store.ts b/blocksuite/affine/inlines/reference/src/store.ts new file mode 100644 index 000000000..7b736a91c --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/store.ts @@ -0,0 +1,21 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { + referenceDeltaMarkdownAdapterMatch, + referenceDeltaToHtmlAdapterMatcher, + referenceDeltaToMarkdownAdapterMatcher, +} from './adapters'; + +export class ReferenceStoreExtension extends StoreExtensionProvider { + override name = 'affine-reference-inline'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(referenceDeltaToHtmlAdapterMatcher); + context.register(referenceDeltaToMarkdownAdapterMatcher); + context.register(referenceDeltaMarkdownAdapterMatch); + } +} diff --git a/blocksuite/affine/inlines/reference/src/view.ts b/blocksuite/affine/inlines/reference/src/view.ts new file mode 100644 index 000000000..5708a65ea --- /dev/null +++ b/blocksuite/affine/inlines/reference/src/view.ts @@ -0,0 +1,25 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { ReferenceInlineSpecExtension } from './inline-spec'; +import { RefNodeSlotsExtension } from './reference-node'; +import { referenceNodeToolbar } from './toolbar'; + +export class ReferenceViewExtension extends ViewExtensionProvider { + override name = 'affine-reference-inline'; + + override effect(): void { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register(referenceNodeToolbar); + context.register(ReferenceInlineSpecExtension); + context.register(RefNodeSlotsExtension); + } +} diff --git a/blocksuite/affine/inlines/reference/tsconfig.json b/blocksuite/affine/inlines/reference/tsconfig.json index 76a74f340..d60ba97d5 100644 --- a/blocksuite/affine/inlines/reference/tsconfig.json +++ b/blocksuite/affine/inlines/reference/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../../model" }, { "path": "../../shared" }, { "path": "../../../framework/global" }, diff --git a/blocksuite/integration-test/src/store.ts b/blocksuite/integration-test/src/store.ts index 8d5ccb8af..cef69c6e7 100644 --- a/blocksuite/integration-test/src/store.ts +++ b/blocksuite/integration-test/src/store.ts @@ -1,49 +1,7 @@ -import { AttachmentStoreExtension } from '@blocksuite/affine/blocks/attachment/store'; -import { BookmarkStoreExtension } from '@blocksuite/affine/blocks/bookmark/store'; -import { CalloutStoreExtension } from '@blocksuite/affine/blocks/callout/store'; -import { CodeStoreExtension } from '@blocksuite/affine/blocks/code/store'; -import { DataViewStoreExtension } from '@blocksuite/affine/blocks/data-view/store'; -import { DatabaseStoreExtension } from '@blocksuite/affine/blocks/database/store'; -import { DividerStoreExtension } from '@blocksuite/affine/blocks/divider/store'; -import { EdgelessTextStoreExtension } from '@blocksuite/affine/blocks/edgeless-text/store'; -import { EmbedStoreExtension } from '@blocksuite/affine/blocks/embed/store'; -import { FrameStoreExtension } from '@blocksuite/affine/blocks/frame/store'; -import { ImageStoreExtension } from '@blocksuite/affine/blocks/image/store'; -import { LatexStoreExtension } from '@blocksuite/affine/blocks/latex/store'; -import { ListStoreExtension } from '@blocksuite/affine/blocks/list/store'; -import { NoteStoreExtension } from '@blocksuite/affine/blocks/note/store'; -import { ParagraphStoreExtension } from '@blocksuite/affine/blocks/paragraph/store'; -import { SurfaceRefStoreExtension } from '@blocksuite/affine/blocks/surface-ref/store'; -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'; +import { getInternalStoreExtensions } from '@blocksuite/affine/extensions/store'; -const manager = new StoreExtensionManager([ - AttachmentStoreExtension, - BookmarkStoreExtension, - CalloutStoreExtension, - CodeStoreExtension, - DataViewStoreExtension, - DatabaseStoreExtension, - DividerStoreExtension, - EdgelessTextStoreExtension, - EmbedStoreExtension, - FrameStoreExtension, - ImageStoreExtension, - LatexStoreExtension, - ListStoreExtension, - NoteStoreExtension, - ParagraphStoreExtension, - SurfaceRefStoreExtension, - TableStoreExtension, - - FootnoteStoreExtension, - LinkStoreExtension, - - MigratingStoreExtension, -]); +const manager = new StoreExtensionManager(getInternalStoreExtensions()); export function getTestStoreManager() { return manager; diff --git a/blocksuite/integration-test/src/view.ts b/blocksuite/integration-test/src/view.ts index ad8fc8d05..395550eea 100644 --- a/blocksuite/integration-test/src/view.ts +++ b/blocksuite/integration-test/src/view.ts @@ -1,51 +1,8 @@ -import { AttachmentViewExtension } from '@blocksuite/affine/blocks/attachment/view'; -import { BookmarkViewExtension } from '@blocksuite/affine/blocks/bookmark/view'; -import { CalloutViewExtension } from '@blocksuite/affine/blocks/callout/view'; -import { CodeBlockViewExtension } from '@blocksuite/affine/blocks/code/view'; -import { DataViewViewExtension } from '@blocksuite/affine/blocks/data-view/view'; -import { DatabaseViewExtension } from '@blocksuite/affine/blocks/database/view'; -import { DividerViewExtension } from '@blocksuite/affine/blocks/divider/view'; -import { EdgelessTextViewExtension } from '@blocksuite/affine/blocks/edgeless-text/view'; -import { EmbedViewExtension } from '@blocksuite/affine/blocks/embed/view'; -import { FrameViewExtension } from '@blocksuite/affine/blocks/frame/view'; -import { ImageViewExtension } from '@blocksuite/affine/blocks/image/view'; -import { LatexViewExtension } from '@blocksuite/affine/blocks/latex/view'; -import { ListViewExtension } from '@blocksuite/affine/blocks/list/view'; -import { NoteViewExtension } from '@blocksuite/affine/blocks/note/view'; -import { ParagraphViewExtension } from '@blocksuite/affine/blocks/paragraph/view'; -import { SurfaceRefViewExtension } from '@blocksuite/affine/blocks/surface-ref/view'; -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'; +import { getInternalViewExtensions } from '@blocksuite/affine/extensions/view'; + +const manager = new ViewExtensionManager(getInternalViewExtensions()); export function getTestViewManager() { - const manager = new ViewExtensionManager([ - MigratingViewExtension, - - // Block - AttachmentViewExtension, - BookmarkViewExtension, - CalloutViewExtension, - CodeBlockViewExtension, - DataViewViewExtension, - DatabaseViewExtension, - DividerViewExtension, - EdgelessTextViewExtension, - EmbedViewExtension, - FrameViewExtension, - ImageViewExtension, - LatexViewExtension, - ListViewExtension, - NoteViewExtension, - ParagraphViewExtension, - SurfaceRefViewExtension, - TableViewExtension, - - // Inline - FootnoteViewExtension, - LinkViewExtension, - ]); return manager; } diff --git a/packages/common/nbstore/src/sync/indexer/bs-store.ts b/packages/common/nbstore/src/sync/indexer/bs-store.ts new file mode 100644 index 000000000..7c11a17c0 --- /dev/null +++ b/packages/common/nbstore/src/sync/indexer/bs-store.ts @@ -0,0 +1,8 @@ +import { StoreExtensionManager } from '@blocksuite/affine/ext-loader'; +import { getInternalStoreExtensions } from '@blocksuite/affine/extensions/store'; + +const manager = new StoreExtensionManager(getInternalStoreExtensions()); + +export function getStoreManager() { + return manager; +} diff --git a/packages/common/nbstore/src/sync/indexer/crawler.ts b/packages/common/nbstore/src/sync/indexer/crawler.ts index 776fca5bb..13c6a4e41 100644 --- a/packages/common/nbstore/src/sync/indexer/crawler.ts +++ b/packages/common/nbstore/src/sync/indexer/crawler.ts @@ -1,4 +1,3 @@ -import { getMarkdownAdapterExtensions } from '@blocksuite/affine/adapters'; import { Container } from '@blocksuite/affine/global/di'; import type { AttachmentBlockModel, @@ -28,6 +27,7 @@ import { } from 'yjs'; import { IndexerDocument } from '../../storage'; +import { getStoreManager } from './bs-store'; const blocksuiteSchema = new Schema(); blocksuiteSchema.register([...AffineSchemas]); @@ -119,9 +119,11 @@ function generateMarkdownPreviewBuilder( }; const container = new Container(); - getMarkdownAdapterExtensions().forEach(ext => { - ext.setup(container); - }); + getStoreManager() + .get('store') + .forEach(ext => { + ext.setup(container); + }); const provider = container.provider(); const markdownAdapter = new MarkdownAdapter( diff --git a/packages/frontend/apps/android/src/app.tsx b/packages/frontend/apps/android/src/app.tsx index 39efbd20f..ba58cd274 100644 --- a/packages/frontend/apps/android/src/app.tsx +++ b/packages/frontend/apps/android/src/app.tsx @@ -1,3 +1,4 @@ +import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store'; import { AffineContext } from '@affine/core/components/context'; import { AppFallback } from '@affine/core/mobile/components/app-fallback'; import { configureMobileModules } from '@affine/core/mobile/modules'; @@ -30,7 +31,6 @@ import { configureBrowserWorkspaceFlavours } from '@affine/core/modules/workspac import { getWorkerUrl } from '@affine/env/worker'; import { I18n } from '@affine/i18n'; import { StoreManagerClient } from '@affine/nbstore/worker/client'; -import { getMarkdownAdapterExtensions } from '@blocksuite/affine/adapters'; import { Container } from '@blocksuite/affine/global/di'; import { docLinkBaseURLMiddleware, @@ -251,9 +251,11 @@ framework.scope(ServerScope).override(AuthProvider, resolver => { const snapshot = transformer.docToSnapshot(blockSuiteDoc); const container = new Container(); - getMarkdownAdapterExtensions().forEach(ext => { - ext.setup(container); - }); + getStoreManager() + .get('store') + .forEach(ext => { + ext.setup(container); + }); const provider = container.provider(); const adapter = new MarkdownAdapter(transformer, provider); diff --git a/packages/frontend/apps/ios/src/app.tsx b/packages/frontend/apps/ios/src/app.tsx index f680d1229..85e5388e4 100644 --- a/packages/frontend/apps/ios/src/app.tsx +++ b/packages/frontend/apps/ios/src/app.tsx @@ -39,7 +39,6 @@ import { configureBrowserWorkspaceFlavours } from '@affine/core/modules/workspac import { getWorkerUrl } from '@affine/env/worker'; import { I18n } from '@affine/i18n'; import { StoreManagerClient } from '@affine/nbstore/worker/client'; -import { getMarkdownAdapterExtensions } from '@blocksuite/affine/adapters'; import { Container } from '@blocksuite/affine/global/di'; import { docLinkBaseURLMiddleware, @@ -263,9 +262,11 @@ const frameworkProvider = framework.provider(); const snapshot = transformer.docToSnapshot(blockSuiteDoc); const container = new Container(); - getMarkdownAdapterExtensions().forEach(ext => { - ext.setup(container); - }); + getStoreManager() + .get('store') + .forEach(ext => { + ext.setup(container); + }); const provider = container.provider(); const adapter = new MarkdownAdapter(transformer, provider); diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts index f80e4f334..103c4d4c1 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts @@ -1,5 +1,4 @@ import { createReactComponentFromLit } from '@affine/component'; -import { getMarkdownAdapterExtensions } from '@blocksuite/affine/adapters'; import { defaultImageProxyMiddleware, ImageProxyService, @@ -36,6 +35,7 @@ import { keyed } from 'lit/directives/keyed.js'; import { literal } from 'lit/static-html.js'; import React from 'react'; +import { getStoreManager } from '../../manager/migrating-store'; import { getViewManager } from '../../manager/migrating-view'; import { markDownToDoc } from '../../utils'; import type { @@ -231,9 +231,11 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { provider = this.host.std.store.provider; } else { const container = new Container(); - getMarkdownAdapterExtensions().forEach(ext => { - ext.setup(container); - }); + getStoreManager() + .get('store') + .forEach(ext => { + ext.setup(container); + }); provider = container.provider(); } diff --git a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts index 55b057b96..e609b7349 100644 --- a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts +++ b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/__tests__/mindmap-preview.unit.spec.ts @@ -1,4 +1,4 @@ -import { getMarkdownAdapterExtensions } from '@blocksuite/affine/adapters'; +import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store.js'; import { Container } from '@blocksuite/affine/global/di'; import { TestWorkspace } from '@blocksuite/affine/store/test'; import { describe, expect, test } from 'vitest'; @@ -6,9 +6,11 @@ import { describe, expect, test } from 'vitest'; import { markdownToMindmap } from '../mindmap-preview.js'; const container = new Container(); -getMarkdownAdapterExtensions().forEach(ext => { - ext.setup(container); -}); +getStoreManager() + .get('store') + .forEach(ext => { + ext.setup(container); + }); const provider = container.provider(); describe('markdownToMindmap: convert markdown list to a mind map tree', () => { diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts index ddaee1366..f193b95db 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts @@ -1,28 +1,9 @@ -import { AttachmentStoreExtension } from '@blocksuite/affine/blocks/attachment/store'; -import { BookmarkStoreExtension } from '@blocksuite/affine/blocks/bookmark/store'; -import { CalloutStoreExtension } from '@blocksuite/affine/blocks/callout/store'; -import { CodeStoreExtension } from '@blocksuite/affine/blocks/code/store'; -import { DataViewStoreExtension } from '@blocksuite/affine/blocks/data-view/store'; -import { DatabaseStoreExtension } from '@blocksuite/affine/blocks/database/store'; -import { DividerStoreExtension } from '@blocksuite/affine/blocks/divider/store'; -import { EdgelessTextStoreExtension } from '@blocksuite/affine/blocks/edgeless-text/store'; -import { EmbedStoreExtension } from '@blocksuite/affine/blocks/embed/store'; -import { FrameStoreExtension } from '@blocksuite/affine/blocks/frame/store'; -import { ImageStoreExtension } from '@blocksuite/affine/blocks/image/store'; -import { LatexStoreExtension } from '@blocksuite/affine/blocks/latex/store'; -import { ListStoreExtension } from '@blocksuite/affine/blocks/list/store'; -import { NoteStoreExtension } from '@blocksuite/affine/blocks/note/store'; -import { ParagraphStoreExtension } from '@blocksuite/affine/blocks/paragraph/store'; -import { SurfaceRefStoreExtension } from '@blocksuite/affine/blocks/surface-ref/store'; -import { TableStoreExtension } from '@blocksuite/affine/blocks/table/store'; import { type StoreExtensionContext, StoreExtensionManager, StoreExtensionProvider, } 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 { getInternalStoreExtensions } from '@blocksuite/affine/extensions/store'; import { AIChatBlockSchemaExtension } from '../ai/blocks/ai-chat-block/model'; @@ -36,29 +17,7 @@ class MigratingAffineStoreExtension extends StoreExtensionProvider { } const manager = new StoreExtensionManager([ - // Block - AttachmentStoreExtension, - BookmarkStoreExtension, - CalloutStoreExtension, - CodeStoreExtension, - DataViewStoreExtension, - DatabaseStoreExtension, - DividerStoreExtension, - EdgelessTextStoreExtension, - EmbedStoreExtension, - FrameStoreExtension, - ImageStoreExtension, - LatexStoreExtension, - ListStoreExtension, - NoteStoreExtension, - ParagraphStoreExtension, - SurfaceRefStoreExtension, - TableStoreExtension, - // Inline - FootnoteStoreExtension, - LinkStoreExtension, - - MigratingStoreExtension, + ...getInternalStoreExtensions(), MigratingAffineStoreExtension, ]); diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts index d08c5e30a..3b7a0838c 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts @@ -1,30 +1,11 @@ import { PeekViewService } from '@affine/core/modules/peek-view'; -import { AttachmentViewExtension } from '@blocksuite/affine/blocks/attachment/view'; -import { BookmarkViewExtension } from '@blocksuite/affine/blocks/bookmark/view'; -import { CalloutViewExtension } from '@blocksuite/affine/blocks/callout/view'; -import { CodeBlockViewExtension } from '@blocksuite/affine/blocks/code/view'; -import { DataViewViewExtension } from '@blocksuite/affine/blocks/data-view/view'; -import { DatabaseViewExtension } from '@blocksuite/affine/blocks/database/view'; -import { DividerViewExtension } from '@blocksuite/affine/blocks/divider/view'; -import { EdgelessTextViewExtension } from '@blocksuite/affine/blocks/edgeless-text/view'; -import { EmbedViewExtension } from '@blocksuite/affine/blocks/embed/view'; -import { FrameViewExtension } from '@blocksuite/affine/blocks/frame/view'; -import { ImageViewExtension } from '@blocksuite/affine/blocks/image/view'; -import { LatexViewExtension } from '@blocksuite/affine/blocks/latex/view'; -import { ListViewExtension } from '@blocksuite/affine/blocks/list/view'; -import { NoteViewExtension } from '@blocksuite/affine/blocks/note/view'; import { ParagraphBlockConfigExtension } from '@blocksuite/affine/blocks/paragraph'; -import { ParagraphViewExtension } from '@blocksuite/affine/blocks/paragraph/view'; -import { SurfaceRefViewExtension } from '@blocksuite/affine/blocks/surface-ref/view'; -import { TableViewExtension } from '@blocksuite/affine/blocks/table/view'; import { type ViewExtensionContext, ViewExtensionManager, ViewExtensionProvider, } 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 { getInternalViewExtensions } from '@blocksuite/affine/extensions/view'; import { ToolbarModuleExtension } from '@blocksuite/affine/shared/services'; import { BlockFlavourIdentifier } from '@blocksuite/affine/std'; import { FrameworkProvider } from '@toeverything/infra'; @@ -147,29 +128,7 @@ class MigratingAffineViewExtension extends ViewExtensionProvider< } const manager = new ViewExtensionManager([ - MigratingViewExtension, - - // Block - AttachmentViewExtension, - BookmarkViewExtension, - CalloutViewExtension, - CodeBlockViewExtension, - DataViewViewExtension, - DatabaseViewExtension, - DividerViewExtension, - EdgelessTextViewExtension, - EmbedViewExtension, - FrameViewExtension, - ImageViewExtension, - LatexViewExtension, - ListViewExtension, - NoteViewExtension, - ParagraphViewExtension, - SurfaceRefViewExtension, - TableViewExtension, - // Inline - FootnoteViewExtension, - LinkViewExtension, + ...getInternalViewExtensions(), MigratingAffineViewExtension, ]); diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 6da97709b..e957afe87 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -652,6 +652,7 @@ export const PackageList = [ name: '@blocksuite/affine-inline-latex', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/inlines/reference', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', @@ -680,6 +681,7 @@ export const PackageList = [ name: '@blocksuite/affine-inline-mention', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/model', 'blocksuite/affine/shared', 'blocksuite/framework/global', @@ -710,6 +712,7 @@ export const PackageList = [ name: '@blocksuite/affine-inline-reference', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/model', 'blocksuite/affine/shared', 'blocksuite/framework/global', diff --git a/yarn.lock b/yarn.lock index 777b6ba98..d016f774d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3355,6 +3355,7 @@ __metadata: resolution: "@blocksuite/affine-inline-latex@workspace:blocksuite/affine/inlines/latex" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" @@ -3418,6 +3419,7 @@ __metadata: resolution: "@blocksuite/affine-inline-mention@workspace:blocksuite/affine/inlines/mention" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*" "@blocksuite/global": "workspace:*" @@ -3484,6 +3486,7 @@ __metadata: resolution: "@blocksuite/affine-inline-reference@workspace:blocksuite/affine/inlines/reference" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*" "@blocksuite/global": "workspace:*"