🐛 Fix selectAll on mixed span styles

This commit is contained in:
Elena Torro
2025-12-02 16:50:48 +01:00
parent 511e80c948
commit c6b64a8e39

View File

@@ -1939,12 +1939,22 @@ export class SelectionController extends EventTarget {
const textSpan = this.startTextSpan; const textSpan = this.startTextSpan;
const midText = startNode.splitText(startOffset); const midText = startNode.splitText(startOffset);
const endText = midText.splitText(endOffset - startOffset); const endText = midText.splitText(endOffset - startOffset);
// Only create text span if midText is not empty
if (midText.nodeValue && midText.nodeValue.length > 0) {
const midTextSpan = createTextSpanFrom(textSpan, midText, newStyles); const midTextSpan = createTextSpanFrom(textSpan, midText, newStyles);
textSpan.after(midTextSpan); textSpan.after(midTextSpan);
if (endText.length > 0) { if (endText.length > 0) {
const endTextSpan = createTextSpan(endText, textSpan.style); const endTextSpan = createTextSpan(endText, textSpan.style);
midTextSpan.after(endTextSpan); midTextSpan.after(endTextSpan);
} }
} else {
// If midText is empty, just create endTextSpan if needed
if (endText.length > 0) {
const endTextSpan = createTextSpan(endText, textSpan.style);
textSpan.after(endTextSpan);
}
}
// NOTE: This is necessary because sometimes // NOTE: This is necessary because sometimes
// text spans are splitted from the beginning // text spans are splitted from the beginning
@@ -1996,7 +2006,8 @@ export class SelectionController extends EventTarget {
// new text span. // new text span.
if ( if (
this.#textNodeIterator.currentNode === startNode && this.#textNodeIterator.currentNode === startNode &&
startOffset > 0 startOffset > 0 &&
startOffset < (startNode.nodeValue?.length || 0)
) { ) {
const newTextSpan = splitTextSpan(textSpan, startOffset); const newTextSpan = splitTextSpan(textSpan, startOffset);
setTextSpanStyles(newTextSpan, newStyles); setTextSpanStyles(newTextSpan, newStyles);
@@ -2018,7 +2029,8 @@ export class SelectionController extends EventTarget {
// If we're at end node // If we're at end node
} else if ( } else if (
this.#textNodeIterator.currentNode === endNode && this.#textNodeIterator.currentNode === endNode &&
endOffset < endNode.nodeValue.length endOffset < endNode.nodeValue.length &&
endOffset > 0
) { ) {
const newTextSpan = splitTextSpan(textSpan, endOffset); const newTextSpan = splitTextSpan(textSpan, endOffset);
setTextSpanStyles(textSpan, newStyles); setTextSpanStyles(textSpan, newStyles);