From bffa2235c215a517d6b6a360cb15dda68f70d199 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Tue, 14 Feb 2023 09:38:41 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/7360 --- app/src/protyle/hint/index.ts | 23 ++++++++++++++++++++++- app/src/protyle/util/paste.ts | 5 +++-- app/src/protyle/util/selection.ts | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/protyle/hint/index.ts b/app/src/protyle/hint/index.ts index 067a2ddb2..435d11104 100644 --- a/app/src/protyle/hint/index.ts +++ b/app/src/protyle/hint/index.ts @@ -128,7 +128,28 @@ ${unicode2Emoji(emoji.unicode, true)}`; return; } protyle.toolbar.range = getSelection().getRangeAt(0); - const start = getSelectionOffset(protyle.toolbar.range.startContainer as HTMLElement, protyle.wysiwyg.element).start; + // 粘贴后 range.startContainer 为空 https://github.com/siyuan-note/siyuan/issues/7360 + if (protyle.toolbar.range.startContainer.nodeType === 3 && protyle.toolbar.range.startContainer.textContent === "") { + const lastSibling = hasPreviousSibling(protyle.toolbar.range.startContainer) as Text; + if (lastSibling && lastSibling.nodeType === 3) { + if (lastSibling.wholeText !== lastSibling.textContent) { + let previousSibling = lastSibling.previousSibling; + while (previousSibling && previousSibling.nodeType === 3) { + if (previousSibling.textContent === "") { + previousSibling = previousSibling.previousSibling; + previousSibling.nextSibling.remove(); + } else { + lastSibling.textContent = previousSibling.textContent + lastSibling.textContent; + previousSibling.remove(); + break; + } + } + } + protyle.toolbar.range.setStart(lastSibling, lastSibling.textContent.length); + protyle.toolbar.range.collapse(true); + } + } + const start = getSelectionOffset(protyle.toolbar.range.startContainer, protyle.wysiwyg.element).start; const currentLineValue = protyle.toolbar.range.startContainer.textContent.substring(0, start) || ""; const key = this.getKey(currentLineValue, protyle.options.hint.extend); if (typeof key === "undefined" || diff --git a/app/src/protyle/util/paste.ts b/app/src/protyle/util/paste.ts index 7e8d6caf8..d2c15efac 100644 --- a/app/src/protyle/util/paste.ts +++ b/app/src/protyle/util/paste.ts @@ -191,7 +191,7 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven }); const tempInnerHTML = tempElement.innerHTML; insertHTML(tempInnerHTML, protyle, isBlock); - filterClipboardHint(protyle, tempInnerHTML); + filterClipboardHint(protyle, protyle.lute.BlockDOM2StdMd(tempInnerHTML)); blockRender(protyle, protyle.wysiwyg.element); processRender(protyle.wysiwyg.element); highlightRender(protyle.wysiwyg.element); @@ -220,6 +220,7 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven insertHTML(code, protyle, true); highlightRender(protyle.wysiwyg.element); } + hideElements(["hint"], protyle) } else { let isHTML = false; if (textHTML.replace("", "").trim() !== "") { @@ -278,7 +279,7 @@ export const paste = async (protyle: IProtyle, event: (ClipboardEvent | DragEven } const textPlainDom = protyle.lute.Md2BlockDOM(textPlain); insertHTML(textPlainDom, protyle); - filterClipboardHint(protyle, textPlainDom); + filterClipboardHint(protyle, textPlain); } blockRender(protyle, protyle.wysiwyg.element); processRender(protyle.wysiwyg.element); diff --git a/app/src/protyle/util/selection.ts b/app/src/protyle/util/selection.ts index 0e134e44a..46cda580d 100644 --- a/app/src/protyle/util/selection.ts +++ b/app/src/protyle/util/selection.ts @@ -219,7 +219,7 @@ export const getSelectionPosition = (nodeElement: Element, range?: Range) => { }; }; -export const getSelectionOffset = (selectElement: Element, editorElement?: Element, range?: Range) => { +export const getSelectionOffset = (selectElement: Node, editorElement?: Element, range?: Range) => { const position = { end: 0, start: 0,