diff --git a/blocksuite/affine/all/src/extensions/common.ts b/blocksuite/affine/all/src/extensions/common.ts index 43c4411b4d..2d6648bf43 100644 --- a/blocksuite/affine/all/src/extensions/common.ts +++ b/blocksuite/affine/all/src/extensions/common.ts @@ -17,14 +17,40 @@ import { } from '@blocksuite/affine-block-note'; import { ParagraphBlockSpec } from '@blocksuite/affine-block-paragraph'; import { + EdgelessSurfaceBlockAdapterExtensions, EdgelessSurfaceBlockSpec, PageSurfaceBlockSpec, + SurfaceBlockAdapterExtensions, } from '@blocksuite/affine-block-surface'; import { EdgelessSurfaceRefBlockSpec, PageSurfaceRefBlockSpec, } from '@blocksuite/affine-block-surface-ref'; import { TableBlockSpec } from '@blocksuite/affine-block-table'; +import { + brushToMarkdownAdapterMatcher, + brushToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-brush'; +import { + connectorToMarkdownAdapterMatcher, + connectorToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-connector'; +import { + groupToMarkdownAdapterMatcher, + groupToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-group'; +import { + mindmapToMarkdownAdapterMatcher, + mindmapToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-mindmap'; +import { + shapeToMarkdownAdapterMatcher, + shapeToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-shape'; +import { + textToMarkdownAdapterMatcher, + textToPlainTextAdapterMatcher, +} from '@blocksuite/affine-gfx-text'; import { inlinePresetExtensions } from '@blocksuite/affine-inline-preset'; import { DefaultOpenDocExtension, @@ -34,6 +60,24 @@ import { } from '@blocksuite/affine-shared/services'; import type { ExtensionType } from '@blocksuite/store'; +const elementToPlainTextAdapterMatchers = [ + groupToPlainTextAdapterMatcher, + shapeToPlainTextAdapterMatcher, + connectorToPlainTextAdapterMatcher, + brushToPlainTextAdapterMatcher, + textToPlainTextAdapterMatcher, + mindmapToPlainTextAdapterMatcher, +]; + +const elementToMarkdownAdapterMatchers = [ + groupToMarkdownAdapterMatcher, + shapeToMarkdownAdapterMatcher, + connectorToMarkdownAdapterMatcher, + brushToMarkdownAdapterMatcher, + textToMarkdownAdapterMatcher, + mindmapToMarkdownAdapterMatcher, +]; + export const CommonBlockSpecs: ExtensionType[] = [ inlinePresetExtensions, DocDisplayMetaService, @@ -54,6 +98,9 @@ export const CommonBlockSpecs: ExtensionType[] = [ FontLoaderService, CalloutBlockSpec, FrameBlockSpec, + + elementToPlainTextAdapterMatchers, + elementToMarkdownAdapterMatchers, ].flat(); export const PageFirstPartyBlockSpecs: ExtensionType[] = [ @@ -61,6 +108,8 @@ export const PageFirstPartyBlockSpecs: ExtensionType[] = [ NoteBlockSpec, PageSurfaceBlockSpec, PageSurfaceRefBlockSpec, + + ...SurfaceBlockAdapterExtensions, ].flat(); export const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [ @@ -70,4 +119,6 @@ export const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [ EdgelessSurfaceBlockSpec, EdgelessSurfaceRefBlockSpec, EdgelessTextBlockSpec, + + ...EdgelessSurfaceBlockAdapterExtensions, ].flat(); diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/extension.ts b/blocksuite/affine/blocks/block-surface/src/adapters/extension.ts index 51bfbdae91..f57c303d95 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/extension.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/extension.ts @@ -1,24 +1,21 @@ -import { elementToMarkdownAdapterMatchers } from './markdown/element-adapter/elements/index.js'; import { EdgelessSurfaceBlockMarkdownAdapterExtension, SurfaceBlockMarkdownAdapterExtension, } from './markdown/markdown.js'; -import { elementToPlainTextAdapterMatchers } from './plain-text/element-adapter/elements/index.js'; import { EdgelessSurfaceBlockPlainTextAdapterExtension, SurfaceBlockPlainTextAdapterExtension, } from './plain-text/plain-text.js'; export const SurfaceBlockAdapterExtensions = [ - ...elementToPlainTextAdapterMatchers, - ...elementToMarkdownAdapterMatchers, SurfaceBlockPlainTextAdapterExtension, SurfaceBlockMarkdownAdapterExtension, ]; export const EdgelessSurfaceBlockAdapterExtensions = [ - ...elementToPlainTextAdapterMatchers, - ...elementToMarkdownAdapterMatchers, EdgelessSurfaceBlockPlainTextAdapterExtension, EdgelessSurfaceBlockMarkdownAdapterExtension, ]; + +export * from './markdown/element-adapter/index.js'; +export * from './plain-text/element-adapter/index.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/index.ts b/blocksuite/affine/blocks/block-surface/src/adapters/index.ts index 8e431f3cd8..e534c32259 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/index.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/index.ts @@ -1,4 +1 @@ -export { - EdgelessSurfaceBlockAdapterExtensions, - SurfaceBlockAdapterExtensions, -} from './extension.js'; +export * from './extension.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/index.ts b/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/index.ts deleted file mode 100644 index 531f8ba7dd..0000000000 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { brushToMarkdownAdapterMatcher } from './brush.js'; -import { connectorToMarkdownAdapterMatcher } from './connector.js'; -import { groupToMarkdownAdapterMatcher } from './group.js'; -import { mindmapToMarkdownAdapterMatcher } from './mindmap.js'; -import { shapeToMarkdownAdapterMatcher } from './shape.js'; -import { textToMarkdownAdapterMatcher } from './text.js'; - -export const elementToMarkdownAdapterMatchers = [ - groupToMarkdownAdapterMatcher, - shapeToMarkdownAdapterMatcher, - connectorToMarkdownAdapterMatcher, - brushToMarkdownAdapterMatcher, - textToMarkdownAdapterMatcher, - mindmapToMarkdownAdapterMatcher, -]; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/index.ts b/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/index.ts index 969564ede4..77a19646c1 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/index.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/index.ts @@ -29,3 +29,5 @@ export class MarkdownElementModelAdapter extends ElementModelAdapter< return markdownAST; } } + +export * from './type.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/markdown.ts b/blocksuite/affine/blocks/block-surface/src/adapters/markdown/markdown.ts index 9916145152..aebec7ae37 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/markdown.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/markdown/markdown.ts @@ -1,9 +1,9 @@ +import { getMindMapNodeMap } from '@blocksuite/affine-model'; import { BlockMarkdownAdapterExtension, type BlockMarkdownAdapterMatcher, } from '@blocksuite/affine-shared/adapters'; -import { getMindMapNodeMap } from '../utils/mindmap.js'; import { MarkdownElementModelAdapter } from './element-adapter/index.js'; import { ElementToMarkdownAdapterMatcherIdentifier } from './element-adapter/type.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/index.ts b/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/index.ts deleted file mode 100644 index 9197a0deb2..0000000000 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { brushToPlainTextAdapterMatcher } from './brush.js'; -import { connectorToPlainTextAdapterMatcher } from './connector.js'; -import { groupToPlainTextAdapterMatcher } from './group.js'; -import { mindmapToPlainTextAdapterMatcher } from './mindmap.js'; -import { shapeToPlainTextAdapterMatcher } from './shape.js'; -import { textToPlainTextAdapterMatcher } from './text.js'; - -export const elementToPlainTextAdapterMatchers = [ - groupToPlainTextAdapterMatcher, - shapeToPlainTextAdapterMatcher, - connectorToPlainTextAdapterMatcher, - brushToPlainTextAdapterMatcher, - textToPlainTextAdapterMatcher, - mindmapToPlainTextAdapterMatcher, -]; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/index.ts b/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/index.ts index 71689cac27..e47a88a32f 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/index.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/index.ts @@ -28,3 +28,5 @@ export class PlainTextElementModelAdapter extends ElementModelAdapter< return ''; } } + +export * from './type.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/plain-text.ts b/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/plain-text.ts index 2e71035fac..b73945cc7f 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/plain-text.ts +++ b/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/plain-text.ts @@ -1,9 +1,9 @@ +import { getMindMapNodeMap } from '@blocksuite/affine-model'; import { BlockPlainTextAdapterExtension, type BlockPlainTextAdapterMatcher, } from '@blocksuite/affine-shared/adapters'; -import { getMindMapNodeMap } from '../utils/mindmap.js'; import { PlainTextElementModelAdapter } from './element-adapter/index.js'; import { ElementToPlainTextAdapterMatcherIdentifier } from './element-adapter/type.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/utils/text.ts b/blocksuite/affine/blocks/block-surface/src/adapters/utils/text.ts deleted file mode 100644 index 0ef98b96b2..0000000000 --- a/blocksuite/affine/blocks/block-surface/src/adapters/utils/text.ts +++ /dev/null @@ -1,162 +0,0 @@ -import type { DeltaInsert } from '@blocksuite/store'; - -import type { MindMapTreeNode } from '../types/mindmap.js'; -import { buildMindMapTree } from './mindmap.js'; - -export function getShapeType(elementModel: Record): string { - let shapeType = ''; - if (elementModel.type !== 'shape') { - return shapeType; - } - - if ( - 'shapeType' in elementModel && - typeof elementModel.shapeType === 'string' - ) { - shapeType = elementModel.shapeType; - } - return shapeType; -} - -export function getShapeText(elementModel: Record): string { - let text = ''; - if (elementModel.type !== 'shape') { - return text; - } - - if ( - 'text' in elementModel && - typeof elementModel.text === 'object' && - elementModel.text - ) { - let delta: DeltaInsert[] = []; - if ('delta' in elementModel.text) { - delta = elementModel.text.delta as DeltaInsert[]; - } - text = delta.map(d => d.insert).join(''); - } - return text; -} - -export function getConnectorText( - elementModel: Record -): string { - let text = ''; - if (elementModel.type !== 'connector') { - return text; - } - - if ( - 'text' in elementModel && - typeof elementModel.text === 'object' && - elementModel.text - ) { - let delta: DeltaInsert[] = []; - if ('delta' in elementModel.text) { - delta = elementModel.text.delta as DeltaInsert[]; - } - text = delta.map(d => d.insert).join(''); - } - return text; -} - -export function getGroupTitle(elementModel: Record): string { - let title = ''; - if (elementModel.type !== 'group') { - return title; - } - - if ( - 'title' in elementModel && - typeof elementModel.title === 'object' && - elementModel.title - ) { - let delta: DeltaInsert[] = []; - if ('delta' in elementModel.title) { - delta = elementModel.title.delta as DeltaInsert[]; - } - title = delta.map(d => d.insert).join(''); - } - return title; -} - -export function getTextElementText( - elementModel: Record -): string { - let text = ''; - if (elementModel.type !== 'text') { - return text; - } - if ( - 'text' in elementModel && - typeof elementModel.text === 'object' && - elementModel.text - ) { - let delta: DeltaInsert[] = []; - if ('delta' in elementModel.text) { - delta = elementModel.text.delta as DeltaInsert[]; - } - text = delta.map(d => d.insert).join(''); - } - return text; -} - -/** - * traverse the mindMapTree and construct the content string - * like: - * - Root - * - Child 1 - * - Child 1.1 - * - Child 1.2 - * - Child 2 - * - Child 2.1 - * - Child 2.2 - * - Child 3 - * - Child 3.1 - * - Child 3.2 - * @param elementModel - the mindmap element model - * @param elements - the elements map - * @returns the mindmap tree text - */ -export function getMindMapTreeText( - elementModel: Record, - elements: Record>, - options: { - prefix: string; - repeat: number; - } = { - prefix: ' ', - repeat: 2, - } -): string { - let mindMapContent = ''; - if (elementModel.type !== 'mindmap') { - return mindMapContent; - } - - const mindMapTree = buildMindMapTree(elementModel); - if (!mindMapTree) { - return mindMapContent; - } - - let layer = 0; - const traverseMindMapTree = ( - node: MindMapTreeNode, - prefix: string, - repeat: number - ) => { - const shapeElement = elements[node.id as string]; - const shapeText = getShapeText(shapeElement); - if (shapeElement) { - mindMapContent += `${prefix.repeat(layer * repeat)}- ${shapeText}\n`; - } - node.children.forEach(child => { - layer++; - traverseMindMapTree(child, prefix, repeat); - layer--; - }); - }; - traverseMindMapTree(mindMapTree, options.prefix, options.repeat); - - return mindMapContent; -} diff --git a/blocksuite/affine/blocks/block-surface/src/index.ts b/blocksuite/affine/blocks/block-surface/src/index.ts index 90c62a6523..c8d06065d3 100644 --- a/blocksuite/affine/blocks/block-surface/src/index.ts +++ b/blocksuite/affine/blocks/block-surface/src/index.ts @@ -30,10 +30,7 @@ import { isSameFontFamily, wrapFontFamily, } from './utils/font.js'; -export { - EdgelessSurfaceBlockAdapterExtensions, - SurfaceBlockAdapterExtensions, -} from './adapters/index.js'; +export * from './adapters/index.js'; export * from './extensions'; export type { SurfaceContext } from './surface-block.js'; export { SurfaceBlockComponent } from './surface-block.js'; diff --git a/blocksuite/affine/blocks/block-surface/src/surface-spec.ts b/blocksuite/affine/blocks/block-surface/src/surface-spec.ts index 8bdbf0449e..d535f19b99 100644 --- a/blocksuite/affine/blocks/block-surface/src/surface-spec.ts +++ b/blocksuite/affine/blocks/block-surface/src/surface-spec.ts @@ -2,10 +2,6 @@ import { BlockViewExtension, FlavourExtension } from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; import { literal } from 'lit/static-html.js'; -import { - EdgelessSurfaceBlockAdapterExtensions, - SurfaceBlockAdapterExtensions, -} from './adapters/extension'; import { EdgelessCRUDExtension, EdgelessLegacySlotExtension, @@ -21,12 +17,10 @@ const CommonSurfaceBlockSpec: ExtensionType[] = [ export const PageSurfaceBlockSpec: ExtensionType[] = [ ...CommonSurfaceBlockSpec, - ...SurfaceBlockAdapterExtensions, BlockViewExtension('affine:surface', literal`affine-surface-void`), ]; export const EdgelessSurfaceBlockSpec: ExtensionType[] = [ ...CommonSurfaceBlockSpec, - ...EdgelessSurfaceBlockAdapterExtensions, BlockViewExtension('affine:surface', literal`affine-surface`), ]; diff --git a/blocksuite/affine/gfx/brush/src/adapter/index.ts b/blocksuite/affine/gfx/brush/src/adapter/index.ts new file mode 100644 index 0000000000..2009b25861 --- /dev/null +++ b/blocksuite/affine/gfx/brush/src/adapter/index.ts @@ -0,0 +1,2 @@ +export * from './markdown'; +export * from './plain-text'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/brush.ts b/blocksuite/affine/gfx/brush/src/adapter/markdown/index.ts similarity index 80% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/brush.ts rename to blocksuite/affine/gfx/brush/src/adapter/markdown/index.ts index 25214c82af..e5e8efc025 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/brush.ts +++ b/blocksuite/affine/gfx/brush/src/adapter/markdown/index.ts @@ -1,4 +1,4 @@ -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; export const brushToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ name: 'brush', diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/brush.ts b/blocksuite/affine/gfx/brush/src/adapter/plain-text/index.ts similarity index 74% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/brush.ts rename to blocksuite/affine/gfx/brush/src/adapter/plain-text/index.ts index 45101b294f..d1786460fc 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/brush.ts +++ b/blocksuite/affine/gfx/brush/src/adapter/plain-text/index.ts @@ -1,4 +1,4 @@ -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; export const brushToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension({ diff --git a/blocksuite/affine/gfx/brush/src/index.ts b/blocksuite/affine/gfx/brush/src/index.ts index 99826d345f..ba45147853 100644 --- a/blocksuite/affine/gfx/brush/src/index.ts +++ b/blocksuite/affine/gfx/brush/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './brush-tool'; export * from './element-renderer'; export * from './eraser-tool'; diff --git a/blocksuite/affine/gfx/connector/src/adapter/index.ts b/blocksuite/affine/gfx/connector/src/adapter/index.ts new file mode 100644 index 0000000000..2009b25861 --- /dev/null +++ b/blocksuite/affine/gfx/connector/src/adapter/index.ts @@ -0,0 +1,2 @@ +export * from './markdown'; +export * from './plain-text'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/connector.ts b/blocksuite/affine/gfx/connector/src/adapter/markdown/index.ts similarity index 80% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/connector.ts rename to blocksuite/affine/gfx/connector/src/adapter/markdown/index.ts index f83cd5d19f..e858cfea26 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/connector.ts +++ b/blocksuite/affine/gfx/connector/src/adapter/markdown/index.ts @@ -1,5 +1,6 @@ -import { getConnectorText } from '../../../utils/text.js'; -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getConnectorText } from '../text'; export const connectorToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/connector.ts b/blocksuite/affine/gfx/connector/src/adapter/plain-text/index.ts similarity index 73% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/connector.ts rename to blocksuite/affine/gfx/connector/src/adapter/plain-text/index.ts index e7767cfabc..6bea40457f 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/connector.ts +++ b/blocksuite/affine/gfx/connector/src/adapter/plain-text/index.ts @@ -1,5 +1,6 @@ -import { getConnectorText } from '../../../utils/text.js'; -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getConnectorText } from '../text'; export const connectorToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension({ diff --git a/blocksuite/affine/gfx/connector/src/adapter/text.ts b/blocksuite/affine/gfx/connector/src/adapter/text.ts new file mode 100644 index 0000000000..f9d577b664 --- /dev/null +++ b/blocksuite/affine/gfx/connector/src/adapter/text.ts @@ -0,0 +1,23 @@ +import type { DeltaInsert } from '@blocksuite/affine/store'; + +export function getConnectorText( + elementModel: Record +): string { + let text = ''; + if (elementModel.type !== 'connector') { + return text; + } + + if ( + 'text' in elementModel && + typeof elementModel.text === 'object' && + elementModel.text + ) { + let delta: DeltaInsert[] = []; + if ('delta' in elementModel.text) { + delta = elementModel.text.delta as DeltaInsert[]; + } + text = delta.map(d => d.insert).join(''); + } + return text; +} diff --git a/blocksuite/affine/gfx/connector/src/index.ts b/blocksuite/affine/gfx/connector/src/index.ts index 730ea88339..30b98f4949 100644 --- a/blocksuite/affine/gfx/connector/src/index.ts +++ b/blocksuite/affine/gfx/connector/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './connector-tool'; export * from './element-renderer'; export * from './element-transform'; diff --git a/blocksuite/affine/gfx/group/src/adapter/index.ts b/blocksuite/affine/gfx/group/src/adapter/index.ts new file mode 100644 index 0000000000..2009b25861 --- /dev/null +++ b/blocksuite/affine/gfx/group/src/adapter/index.ts @@ -0,0 +1,2 @@ +export * from './markdown'; +export * from './plain-text'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/group.ts b/blocksuite/affine/gfx/group/src/adapter/markdown/index.ts similarity index 78% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/group.ts rename to blocksuite/affine/gfx/group/src/adapter/markdown/index.ts index 3329dac672..434e002f9a 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/group.ts +++ b/blocksuite/affine/gfx/group/src/adapter/markdown/index.ts @@ -1,5 +1,6 @@ -import { getGroupTitle } from '../../../utils/text.js'; -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getGroupTitle } from '../text'; export const groupToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ name: 'group', diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/group.ts b/blocksuite/affine/gfx/group/src/adapter/plain-text/index.ts similarity index 72% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/group.ts rename to blocksuite/affine/gfx/group/src/adapter/plain-text/index.ts index d7c12e2fe8..3a2703c0a1 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/group.ts +++ b/blocksuite/affine/gfx/group/src/adapter/plain-text/index.ts @@ -1,5 +1,6 @@ -import { getGroupTitle } from '../../../utils/text.js'; -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getGroupTitle } from '../text'; export const groupToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension({ diff --git a/blocksuite/affine/gfx/group/src/adapter/text.ts b/blocksuite/affine/gfx/group/src/adapter/text.ts new file mode 100644 index 0000000000..fdaf92c270 --- /dev/null +++ b/blocksuite/affine/gfx/group/src/adapter/text.ts @@ -0,0 +1,21 @@ +import type { DeltaInsert } from '@blocksuite/affine/store'; + +export function getGroupTitle(elementModel: Record): string { + let title = ''; + if (elementModel.type !== 'group') { + return title; + } + + if ( + 'title' in elementModel && + typeof elementModel.title === 'object' && + elementModel.title + ) { + let delta: DeltaInsert[] = []; + if ('delta' in elementModel.title) { + delta = elementModel.title.delta as DeltaInsert[]; + } + title = delta.map(d => d.insert).join(''); + } + return title; +} diff --git a/blocksuite/affine/gfx/group/src/index.ts b/blocksuite/affine/gfx/group/src/index.ts index 684c16bdd6..cf488791de 100644 --- a/blocksuite/affine/gfx/group/src/index.ts +++ b/blocksuite/affine/gfx/group/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './command'; export * from './element-renderer'; export * from './text/text'; diff --git a/blocksuite/affine/gfx/mindmap/src/adapter/index.ts b/blocksuite/affine/gfx/mindmap/src/adapter/index.ts new file mode 100644 index 0000000000..2009b25861 --- /dev/null +++ b/blocksuite/affine/gfx/mindmap/src/adapter/index.ts @@ -0,0 +1,2 @@ +export * from './markdown'; +export * from './plain-text'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/mindmap.ts b/blocksuite/affine/gfx/mindmap/src/adapter/markdown/index.ts similarity index 86% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/mindmap.ts rename to blocksuite/affine/gfx/mindmap/src/adapter/markdown/index.ts index e853e64d05..ba38b9be44 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/mindmap.ts +++ b/blocksuite/affine/gfx/mindmap/src/adapter/markdown/index.ts @@ -1,7 +1,9 @@ -import type { MindMapTreeNode } from '../../../types/mindmap.js'; -import { buildMindMapTree } from '../../../utils/mindmap.js'; -import { getShapeText } from '../../../utils/text.js'; -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; +import { getShapeText } from '@blocksuite/affine-gfx-shape'; +import { + buildMindMapTree, + type MindMapTreeNode, +} from '@blocksuite/affine-model'; export const mindmapToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/mindmap.ts b/blocksuite/affine/gfx/mindmap/src/adapter/plain-text/index.ts similarity index 72% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/mindmap.ts rename to blocksuite/affine/gfx/mindmap/src/adapter/plain-text/index.ts index 71f88ee106..8585e77fd2 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/mindmap.ts +++ b/blocksuite/affine/gfx/mindmap/src/adapter/plain-text/index.ts @@ -1,5 +1,6 @@ -import { getMindMapTreeText } from '../../../utils/text.js'; -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getMindMapTreeText } from '../utils'; export const mindmapToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension({ diff --git a/blocksuite/affine/gfx/mindmap/src/adapter/utils.ts b/blocksuite/affine/gfx/mindmap/src/adapter/utils.ts new file mode 100644 index 0000000000..450e43d39d --- /dev/null +++ b/blocksuite/affine/gfx/mindmap/src/adapter/utils.ts @@ -0,0 +1,65 @@ +import { getShapeText } from '@blocksuite/affine-gfx-shape'; +import { + buildMindMapTree, + type MindMapTreeNode, +} from '@blocksuite/affine-model'; + +/** + * traverse the mindMapTree and construct the content string + * like: + * - Root + * - Child 1 + * - Child 1.1 + * - Child 1.2 + * - Child 2 + * - Child 2.1 + * - Child 2.2 + * - Child 3 + * - Child 3.1 + * - Child 3.2 + * @param elementModel - the mindmap element model + * @param elements - the elements map + * @returns the mindmap tree text + */ +export function getMindMapTreeText( + elementModel: Record, + elements: Record>, + options: { + prefix: string; + repeat: number; + } = { + prefix: ' ', + repeat: 2, + } +): string { + let mindMapContent = ''; + if (elementModel.type !== 'mindmap') { + return mindMapContent; + } + + const mindMapTree = buildMindMapTree(elementModel); + if (!mindMapTree) { + return mindMapContent; + } + + let layer = 0; + const traverseMindMapTree = ( + node: MindMapTreeNode, + prefix: string, + repeat: number + ) => { + const shapeElement = elements[node.id as string]; + const shapeText = getShapeText(shapeElement); + if (shapeElement) { + mindMapContent += `${prefix.repeat(layer * repeat)}- ${shapeText}\n`; + } + node.children.forEach(child => { + layer++; + traverseMindMapTree(child, prefix, repeat); + layer--; + }); + }; + traverseMindMapTree(mindMapTree, options.prefix, options.repeat); + + return mindMapContent; +} diff --git a/blocksuite/affine/gfx/mindmap/src/index.ts b/blocksuite/affine/gfx/mindmap/src/index.ts index 6d7a339c57..028406ac10 100644 --- a/blocksuite/affine/gfx/mindmap/src/index.ts +++ b/blocksuite/affine/gfx/mindmap/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './element-renderer'; export * from './element-transform'; export * from './indicator-overlay'; diff --git a/blocksuite/affine/gfx/shape/src/adapter/index.ts b/blocksuite/affine/gfx/shape/src/adapter/index.ts new file mode 100644 index 0000000000..1fc6b92f2d --- /dev/null +++ b/blocksuite/affine/gfx/shape/src/adapter/index.ts @@ -0,0 +1,3 @@ +export * from './markdown'; +export * from './plain-text'; +export * from './utils'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/shape.ts b/blocksuite/affine/gfx/shape/src/adapter/markdown/index.ts similarity index 86% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/shape.ts rename to blocksuite/affine/gfx/shape/src/adapter/markdown/index.ts index be917f4d6d..fc5c118c52 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/shape.ts +++ b/blocksuite/affine/gfx/shape/src/adapter/markdown/index.ts @@ -1,6 +1,7 @@ -import type { MindMapTreeNode } from '../../../types/mindmap.js'; -import { getShapeText, getShapeType } from '../../../utils/text.js'; -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; +import type { MindMapTreeNode } from '@blocksuite/affine-model'; + +import { getShapeText, getShapeType } from '../utils'; export const shapeToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ name: 'shape', diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/shape.ts b/blocksuite/affine/gfx/shape/src/adapter/plain-text/index.ts similarity index 85% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/shape.ts rename to blocksuite/affine/gfx/shape/src/adapter/plain-text/index.ts index 2e465aa9fc..04a0bc7e35 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/shape.ts +++ b/blocksuite/affine/gfx/shape/src/adapter/plain-text/index.ts @@ -1,6 +1,7 @@ -import type { MindMapTreeNode } from '../../../types/mindmap.js'; -import { getShapeText, getShapeType } from '../../../utils/text.js'; -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; +import type { MindMapTreeNode } from '@blocksuite/affine-model'; + +import { getShapeText, getShapeType } from '../utils'; export const shapeToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension({ diff --git a/blocksuite/affine/gfx/shape/src/adapter/utils.ts b/blocksuite/affine/gfx/shape/src/adapter/utils.ts new file mode 100644 index 0000000000..5cbb17fc2a --- /dev/null +++ b/blocksuite/affine/gfx/shape/src/adapter/utils.ts @@ -0,0 +1,36 @@ +import type { DeltaInsert } from '@blocksuite/store'; + +export function getShapeType(elementModel: Record): string { + let shapeType = ''; + if (elementModel.type !== 'shape') { + return shapeType; + } + + if ( + 'shapeType' in elementModel && + typeof elementModel.shapeType === 'string' + ) { + shapeType = elementModel.shapeType; + } + return shapeType; +} + +export function getShapeText(elementModel: Record): string { + let text = ''; + if (elementModel.type !== 'shape') { + return text; + } + + if ( + 'text' in elementModel && + typeof elementModel.text === 'object' && + elementModel.text + ) { + let delta: DeltaInsert[] = []; + if ('delta' in elementModel.text) { + delta = elementModel.text.delta as DeltaInsert[]; + } + text = delta.map(d => d.insert).join(''); + } + return text; +} diff --git a/blocksuite/affine/gfx/shape/src/index.ts b/blocksuite/affine/gfx/shape/src/index.ts index bff4574d85..c30f9d018d 100644 --- a/blocksuite/affine/gfx/shape/src/index.ts +++ b/blocksuite/affine/gfx/shape/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './consts'; export * from './draggable'; export * from './element-renderer'; diff --git a/blocksuite/affine/gfx/text/src/adapter/index.ts b/blocksuite/affine/gfx/text/src/adapter/index.ts new file mode 100644 index 0000000000..2009b25861 --- /dev/null +++ b/blocksuite/affine/gfx/text/src/adapter/index.ts @@ -0,0 +1,2 @@ +export * from './markdown'; +export * from './plain-text'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/text.ts b/blocksuite/affine/gfx/text/src/adapter/markdown/index.ts similarity index 76% rename from blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/text.ts rename to blocksuite/affine/gfx/text/src/adapter/markdown/index.ts index 3c4159b56e..3499188615 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/markdown/element-adapter/elements/text.ts +++ b/blocksuite/affine/gfx/text/src/adapter/markdown/index.ts @@ -1,5 +1,6 @@ -import { getTextElementText } from '../../../utils/text.js'; -import { ElementToMarkdownAdapterExtension } from '../type.js'; +import { ElementToMarkdownAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getTextElementText } from '../text'; export const textToMarkdownAdapterMatcher = ElementToMarkdownAdapterExtension({ name: 'text', diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/text.ts b/blocksuite/affine/gfx/text/src/adapter/plain-text/index.ts similarity index 68% rename from blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/text.ts rename to blocksuite/affine/gfx/text/src/adapter/plain-text/index.ts index 17d58244d6..e974099dee 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/plain-text/element-adapter/elements/text.ts +++ b/blocksuite/affine/gfx/text/src/adapter/plain-text/index.ts @@ -1,5 +1,6 @@ -import { getTextElementText } from '../../../utils/text.js'; -import { ElementToPlainTextAdapterExtension } from '../type.js'; +import { ElementToPlainTextAdapterExtension } from '@blocksuite/affine-block-surface'; + +import { getTextElementText } from '../text'; export const textToPlainTextAdapterMatcher = ElementToPlainTextAdapterExtension( { diff --git a/blocksuite/affine/gfx/text/src/adapter/text.ts b/blocksuite/affine/gfx/text/src/adapter/text.ts new file mode 100644 index 0000000000..06bd9a3d06 --- /dev/null +++ b/blocksuite/affine/gfx/text/src/adapter/text.ts @@ -0,0 +1,22 @@ +import type { DeltaInsert } from '@blocksuite/affine/store'; + +export function getTextElementText( + elementModel: Record +): string { + let text = ''; + if (elementModel.type !== 'text') { + return text; + } + if ( + 'text' in elementModel && + typeof elementModel.text === 'object' && + elementModel.text + ) { + let delta: DeltaInsert[] = []; + if ('delta' in elementModel.text) { + delta = elementModel.text.delta as DeltaInsert[]; + } + text = delta.map(d => d.insert).join(''); + } + return text; +} diff --git a/blocksuite/affine/gfx/text/src/index.ts b/blocksuite/affine/gfx/text/src/index.ts index d95113d42e..c64a4f2081 100644 --- a/blocksuite/affine/gfx/text/src/index.ts +++ b/blocksuite/affine/gfx/text/src/index.ts @@ -1,3 +1,4 @@ +export * from './adapter'; export * from './commands'; export * from './edgeless-text-editor'; export * from './element-renderer'; diff --git a/blocksuite/affine/model/src/elements/mindmap/index.ts b/blocksuite/affine/model/src/elements/mindmap/index.ts index 9ea6aac781..06869d56d4 100644 --- a/blocksuite/affine/model/src/elements/mindmap/index.ts +++ b/blocksuite/affine/model/src/elements/mindmap/index.ts @@ -1,2 +1,3 @@ -export * from './mindmap.js'; -export * from './style.js'; +export * from './mindmap'; +export * from './snapshot'; +export * from './style'; diff --git a/blocksuite/affine/model/src/elements/mindmap/snapshot/index.ts b/blocksuite/affine/model/src/elements/mindmap/snapshot/index.ts new file mode 100644 index 0000000000..6d5a6ef495 --- /dev/null +++ b/blocksuite/affine/model/src/elements/mindmap/snapshot/index.ts @@ -0,0 +1,2 @@ +export * from './types'; +export * from './utils'; diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/types/mindmap.ts b/blocksuite/affine/model/src/elements/mindmap/snapshot/types.ts similarity index 100% rename from blocksuite/affine/blocks/block-surface/src/adapters/types/mindmap.ts rename to blocksuite/affine/model/src/elements/mindmap/snapshot/types.ts diff --git a/blocksuite/affine/blocks/block-surface/src/adapters/utils/mindmap.ts b/blocksuite/affine/model/src/elements/mindmap/snapshot/utils.ts similarity index 92% rename from blocksuite/affine/blocks/block-surface/src/adapters/utils/mindmap.ts rename to blocksuite/affine/model/src/elements/mindmap/snapshot/utils.ts index 6f37936350..1c85d21ef3 100644 --- a/blocksuite/affine/blocks/block-surface/src/adapters/utils/mindmap.ts +++ b/blocksuite/affine/model/src/elements/mindmap/snapshot/utils.ts @@ -1,8 +1,4 @@ -import type { - MindMapElement, - MindMapJson, - MindMapTreeNode, -} from '../types/mindmap.js'; +import type { MindMapElement, MindMapJson, MindMapTreeNode } from './types'; function isMindMapElement(element: unknown): element is MindMapElement { return ( @@ -16,7 +12,7 @@ function isMindMapElement(element: unknown): element is MindMapElement { ); } -export function getMindMapChildrenJson( +function getMindMapChildrenJson( element: Record ): MindMapJson | null { if (!isMindMapElement(element)) {