Skip to content

Commit

Permalink
fix(blocks): only split paragraphs based on newlines
Browse files Browse the repository at this point in the history
  • Loading branch information
fourdim committed Nov 7, 2024
1 parent 7ab9691 commit 1ddae3d
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 9 deletions.
4 changes: 2 additions & 2 deletions packages/blocks/src/_common/adapters/markdown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1313,10 +1313,10 @@ export class MarkdownAdapter extends BaseAdapter<Markdown> {
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) {
Expand Down
101 changes: 94 additions & 7 deletions packages/blocks/src/_common/adapters/mix-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,28 @@ export class MixTextAdapter extends BaseAdapter<MixText> {
this._markdownAdapter = new MarkdownAdapter(job);
}

private _splitDeltas(deltas: DeltaInsert[]): DeltaInsert[][] {
const result: DeltaInsert[][] = [[]];
const pending: DeltaInsert[] = deltas;
while (pending.length > 0) {
const delta = pending.shift();
if (!delta) {
break;
}
if (delta.insert.includes('\n')) {
const [before, after] = delta.insert.split('\n', 2);
result[result.length - 1].push({ ...delta, insert: before });
result.push([]);
if (after) {
pending.unshift({ ...delta, insert: after });
}
} else {
result[result.length - 1].push(delta);
}
}
return result;
}

private async _traverseSnapshot(
snapshot: BlockSnapshot
): Promise<{ mixtext: string }> {
Expand Down Expand Up @@ -245,13 +267,6 @@ export class MixTextAdapter extends BaseAdapter<MixText> {
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,
Expand All @@ -260,6 +275,78 @@ export class MixTextAdapter extends BaseAdapter<MixText> {
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<BlockSnapshot, BlockSnapshot>();
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 newDeltas = this._splitDeltas(text.delta);
for (const [i, delta] of newDeltas.entries()) {
context.openNode({
...o.node,
props: {
...o.node.props,
text: {
'$blocksuite:internal:text$': true,
delta,
},
},
children: [],
});
if (i < newDeltas.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;
}
}

0 comments on commit 1ddae3d

Please sign in to comment.