From f73f2739ef4186b65f995226cbf9f644e3784df0 Mon Sep 17 00:00:00 2001 From: fourdim Date: Thu, 7 Nov 2024 10:08:21 -0500 Subject: [PATCH] fix(blocks): only split paragraphs based on newlines --- .../blocks/src/_common/adapters/markdown.ts | 4 +- .../blocks/src/_common/adapters/mix-text.ts | 88 +++++++++++++++++-- 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/packages/blocks/src/_common/adapters/markdown.ts b/packages/blocks/src/_common/adapters/markdown.ts index 0ca0c55c239ca..1560449b8e651 100644 --- a/packages/blocks/src/_common/adapters/markdown.ts +++ b/packages/blocks/src/_common/adapters/markdown.ts @@ -1313,10 +1313,10 @@ export class MarkdownAdapter extends BaseAdapter { displayMode: NoteDisplayMode.DocAndEdgeless, }, children: [], - }; + } as BlockSnapshot; const contentSlice = (await this._traverseMarkdown( markdownAst, - blockSnapshotRoot as BlockSnapshot, + blockSnapshotRoot, payload.assets )) as BlockSnapshot; if (contentSlice.children.length === 0) { diff --git a/packages/blocks/src/_common/adapters/mix-text.ts b/packages/blocks/src/_common/adapters/mix-text.ts index 39981b9498e70..6517b55de992c 100644 --- a/packages/blocks/src/_common/adapters/mix-text.ts +++ b/packages/blocks/src/_common/adapters/mix-text.ts @@ -245,13 +245,6 @@ export class MixTextAdapter extends BaseAdapter { return null; } payload.file = payload.file.replaceAll('\r', ''); - const lines = payload.file.split('\n'); - for (let i = 0; i < lines.length - 1; i++) { - if (lines[i].length !== 0 && lines[i + 1].length !== 0) { - lines[i] += '\n'; - } - } - payload.file = lines.join('\n'); const sliceSnapshot = await this._markdownAdapter.toSliceSnapshot({ file: payload.file, assets: payload.assets, @@ -260,6 +253,87 @@ export class MixTextAdapter extends BaseAdapter { workspaceId: payload.workspaceId, pageId: payload.pageId, }); + if (!sliceSnapshot) { + return null; + } + for (const contentSlice of sliceSnapshot.content) { + const blockSnapshotRoot = { + type: 'block', + id: nanoid(), + flavour: 'affine:note', + props: { + xywh: '[0,0,800,95]', + background: DEFAULT_NOTE_BACKGROUND_COLOR, + index: 'a0', + hidden: false, + displayMode: NoteDisplayMode.DocAndEdgeless, + }, + children: [], + } as BlockSnapshot; + const walker = new ASTWalker(); + walker.setONodeTypeGuard( + (node): node is BlockSnapshot => + BlockSnapshotSchema.safeParse(node).success + ); + walker.setEnter((o, context) => { + switch (o.node.flavour) { + case 'affine:note': { + break; + } + case 'affine:paragraph': { + if (o.parent?.node.flavour !== 'affine:note') { + context.openNode({ ...o.node, children: [] }); + break; + } + const text = (o.node.props.text ?? { delta: [] }) as { + delta: DeltaInsert[]; + }; + const rawText = text.delta.map(delta => delta.insert).join(''); + const lines = rawText + .split('\n') + .map((line, index) => [index, line]); + for (const [i, line] of lines) { + context.openNode({ + type: 'block', + id: i === 0 ? o.node.id : nanoid(), + flavour: 'affine:paragraph', + props: { + type: 'text', + text: { + '$blocksuite:internal:text$': true, + delta: [ + { + insert: line, + }, + ], + }, + }, + children: [], + }); + if (i !== lines.length - 1) { + context.closeNode(); + } + } + break; + } + default: { + context.openNode({ ...o.node, children: [] }); + } + } + }); + walker.setLeave((o, context) => { + switch (o.node.flavour) { + case 'affine:note': { + break; + } + default: { + context.closeNode(); + } + } + }); + await walker.walk(contentSlice, blockSnapshotRoot); + contentSlice.children = blockSnapshotRoot.children; + } return sliceSnapshot; } }