From 7c79b1f0247475eeb934784c32b34c341dfb4ce5 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Mon, 21 Apr 2025 10:29:31 +0000 Subject: [PATCH] feat(editor): latex and list extensions (#11851) Closes: BS-3198 Closes: BS-3199 --- blocksuite/affine/all/package.json | 8 +++++-- .../src/blocks/{latex.ts => latex/index.ts} | 0 .../affine/all/src/blocks/latex/store.ts | 1 + .../affine/all/src/blocks/latex/view.ts | 1 + .../all/src/blocks/{list.ts => list/index.ts} | 0 .../affine/all/src/blocks/list/store.ts | 1 + blocksuite/affine/all/src/blocks/list/view.ts | 1 + blocksuite/affine/blocks/frame/src/store.ts | 2 +- blocksuite/affine/blocks/frame/src/view.ts | 2 +- blocksuite/affine/blocks/image/src/store.ts | 2 +- blocksuite/affine/blocks/image/src/view.ts | 2 +- blocksuite/affine/blocks/latex/package.json | 5 ++++- blocksuite/affine/blocks/latex/src/store.ts | 17 ++++++++++++++ blocksuite/affine/blocks/latex/src/view.ts | 21 ++++++++++++++++++ blocksuite/affine/blocks/latex/tsconfig.json | 1 + blocksuite/affine/blocks/list/package.json | 5 ++++- blocksuite/affine/blocks/list/src/store.ts | 17 ++++++++++++++ blocksuite/affine/blocks/list/src/view.ts | 22 +++++++++++++++++++ blocksuite/affine/blocks/list/tsconfig.json | 1 + .../core/src/blocksuite/manager/store.ts | 4 ++++ .../core/src/blocksuite/manager/view.ts | 4 ++++ tools/utils/src/workspace.gen.ts | 2 ++ yarn.lock | 2 ++ 23 files changed, 113 insertions(+), 8 deletions(-) rename blocksuite/affine/all/src/blocks/{latex.ts => latex/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/blocks/latex/store.ts create mode 100644 blocksuite/affine/all/src/blocks/latex/view.ts rename blocksuite/affine/all/src/blocks/{list.ts => list/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/blocks/list/store.ts create mode 100644 blocksuite/affine/all/src/blocks/list/view.ts create mode 100644 blocksuite/affine/blocks/latex/src/store.ts create mode 100644 blocksuite/affine/blocks/latex/src/view.ts create mode 100644 blocksuite/affine/blocks/list/src/store.ts create mode 100644 blocksuite/affine/blocks/list/src/view.ts diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index 5a186099e8..b9e36418fe 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -121,8 +121,12 @@ "./blocks/image": "./src/blocks/image/index.ts", "./blocks/image/store": "./src/blocks/image/store.ts", "./blocks/image/view": "./src/blocks/image/view.ts", - "./blocks/latex": "./src/blocks/latex.ts", - "./blocks/list": "./src/blocks/list.ts", + "./blocks/latex": "./src/blocks/latex/index.ts", + "./blocks/latex/store": "./src/blocks/latex/store.ts", + "./blocks/latex/view": "./src/blocks/latex/view.ts", + "./blocks/list": "./src/blocks/list/index.ts", + "./blocks/list/store": "./src/blocks/list/store.ts", + "./blocks/list/view": "./src/blocks/list/view.ts", "./blocks/note": "./src/blocks/note.ts", "./blocks/paragraph": "./src/blocks/paragraph.ts", "./blocks/root": "./src/blocks/root.ts", diff --git a/blocksuite/affine/all/src/blocks/latex.ts b/blocksuite/affine/all/src/blocks/latex/index.ts similarity index 100% rename from blocksuite/affine/all/src/blocks/latex.ts rename to blocksuite/affine/all/src/blocks/latex/index.ts diff --git a/blocksuite/affine/all/src/blocks/latex/store.ts b/blocksuite/affine/all/src/blocks/latex/store.ts new file mode 100644 index 0000000000..75ce50788d --- /dev/null +++ b/blocksuite/affine/all/src/blocks/latex/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-latex/store'; diff --git a/blocksuite/affine/all/src/blocks/latex/view.ts b/blocksuite/affine/all/src/blocks/latex/view.ts new file mode 100644 index 0000000000..83efca7079 --- /dev/null +++ b/blocksuite/affine/all/src/blocks/latex/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-latex/view'; diff --git a/blocksuite/affine/all/src/blocks/list.ts b/blocksuite/affine/all/src/blocks/list/index.ts similarity index 100% rename from blocksuite/affine/all/src/blocks/list.ts rename to blocksuite/affine/all/src/blocks/list/index.ts diff --git a/blocksuite/affine/all/src/blocks/list/store.ts b/blocksuite/affine/all/src/blocks/list/store.ts new file mode 100644 index 0000000000..f0a792c5c9 --- /dev/null +++ b/blocksuite/affine/all/src/blocks/list/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-list/store'; diff --git a/blocksuite/affine/all/src/blocks/list/view.ts b/blocksuite/affine/all/src/blocks/list/view.ts new file mode 100644 index 0000000000..7c326913dd --- /dev/null +++ b/blocksuite/affine/all/src/blocks/list/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-list/view'; diff --git a/blocksuite/affine/blocks/frame/src/store.ts b/blocksuite/affine/blocks/frame/src/store.ts index 000778bd4e..1c1e19b3eb 100644 --- a/blocksuite/affine/blocks/frame/src/store.ts +++ b/blocksuite/affine/blocks/frame/src/store.ts @@ -5,7 +5,7 @@ import { import { FrameBlockSchemaExtension } from '@blocksuite/affine-model'; export class FrameStoreExtension extends StoreExtensionProvider { - override name = 'affine-frame'; + override name = 'affine-frame-block'; override setup(context: StoreExtensionContext) { super.setup(context); diff --git a/blocksuite/affine/blocks/frame/src/view.ts b/blocksuite/affine/blocks/frame/src/view.ts index 448754216f..3abedcf933 100644 --- a/blocksuite/affine/blocks/frame/src/view.ts +++ b/blocksuite/affine/blocks/frame/src/view.ts @@ -7,7 +7,7 @@ import { effects } from './effects'; import { FrameBlockSpec } from './frame-spec'; export class FrameViewExtension extends ViewExtensionProvider { - override name = 'affine-frame'; + override name = 'affine-frame-block'; override effect(): void { super.effect(); diff --git a/blocksuite/affine/blocks/image/src/store.ts b/blocksuite/affine/blocks/image/src/store.ts index 6456bea0cb..d1e07dd3f8 100644 --- a/blocksuite/affine/blocks/image/src/store.ts +++ b/blocksuite/affine/blocks/image/src/store.ts @@ -14,7 +14,7 @@ const ImageStoreExtensionOptionsSchema = z.object({ }); export class ImageStoreExtension extends StoreExtensionProvider { - override name = 'affine-image'; + override name = 'affine-image-block'; override schema = ImageStoreExtensionOptionsSchema; diff --git a/blocksuite/affine/blocks/image/src/view.ts b/blocksuite/affine/blocks/image/src/view.ts index 33a022a219..ccd55c3948 100644 --- a/blocksuite/affine/blocks/image/src/view.ts +++ b/blocksuite/affine/blocks/image/src/view.ts @@ -7,7 +7,7 @@ import { effects } from './effects'; import { ImageBlockSpec } from './image-spec'; export class ImageViewExtension extends ViewExtensionProvider { - override name = 'affine-image'; + override name = 'affine-image-block'; override effect() { super.effect(); diff --git a/blocksuite/affine/blocks/latex/package.json b/blocksuite/affine/blocks/latex/package.json index 994280c121..bbbf7c2fa9 100644 --- a/blocksuite/affine/blocks/latex/package.json +++ b/blocksuite/affine/blocks/latex/package.json @@ -12,6 +12,7 @@ "dependencies": { "@blocksuite/affine-block-note": "workspace:*", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-inline-latex": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", @@ -36,7 +37,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/blocks/latex/src/store.ts b/blocksuite/affine/blocks/latex/src/store.ts new file mode 100644 index 0000000000..1dfb3a15ea --- /dev/null +++ b/blocksuite/affine/blocks/latex/src/store.ts @@ -0,0 +1,17 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { LatexBlockSchemaExtension } from '@blocksuite/affine-model'; + +import { LatexBlockAdapterExtensions } from './adapters/extension'; + +export class LatexStoreExtension extends StoreExtensionProvider { + override name = 'affine-latex-block'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register([LatexBlockSchemaExtension]); + context.register(LatexBlockAdapterExtensions); + } +} diff --git a/blocksuite/affine/blocks/latex/src/view.ts b/blocksuite/affine/blocks/latex/src/view.ts new file mode 100644 index 0000000000..1f13100cc8 --- /dev/null +++ b/blocksuite/affine/blocks/latex/src/view.ts @@ -0,0 +1,21 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu'; +import { BlockViewExtension } from '@blocksuite/std'; +import { literal } from 'lit/static-html.js'; + +import { latexSlashMenuConfig } from './configs/slash-menu'; + +export class LatexViewExtension extends ViewExtensionProvider { + override name = 'affine-latex-block'; + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register([ + BlockViewExtension('affine:latex', literal`affine-latex`), + SlashMenuConfigExtension('affine:latex', latexSlashMenuConfig), + ]); + } +} diff --git a/blocksuite/affine/blocks/latex/tsconfig.json b/blocksuite/affine/blocks/latex/tsconfig.json index 862e1a7487..774bffbed3 100644 --- a/blocksuite/affine/blocks/latex/tsconfig.json +++ b/blocksuite/affine/blocks/latex/tsconfig.json @@ -9,6 +9,7 @@ "references": [ { "path": "../note" }, { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../../inlines/latex" }, { "path": "../../model" }, { "path": "../../rich-text" }, diff --git a/blocksuite/affine/blocks/list/package.json b/blocksuite/affine/blocks/list/package.json index 69ea456e22..91d2c9f6e2 100644 --- a/blocksuite/affine/blocks/list/package.json +++ b/blocksuite/affine/blocks/list/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", @@ -36,7 +37,9 @@ "exports": { ".": "./src/index.ts", "./effects": "./src/effects.ts", - "./turbo-painter": "./src/turbo/list-painter.worker.ts" + "./turbo-painter": "./src/turbo/list-painter.worker.ts", + "./view": "./src/view.ts", + "./store": "./src/store.ts" }, "files": [ "src", diff --git a/blocksuite/affine/blocks/list/src/store.ts b/blocksuite/affine/blocks/list/src/store.ts new file mode 100644 index 0000000000..9d32ee08c1 --- /dev/null +++ b/blocksuite/affine/blocks/list/src/store.ts @@ -0,0 +1,17 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { ListBlockSchemaExtension } from '@blocksuite/affine-model'; + +import { ListBlockAdapterExtensions } from './adapters/extension'; + +export class ListStoreExtension extends StoreExtensionProvider { + override name = 'affine-list-block'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(ListBlockSchemaExtension); + context.register(ListBlockAdapterExtensions); + } +} diff --git a/blocksuite/affine/blocks/list/src/view.ts b/blocksuite/affine/blocks/list/src/view.ts new file mode 100644 index 0000000000..905c33064e --- /dev/null +++ b/blocksuite/affine/blocks/list/src/view.ts @@ -0,0 +1,22 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { BlockViewExtension, FlavourExtension } from '@blocksuite/std'; +import { literal } from 'lit/static-html.js'; + +import { ListKeymapExtension, ListTextKeymapExtension } from './list-keymap.js'; + +export class ListViewExtension extends ViewExtensionProvider { + override name = 'affine-list-block'; + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register([ + FlavourExtension('affine:list'), + BlockViewExtension('affine:list', literal`affine-list`), + ListKeymapExtension, + ListTextKeymapExtension, + ]); + } +} diff --git a/blocksuite/affine/blocks/list/tsconfig.json b/blocksuite/affine/blocks/list/tsconfig.json index 5a8a2133e6..4d94611b10 100644 --- a/blocksuite/affine/blocks/list/tsconfig.json +++ b/blocksuite/affine/blocks/list/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../../gfx/turbo-renderer" }, { "path": "../../inlines/preset" }, { "path": "../../model" }, diff --git a/packages/frontend/core/src/blocksuite/manager/store.ts b/packages/frontend/core/src/blocksuite/manager/store.ts index affb2a1b6f..777f6eae3a 100644 --- a/packages/frontend/core/src/blocksuite/manager/store.ts +++ b/packages/frontend/core/src/blocksuite/manager/store.ts @@ -9,6 +9,8 @@ import { EdgelessTextStoreExtension } from '@blocksuite/affine/blocks/edgeless-t 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 { StoreExtensionManager } from '@blocksuite/affine/ext-loader'; export function createStoreManager() { @@ -24,6 +26,8 @@ export function createStoreManager() { EmbedStoreExtension, FrameStoreExtension, ImageStoreExtension, + LatexStoreExtension, + ListStoreExtension, ]); return manager; diff --git a/packages/frontend/core/src/blocksuite/manager/view.ts b/packages/frontend/core/src/blocksuite/manager/view.ts index d8a50e2155..896d02f712 100644 --- a/packages/frontend/core/src/blocksuite/manager/view.ts +++ b/packages/frontend/core/src/blocksuite/manager/view.ts @@ -9,6 +9,8 @@ import { EdgelessTextViewExtension } from '@blocksuite/affine/blocks/edgeless-te 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 { ViewExtensionManager } from '@blocksuite/affine/ext-loader'; export function createViewManager() { @@ -24,6 +26,8 @@ export function createViewManager() { EmbedViewExtension, FrameViewExtension, ImageViewExtension, + LatexViewExtension, + ListViewExtension, ]); return manager; diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index bc937eb1af..21eb510538 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -253,6 +253,7 @@ export const PackageList = [ workspaceDependencies: [ 'blocksuite/affine/blocks/note', 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/inlines/latex', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', @@ -268,6 +269,7 @@ export const PackageList = [ name: '@blocksuite/affine-block-list', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/gfx/turbo-renderer', 'blocksuite/affine/inlines/preset', 'blocksuite/affine/model', diff --git a/yarn.lock b/yarn.lock index c069322c6e..9c38034c6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2685,6 +2685,7 @@ __metadata: dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-inline-latex": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" @@ -2714,6 +2715,7 @@ __metadata: resolution: "@blocksuite/affine-block-list@workspace:blocksuite/affine/blocks/list" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*"