From cc935e2645fe3eb13fbefe576a8fe8e63f8b9339 Mon Sep 17 00:00:00 2001 From: yanmao <55792257+yanmao-cc@users.noreply.github.com> Date: Fri, 24 Dec 2021 13:21:55 +0800 Subject: [PATCH] fix: filter and parse the extra line breaks of the text --- packages/engine/src/inline/index.ts | 18 ++++++++++-------- packages/engine/src/parser/index.ts | 12 ++++++++++++ plugins/codeblock/src/index.ts | 6 +++++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/engine/src/inline/index.ts b/packages/engine/src/inline/index.ts index f3788cfe..863872ab 100644 --- a/packages/engine/src/inline/index.ts +++ b/packages/engine/src/inline/index.ts @@ -1065,15 +1065,17 @@ class Inline implements InlineModelInterface { else { let parentMark: NodeInterface | undefined = markApi.closest(node); + + const element = node as NodeInterface; while ( parentMark && !parentMark.equal(node) && nodeApi.isMark(parentMark, schema) ) { const cloneMark = parentMark.clone(); - const inlineMark = node.clone(); + const cloneInline = node.clone(); const children = parentMark.children(); - children.each((markChild) => { + children.each((markChild, index) => { // 零宽字符的文本跳过 if ( markChild.nodeType === 3 && @@ -1081,13 +1083,13 @@ class Inline implements InlineModelInterface { ) { return; } - if ((node as NodeInterface).equal(markChild)) { + if ( + element.equal(markChild) || + children.eq(index)?.contains(element) + ) { node = nodeApi.wrap( - nodeApi.replace( - node as NodeInterface, - cloneMark, - ), - inlineMark, + nodeApi.replace(element, cloneMark), + cloneInline, ); this.repairBoth(node); } else { diff --git a/packages/engine/src/parser/index.ts b/packages/engine/src/parser/index.ts index 3e67ca6a..af5af2e1 100644 --- a/packages/engine/src/parser/index.ts +++ b/packages/engine/src/parser/index.ts @@ -607,6 +607,18 @@ class Parser implements ParserInterface { schema || this.editor.schema, ) ) { + const children = node.children().toArray(); + // 子节点还有block节点,则不换行 + if ( + children.some((child) => child.name === 'br') || + children.some((child) => + this.editor.node.isBlock( + child, + schema || this.editor.schema, + ), + ) + ) + return; result.push('\n'); } }, diff --git a/plugins/codeblock/src/index.ts b/plugins/codeblock/src/index.ts index eed395c7..bc5d6642 100644 --- a/plugins/codeblock/src/index.ts +++ b/plugins/codeblock/src/index.ts @@ -209,7 +209,11 @@ export default class extends Plugin { } } } - let code = new Parser(node, this.editor).toText(); + let code = new Parser(node, this.editor).toText( + undefined, + undefined, + false, + ); code = unescape(code.replace(/\u200b/g, '')); this.editor.card.replaceNode(node, 'codeblock', { mode: syntax || 'plain',