From 8ae601f9ea115b14af59891700c2d9346ba5c0cb Mon Sep 17 00:00:00 2001 From: Vanessa Date: Mon, 1 Apr 2024 17:33:18 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/10817 --- app/src/protyle/util/paste.ts | 41 ++++++++++++++++++++++++++++++ app/src/protyle/wysiwyg/index.ts | 23 +++++------------ app/src/protyle/wysiwyg/keydown.ts | 7 ++++- 3 files changed, 54 insertions(+), 17 deletions(-) diff --git a/app/src/protyle/util/paste.ts b/app/src/protyle/util/paste.ts index b2f8c0366..a3088e552 100644 --- a/app/src/protyle/util/paste.ts +++ b/app/src/protyle/util/paste.ts @@ -16,6 +16,47 @@ import {scrollCenter} from "../../util/highlightById"; import {hideElements} from "../ui/hideElements"; import {avRender} from "../render/av/render"; import {cellScrollIntoView, getCellText} from "../render/av/cell"; +import {getContenteditableElement} from "../wysiwyg/getBlock"; + +export const getTextStar = (blockElement: HTMLElement) => { + const dataType = blockElement.dataset.type + let refText = "" + if (["NodeHeading", "NodeParagraph"].includes(dataType)) { + refText = getContenteditableElement(blockElement).innerHTML; + } else { + if ("NodeHTMLBlock" === dataType) { + refText = "HTML" + } else if ("NodeAttributeView" === dataType) { + refText = blockElement.querySelector(".av__title").textContent || window.siyuan.languages.database + } else if ("NodeThematicBreak" === dataType) { + refText = window.siyuan.languages.line + } else if ("NodeIFrame" === dataType) { + refText = "IFrame" + } else if ("NodeWidget" === dataType) { + refText = window.siyuan.languages.widget + } else if ("NodeVideo" === dataType) { + refText = window.siyuan.languages.video + } else if ("NodeAudio" === dataType) { + refText = window.siyuan.languages.audio + } else if (["NodeCodeBlock", "NodeTable"].includes(dataType)) { + refText = getPlainText(blockElement); + } else if (blockElement.classList.contains("render-node")) { + // 需在嵌入块后,代码块前 + refText += blockElement.dataset.subtype || Lute.UnEscapeHTMLStr(blockElement.getAttribute("data-content")); + } else if (["NodeBlockquote", "NodeList", "NodeSuperBlock", "NodeListItem"].includes(dataType)) { + Array.from(blockElement.querySelectorAll("[data-node-id]")).find((item: HTMLElement) => { + if (!["NodeBlockquote", "NodeList", "NodeSuperBlock", "NodeListItem"].includes(item.getAttribute("data-type"))) { + refText = getTextStar(blockElement.querySelector("[data-node-id]")); + return true; + } + }) + if (refText) { + return refText + } + } + } + return refText + ` *`; +} export const getPlainText = (blockElement: HTMLElement, isNested = false) => { let text = "" diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 40edf923a..99918141a 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -1,4 +1,4 @@ -import {paste} from "../util/paste"; +import {getTextStar, paste} from "../util/paste"; import { hasClosestBlock, hasClosestByAttribute, @@ -269,32 +269,23 @@ export class WYSIWYG { selectElements[0].parentElement.classList.contains("list") && // 反链复制列表项 https://github.com/siyuan-note/siyuan/issues/6555 selectElements[0].parentElement.childElementCount - 1 === selectElements.length) { if (isRefText) { - const cloneElement = selectElements[0].parentElement.cloneNode(true) as HTMLElement; - const cloneEditElement = getContenteditableElement(cloneElement); - if (cloneEditElement) { - cloneEditElement.insertAdjacentHTML("beforeend", ` *`); - } - html = cloneElement.outerHTML; - selectElements[0].removeAttribute("data-reftext"); + html = getTextStar(selectElements[0].parentElement) } else { html = selectElements[0].parentElement.outerHTML; } } else { - selectElements.forEach((item, index) => { + selectElements.forEach((item: HTMLElement, index) => { // 复制列表项中的块会变为复制列表项,因此不能使用 getTopAloneElement https://github.com/siyuan-note/siyuan/issues/8925 if (isRefText && index === 0) { - const cloneElement = item.cloneNode(true) as HTMLElement; - const cloneEditElement = getContenteditableElement(cloneElement); - if (cloneEditElement) { - cloneEditElement.insertAdjacentHTML("beforeend", ` *`); - } - html += removeEmbed(cloneElement); - selectElements[0].removeAttribute("data-reftext"); + html += getTextStar(item) + "\n\n"; } else { html += removeEmbed(item); } }); } + if (isRefText) { + selectElements[0].removeAttribute("data-reftext"); + } } else if (selectAVElement) { const cellElements: Element[] = Array.from(nodeElement.querySelectorAll(".av__cell--active, .av__cell--select")) || []; if (cellElements.length === 0) { diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts index 47f55268e..9470381b2 100644 --- a/app/src/protyle/wysiwyg/keydown.ts +++ b/app/src/protyle/wysiwyg/keydown.ts @@ -919,7 +919,12 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { writeText(`${content.trim()} ((${nodeElement.getAttribute("data-node-id")} "*"))`); }); } else { - nodeElement.setAttribute("data-reftext", "true"); + const selectElements = protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select"); + if (selectElements.length > 0) { + selectElements[0].setAttribute("data-reftext", "true"); + } else { + nodeElement.setAttribute("data-reftext", "true"); + } focusByRange(getEditorRange(nodeElement)); document.execCommand("copy"); }