From cc7f1a8e17ff33d58baad4e34fbfabf72ed6145a Mon Sep 17 00:00:00 2001 From: Vanessa Date: Fri, 16 Sep 2022 11:54:27 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20https://github.com/siyuan-note/siy?= =?UTF-8?q?uan/issues/2911=20=E5=A4=8D=E5=88=B6=E8=A1=8C=E5=86=85=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=9A=84=E4=B8=80=E9=83=A8=E5=88=86=E6=97=B6=E5=B8=A6?= =?UTF-8?q?=E5=85=B6=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/protyle/toolbar/index.ts | 31 +++++++++++++++++++++++-------- app/src/protyle/wysiwyg/index.ts | 10 ++++++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/src/protyle/toolbar/index.ts b/app/src/protyle/toolbar/index.ts index 2342ba44cd9..a77f4a09e58 100644 --- a/app/src/protyle/toolbar/index.ts +++ b/app/src/protyle/toolbar/index.ts @@ -438,20 +438,35 @@ export class Toolbar { // 切割元素 const startContainer = this.range.startContainer as HTMLElement; const afterElement = document.createElement("span"); - const dataset = startContainer.dataset; - Object.keys(dataset).forEach(key => { - afterElement.setAttribute("data-" + key, dataset[key]); - }); + const attributes = startContainer.attributes; + for (let i = 0; i < attributes.length; i++) { + afterElement.setAttribute(attributes[i].name, attributes[i].value); + } this.range.setEnd(startContainer.lastChild, startContainer.lastChild.textContent.length); afterElement.append(this.range.extractContents()); startContainer.after(afterElement); this.range.setStartBefore(afterElement); this.range.collapse(true); } - newNodes.forEach((item) => { - this.range.insertNode(item); - this.range.collapse(false); - }); + for (let i = 0; i < newNodes.length; i++) { + const currentNewNode = newNodes[i] as HTMLElement + const nextNewNode = newNodes[i + 1] as HTMLElement + if (currentNewNode.nodeType !== 3 && nextNewNode && nextNewNode.nodeType !== 3 && + isArrayEqual(nextNewNode.getAttribute("data-type").split(" "), currentNewNode.getAttribute("data-type").split(" ")) && + currentNewNode.style.color === nextNewNode.style.color && + currentNewNode.style.webkitTextFillColor === nextNewNode.style.webkitTextFillColor && + currentNewNode.style.webkitTextStroke === nextNewNode.style.webkitTextStroke && + currentNewNode.style.textShadow === nextNewNode.style.textShadow && + currentNewNode.style.backgroundColor === nextNewNode.style.backgroundColor) { + // 合并相同的 node + nextNewNode.innerHTML = currentNewNode.innerHTML + nextNewNode.innerHTML; + newNodes.splice(i, 1); + i--; + } else { + this.range.insertNode(newNodes[i]); + this.range.collapse(false); + } + } if (previousElement) { this.mergeNode(previousElement.childNodes); } diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index f60ac4c7a78..5bf14f793c2 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -236,6 +236,16 @@ export class WYSIWYG { html = tempElement.innerHTML; } else if (selectImgElement) { html = selectImgElement.outerHTML; + } else if (selectTypes.length > 0 && range.startContainer.nodeType === 3 && range.startContainer.parentElement.tagName === "SPAN" && + range.startContainer.parentElement.isSameNode(range.endContainer.parentElement)) { + // 复制粗体等字体中的一部分 + const attributes = range.startContainer.parentElement.attributes + const spanElement = document.createElement("span"); + for (let i = 0; i < attributes.length; i++) { + spanElement.setAttribute(attributes[i].name, attributes[i].value); + } + spanElement.textContent = range.toString() + html = spanElement.outerHTML; } else { tempElement.append(range.cloneContents()); const inlineMathElement = hasClosestByAttribute(range.commonAncestorContainer, "data-type", "inline-math");