From 2510e7a9a418d3369992c8e887a491a1f4652b28 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Wed, 23 Apr 2025 01:40:49 +0000 Subject: [PATCH] feat(editor): inline footnote extension (#11908) Closes: BS-3219 --- blocksuite/affine/all/package.json | 4 +++- .../affine/all/src/__tests__/utils/store.ts | 3 +++ .../affine/all/src/extensions/common.ts | 2 ++ .../affine/all/src/extensions/effects.ts | 2 -- .../{footnote.ts => footnote/index.ts} | 0 .../affine/all/src/inlines/footnote/store.ts | 1 + .../affine/all/src/inlines/footnote/view.ts | 1 + .../affine/inlines/footnote/package.json | 5 ++++- .../affine/inlines/footnote/src/store.ts | 19 +++++++++++++++++ .../affine/inlines/footnote/src/view.ts | 21 +++++++++++++++++++ .../affine/inlines/footnote/tsconfig.json | 1 + .../src/adapters/markdown/inline-delta.ts | 2 -- .../src/adapters/markdown/markdown-inline.ts | 2 -- .../affine/inlines/preset/src/inline-spec.ts | 2 -- blocksuite/integration-test/src/store.ts | 3 +++ blocksuite/integration-test/src/view.ts | 5 +++++ .../src/blocksuite/manager/migrating-store.ts | 4 ++++ .../src/blocksuite/manager/migrating-view.ts | 4 ++++ tools/utils/src/workspace.gen.ts | 1 + yarn.lock | 1 + 20 files changed, 73 insertions(+), 10 deletions(-) rename blocksuite/affine/all/src/inlines/{footnote.ts => footnote/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/inlines/footnote/store.ts create mode 100644 blocksuite/affine/all/src/inlines/footnote/view.ts create mode 100644 blocksuite/affine/inlines/footnote/src/store.ts create mode 100644 blocksuite/affine/inlines/footnote/src/view.ts diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index f900a2903d..52549ad762 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -146,7 +146,9 @@ "./inlines/link": "./src/inlines/link.ts", "./inlines/reference": "./src/inlines/reference.ts", "./inlines/preset": "./src/inlines/preset.ts", - "./inlines/footnote": "./src/inlines/footnote.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", "./widgets/drag-handle": "./src/widgets/drag-handle.ts", diff --git a/blocksuite/affine/all/src/__tests__/utils/store.ts b/blocksuite/affine/all/src/__tests__/utils/store.ts index ce218b5b76..ed1bad8708 100644 --- a/blocksuite/affine/all/src/__tests__/utils/store.ts +++ b/blocksuite/affine/all/src/__tests__/utils/store.ts @@ -16,6 +16,7 @@ import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/stor 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 { MigratingStoreExtension } from '../../extensions/store'; @@ -38,6 +39,8 @@ const manager = new StoreExtensionManager([ SurfaceRefStoreExtension, TableStoreExtension, + FootnoteStoreExtension, + MigratingStoreExtension, ]); diff --git a/blocksuite/affine/all/src/extensions/common.ts b/blocksuite/affine/all/src/extensions/common.ts index 2d6648bf43..1284d9b7c9 100644 --- a/blocksuite/affine/all/src/extensions/common.ts +++ b/blocksuite/affine/all/src/extensions/common.ts @@ -51,6 +51,7 @@ import { textToMarkdownAdapterMatcher, textToPlainTextAdapterMatcher, } from '@blocksuite/affine-gfx-text'; +import { FootNoteInlineSpecExtension } from '@blocksuite/affine-inline-footnote'; import { inlinePresetExtensions } from '@blocksuite/affine-inline-preset'; import { DefaultOpenDocExtension, @@ -79,6 +80,7 @@ const elementToMarkdownAdapterMatchers = [ ]; export const CommonBlockSpecs: ExtensionType[] = [ + FootNoteInlineSpecExtension, inlinePresetExtensions, DocDisplayMetaService, EditPropsStore, diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts index f0b4b41a7c..ae33a9dca5 100644 --- a/blocksuite/affine/all/src/extensions/effects.ts +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -29,7 +29,6 @@ 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 inlineFootnoteEffects } from '@blocksuite/affine-inline-footnote/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'; @@ -55,7 +54,6 @@ export function effects() { inlineReferenceEffects(); inlinePresetEffects(); inlineLinkEffects(); - inlineFootnoteEffects(); inlineLatexEffects(); inlineMentionEffects(); diff --git a/blocksuite/affine/all/src/inlines/footnote.ts b/blocksuite/affine/all/src/inlines/footnote/index.ts similarity index 100% rename from blocksuite/affine/all/src/inlines/footnote.ts rename to blocksuite/affine/all/src/inlines/footnote/index.ts diff --git a/blocksuite/affine/all/src/inlines/footnote/store.ts b/blocksuite/affine/all/src/inlines/footnote/store.ts new file mode 100644 index 0000000000..72dfab59e5 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/footnote/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-footnote/store'; diff --git a/blocksuite/affine/all/src/inlines/footnote/view.ts b/blocksuite/affine/all/src/inlines/footnote/view.ts new file mode 100644 index 0000000000..d7293d29d5 --- /dev/null +++ b/blocksuite/affine/all/src/inlines/footnote/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-inline-footnote/view'; diff --git a/blocksuite/affine/inlines/footnote/package.json b/blocksuite/affine/inlines/footnote/package.json index 916b3009f1..1e08876ff0 100644 --- a/blocksuite/affine/inlines/footnote/package.json +++ b/blocksuite/affine/inlines/footnote/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", + "./view": "./src/view.ts", + "./store": "./src/store.ts" }, "files": [ "src", diff --git a/blocksuite/affine/inlines/footnote/src/store.ts b/blocksuite/affine/inlines/footnote/src/store.ts new file mode 100644 index 0000000000..2826f2f7be --- /dev/null +++ b/blocksuite/affine/inlines/footnote/src/store.ts @@ -0,0 +1,19 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { + footnoteReferenceDeltaToMarkdownAdapterMatcher, + markdownFootnoteReferenceToDeltaMatcher, +} from './adapters'; + +export class FootnoteStoreExtension extends StoreExtensionProvider { + override name = 'affine-footnote-inline'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(markdownFootnoteReferenceToDeltaMatcher); + context.register(footnoteReferenceDeltaToMarkdownAdapterMatcher); + } +} diff --git a/blocksuite/affine/inlines/footnote/src/view.ts b/blocksuite/affine/inlines/footnote/src/view.ts new file mode 100644 index 0000000000..12ab45ba9b --- /dev/null +++ b/blocksuite/affine/inlines/footnote/src/view.ts @@ -0,0 +1,21 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { FootNoteInlineSpecExtension } from './inline-spec'; + +export class FootnoteViewExtension extends ViewExtensionProvider { + override name = 'affine-footnote-inline'; + + override effect(): void { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register(FootNoteInlineSpecExtension); + } +} diff --git a/blocksuite/affine/inlines/footnote/tsconfig.json b/blocksuite/affine/inlines/footnote/tsconfig.json index 3718e88b07..2aa5c154f4 100644 --- a/blocksuite/affine/inlines/footnote/tsconfig.json +++ b/blocksuite/affine/inlines/footnote/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/markdown/inline-delta.ts b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts index 4da24dabd1..cdcc5f0c9e 100644 --- a/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts +++ b/blocksuite/affine/inlines/preset/src/adapters/markdown/inline-delta.ts @@ -1,4 +1,3 @@ -import { footnoteReferenceDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-footnote'; import { latexDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-latex'; import { linkDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-link'; import { referenceDeltaToMarkdownAdapterMatcher } from '@blocksuite/affine-inline-reference'; @@ -61,5 +60,4 @@ export const InlineDeltaToMarkdownAdapterExtensions = [ italicDeltaToMarkdownAdapterMatcher, strikeDeltaToMarkdownAdapterMatcher, latexDeltaToMarkdownAdapterMatcher, - footnoteReferenceDeltaToMarkdownAdapterMatcher, ]; 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 6385f1a0c6..9c1674b638 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 { markdownFootnoteReferenceToDeltaMatcher } from '@blocksuite/affine-inline-footnote'; import { markdownInlineMathToDeltaMatcher } from '@blocksuite/affine-inline-latex'; import { markdownLinkToDeltaMatcher } from '@blocksuite/affine-inline-link'; import { MarkdownASTToDeltaExtension } from '@blocksuite/affine-shared/adapters'; @@ -99,6 +98,5 @@ export const MarkdownInlineToDeltaAdapterExtensions = [ markdownLinkToDeltaMatcher, markdownInlineMathToDeltaMatcher, markdownListToDeltaMatcher, - markdownFootnoteReferenceToDeltaMatcher, markdownHtmlToDeltaMatcher, ]; diff --git a/blocksuite/affine/inlines/preset/src/inline-spec.ts b/blocksuite/affine/inlines/preset/src/inline-spec.ts index 652f7e4e54..bb27129993 100644 --- a/blocksuite/affine/inlines/preset/src/inline-spec.ts +++ b/blocksuite/affine/inlines/preset/src/inline-spec.ts @@ -1,4 +1,3 @@ -import { inlineFootnoteExtensions } from '@blocksuite/affine-inline-footnote'; import { inlineLatexExtensions } from '@blocksuite/affine-inline-latex'; import { inlineLinkExtensions } from '@blocksuite/affine-inline-link'; import { inlineMentionExtensions } from '@blocksuite/affine-inline-mention'; @@ -109,6 +108,5 @@ export const InlineSpecExtensions: ExtensionType[] = [ ...inlineLinkExtensions, ...inlineReferenceExtensions, ...inlineLatexExtensions, - ...inlineFootnoteExtensions, ...inlineMentionExtensions, ]; diff --git a/blocksuite/integration-test/src/store.ts b/blocksuite/integration-test/src/store.ts index 632373e77d..3f472a032e 100644 --- a/blocksuite/integration-test/src/store.ts +++ b/blocksuite/integration-test/src/store.ts @@ -17,6 +17,7 @@ import { SurfaceRefStoreExtension } from '@blocksuite/affine/blocks/surface-ref/ 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'; const manager = new StoreExtensionManager([ AttachmentStoreExtension, @@ -37,6 +38,8 @@ const manager = new StoreExtensionManager([ SurfaceRefStoreExtension, TableStoreExtension, + FootnoteStoreExtension, + MigratingStoreExtension, ]); diff --git a/blocksuite/integration-test/src/view.ts b/blocksuite/integration-test/src/view.ts index f85261837f..39234fa035 100644 --- a/blocksuite/integration-test/src/view.ts +++ b/blocksuite/integration-test/src/view.ts @@ -17,11 +17,13 @@ import { SurfaceRefViewExtension } from '@blocksuite/affine/blocks/surface-ref/v 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'; export function getTestViewManager() { const manager = new ViewExtensionManager([ MigratingViewExtension, + // Block AttachmentViewExtension, BookmarkViewExtension, CalloutViewExtension, @@ -39,6 +41,9 @@ export function getTestViewManager() { ParagraphViewExtension, SurfaceRefViewExtension, TableViewExtension, + + // Inline + FootnoteViewExtension, ]); 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 71e5974c85..2da233c1a8 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts @@ -21,6 +21,7 @@ import { StoreExtensionProvider, } from '@blocksuite/affine/ext-loader'; import { MigratingStoreExtension } from '@blocksuite/affine/extensions/store'; +import { FootnoteStoreExtension } from '@blocksuite/affine/inlines/footnote/store'; import { AIChatBlockSchemaExtension } from '../ai/blocks/ai-chat-block/model'; @@ -34,6 +35,7 @@ class MigratingAffineStoreExtension extends StoreExtensionProvider { } const manager = new StoreExtensionManager([ + // Block AttachmentStoreExtension, BookmarkStoreExtension, CalloutStoreExtension, @@ -51,6 +53,8 @@ const manager = new StoreExtensionManager([ ParagraphStoreExtension, SurfaceRefStoreExtension, TableStoreExtension, + // Inline + FootnoteStoreExtension, 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 a62f65065e..31606eafd4 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts @@ -23,6 +23,7 @@ import { ViewExtensionProvider, } from '@blocksuite/affine/ext-loader'; import { MigratingViewExtension } from '@blocksuite/affine/extensions/view'; +import { FootnoteViewExtension } from '@blocksuite/affine/inlines/footnote/view'; import { ToolbarModuleExtension } from '@blocksuite/affine/shared/services'; import { BlockFlavourIdentifier } from '@blocksuite/affine/std'; import { FrameworkProvider } from '@toeverything/infra'; @@ -147,6 +148,7 @@ class MigratingAffineViewExtension extends ViewExtensionProvider< const manager = new ViewExtensionManager([ MigratingViewExtension, + // Block AttachmentViewExtension, BookmarkViewExtension, CalloutViewExtension, @@ -164,6 +166,8 @@ const manager = new ViewExtensionManager([ ParagraphViewExtension, SurfaceRefViewExtension, TableViewExtension, + // Inline + FootnoteViewExtension, MigratingAffineViewExtension, ]); diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 9adfe490de..219770e15a 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -638,6 +638,7 @@ export const PackageList = [ name: '@blocksuite/affine-inline-footnote', 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 c9db47d2a7..63664b1e44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3325,6 +3325,7 @@ __metadata: resolution: "@blocksuite/affine-inline-footnote@workspace:blocksuite/affine/inlines/footnote" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*"