diff --git a/app/src/protyle/toolbar/index.ts b/app/src/protyle/toolbar/index.ts index 846217d4a..cc26cfd16 100644 --- a/app/src/protyle/toolbar/index.ts +++ b/app/src/protyle/toolbar/index.ts @@ -491,10 +491,33 @@ export class Toolbar { inlineElement.setAttribute("data-type", type); inlineElement.textContent = item.textContent; setFontStyle(inlineElement, textObj); - if (type === "text" && !inlineElement.getAttribute("style")) { - newNodes.push(item); + // 合并相同元素 https://github.com/siyuan-note/siyuan/issues/14290 + const previousIsSame = index === 0 && previousElement && previousElement.nodeType !== 3 && + type === previousElement.getAttribute("data-type") && + hasSameTextStyle(inlineElement, previousElement, textObj) + const nextIsSame = index === contents.childNodes.length - 1 && nextElement && nextElement.nodeType !== 3 && + type === nextElement.getAttribute("data-type") && + hasSameTextStyle(inlineElement, nextElement, textObj) + if (previousIsSame) { + if (previousIsSame) { + previousIndex = previousElement.textContent.length; + previousElement.innerHTML = previousElement.innerHTML + inlineElement.innerHTML; + if (nextIsSame) { + nextIndex = previousElement.textContent.length; + previousElement.innerHTML = previousElement.innerHTML + nextElement.innerHTML; + nextElement.remove(); + nextElement = previousElement; + } + } + } else if (nextIsSame) { + nextIndex = inlineElement.textContent.length; + nextElement.innerHTML = inlineElement.innerHTML + nextElement.innerHTML; } else { - newNodes.push(inlineElement); + if (type === "text" && !inlineElement.getAttribute("style")) { + newNodes.push(item); + } else { + newNodes.push(inlineElement); + } } } else { newNodes.push(item); @@ -590,14 +613,24 @@ export class Toolbar { item.setAttribute("data-subtype", "s"); } } - if (index === 0 && previousElement && previousElement.nodeType !== 3 && + const previousIsSame = index === 0 && previousElement && previousElement.nodeType !== 3 && isArrayEqual(types, (previousElement.getAttribute("data-type") || "").split(" ")) && - hasSameTextStyle(item, previousElement, textObj)) { - previousIndex = previousElement.textContent.length; - previousElement.innerHTML = previousElement.innerHTML + item.innerHTML; - } else if (index === contents.childNodes.length - 1 && nextElement && nextElement.nodeType !== 3 && + hasSameTextStyle(item, previousElement, textObj) + const nextIsSame = index === contents.childNodes.length - 1 && nextElement && nextElement.nodeType !== 3 && isArrayEqual(types, (nextElement.getAttribute("data-type") || "").split(" ")) && - hasSameTextStyle(item, nextElement, textObj)) { + hasSameTextStyle(item, nextElement, textObj) + if (previousIsSame) { + if (previousIsSame) { + previousIndex = previousElement.textContent.length; + previousElement.innerHTML = previousElement.innerHTML + item.innerHTML; + if (nextIsSame) { + nextIndex = previousElement.textContent.length; + previousElement.innerHTML = previousElement.innerHTML + nextElement.innerHTML; + nextElement.remove(); + nextElement = previousElement; + } + } + } else if (nextIsSame) { nextIndex = item.textContent.length; nextElement.innerHTML = item.innerHTML + nextElement.innerHTML; } else if (item.tagName !== "BR" && item.tagName !== "IMG") { @@ -774,7 +807,7 @@ export class Toolbar { if (nextElement) { this.mergeNode(nextElement.childNodes); } - if (previousIndex) { + if (typeof previousIndex === "number") { this.range.setStart(previousElement.firstChild, previousIndex); } else if (newNodes.length > 0) { if (newNodes[0].nodeType !== 3 && (newNodes[0] as HTMLElement).getAttribute("data-type") === "inline-math") { @@ -798,7 +831,7 @@ export class Toolbar { // aaa**bbb** 选中 aaa 加粗 this.range.setStart(nextElement.firstChild, 0); } - if (nextIndex) { + if (typeof nextIndex === "number") { this.range.setEnd(nextElement.lastChild, nextIndex); } else if (newNodes.length > 0) { const lastNewNode = newNodes[newNodes.length - 1];