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");
}