@aquera/nile-elements 1.1.8-beta-1.2 → 1.1.8-beta-1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/nile-rich-text-editor/utils.cjs.js +1 -1
- package/dist/nile-rich-text-editor/utils.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/utils.esm.js +1 -1
- package/dist/src/nile-rich-text-editor/utils.js +91 -40
- package/dist/src/nile-rich-text-editor/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-rich-text-editor/utils.ts +92 -42
|
@@ -491,32 +491,102 @@ export function toggleList(root, kind) {
|
|
|
491
491
|
if (!sel || sel.rangeCount === 0)
|
|
492
492
|
return;
|
|
493
493
|
const range = sel.getRangeAt(0);
|
|
494
|
+
function styleList(list) {
|
|
495
|
+
list.style.paddingInlineStart = '0';
|
|
496
|
+
list.style.margin = '0';
|
|
497
|
+
}
|
|
498
|
+
function isEmptyBlock(el) {
|
|
499
|
+
return !el.textContent?.trim() && !el.querySelector('img,br');
|
|
500
|
+
}
|
|
501
|
+
function setCursorInside(el) {
|
|
502
|
+
const selection = document.getSelection();
|
|
503
|
+
if (!selection)
|
|
504
|
+
return;
|
|
505
|
+
const r = document.createRange();
|
|
506
|
+
r.selectNodeContents(el);
|
|
507
|
+
r.collapse(true);
|
|
508
|
+
selection.removeAllRanges();
|
|
509
|
+
selection.addRange(r);
|
|
510
|
+
}
|
|
511
|
+
function closestBlock(node) {
|
|
512
|
+
while (node && node !== root) {
|
|
513
|
+
if (node instanceof HTMLElement) {
|
|
514
|
+
const display = getComputedStyle(node).display;
|
|
515
|
+
if (node.tagName.match(/^(P|DIV|H[1-6]|LI)$/) ||
|
|
516
|
+
display === 'block' ||
|
|
517
|
+
display === 'list-item')
|
|
518
|
+
return node;
|
|
519
|
+
}
|
|
520
|
+
node = node.parentNode;
|
|
521
|
+
}
|
|
522
|
+
return null;
|
|
523
|
+
}
|
|
524
|
+
function unwrapList(list) {
|
|
525
|
+
const frag = document.createDocumentFragment();
|
|
526
|
+
Array.from(list.querySelectorAll('li')).forEach((li) => {
|
|
527
|
+
const p = document.createElement('p');
|
|
528
|
+
if (li.style.textAlign)
|
|
529
|
+
p.style.textAlign = li.style.textAlign;
|
|
530
|
+
while (li.firstChild)
|
|
531
|
+
p.appendChild(li.firstChild);
|
|
532
|
+
frag.appendChild(p);
|
|
533
|
+
});
|
|
534
|
+
list.replaceWith(frag);
|
|
535
|
+
}
|
|
536
|
+
function unwrapListItem(block) {
|
|
537
|
+
const li = block.closest('li');
|
|
538
|
+
if (!li)
|
|
539
|
+
return;
|
|
540
|
+
const list = li.parentElement;
|
|
541
|
+
const p = document.createElement('p');
|
|
542
|
+
if (li.style.textAlign)
|
|
543
|
+
p.style.textAlign = li.style.textAlign;
|
|
544
|
+
while (li.firstChild)
|
|
545
|
+
p.appendChild(li.firstChild);
|
|
546
|
+
list.parentNode?.insertBefore(p, list.nextSibling);
|
|
547
|
+
li.remove();
|
|
548
|
+
if (list.childNodes.length === 0)
|
|
549
|
+
list.remove();
|
|
550
|
+
setCursorInside(p);
|
|
551
|
+
}
|
|
552
|
+
function switchListType(list, newType) {
|
|
553
|
+
const newList = document.createElement(newType);
|
|
554
|
+
styleList(newList);
|
|
555
|
+
while (list.firstChild)
|
|
556
|
+
newList.appendChild(list.firstChild);
|
|
557
|
+
list.replaceWith(newList);
|
|
558
|
+
}
|
|
494
559
|
if (range.collapsed) {
|
|
495
|
-
const block = closestBlock(range.startContainer
|
|
496
|
-
|
|
560
|
+
const block = closestBlock(range.startContainer);
|
|
561
|
+
const insideList = block?.closest('ul,ol');
|
|
562
|
+
if (insideList && insideList.tagName.toLowerCase() === kind) {
|
|
563
|
+
unwrapListItem(block);
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
if (insideList && insideList.tagName.toLowerCase() !== kind) {
|
|
567
|
+
switchListType(insideList, kind);
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
if (!block || block === root || block.childNodes.length === 0 || isEmptyBlock(block)) {
|
|
497
571
|
const list = document.createElement(kind);
|
|
498
572
|
const li = document.createElement('li');
|
|
499
573
|
li.appendChild(document.createElement('br'));
|
|
500
574
|
list.appendChild(li);
|
|
575
|
+
styleList(list);
|
|
501
576
|
range.insertNode(list);
|
|
502
|
-
|
|
503
|
-
r.selectNodeContents(li);
|
|
504
|
-
r.collapse(true);
|
|
505
|
-
sel.removeAllRanges();
|
|
506
|
-
sel.addRange(r);
|
|
577
|
+
setCursorInside(li);
|
|
507
578
|
return;
|
|
508
579
|
}
|
|
509
580
|
const list = document.createElement(kind);
|
|
581
|
+
styleList(list);
|
|
510
582
|
const li = document.createElement('li');
|
|
583
|
+
if (block.style.textAlign)
|
|
584
|
+
li.style.textAlign = block.style.textAlign;
|
|
511
585
|
while (block.firstChild)
|
|
512
586
|
li.appendChild(block.firstChild);
|
|
513
587
|
list.appendChild(li);
|
|
514
588
|
block.replaceWith(list);
|
|
515
|
-
|
|
516
|
-
r.selectNodeContents(li);
|
|
517
|
-
r.collapse(true);
|
|
518
|
-
sel.removeAllRanges();
|
|
519
|
-
sel.addRange(r);
|
|
589
|
+
setCursorInside(li);
|
|
520
590
|
return;
|
|
521
591
|
}
|
|
522
592
|
const blocks = [];
|
|
@@ -537,7 +607,7 @@ export function toggleList(root, kind) {
|
|
|
537
607
|
while ((n = walker.nextNode()))
|
|
538
608
|
blocks.push(n);
|
|
539
609
|
if (blocks.length === 0) {
|
|
540
|
-
const block = closestBlock(range.startContainer
|
|
610
|
+
const block = closestBlock(range.startContainer);
|
|
541
611
|
if (block)
|
|
542
612
|
blocks.push(block);
|
|
543
613
|
}
|
|
@@ -546,37 +616,18 @@ export function toggleList(root, kind) {
|
|
|
546
616
|
const currentList = firstLi.closest('ul,ol');
|
|
547
617
|
if (!currentList)
|
|
548
618
|
return;
|
|
549
|
-
|
|
550
|
-
currentList
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
const frag = document.createDocumentFragment();
|
|
554
|
-
for (const li of Array.from(currentList.querySelectorAll('li'))) {
|
|
555
|
-
const p = document.createElement('p');
|
|
556
|
-
p.style.textAlign = li.style.textAlign || currentAlign || '';
|
|
557
|
-
while (li.firstChild)
|
|
558
|
-
p.appendChild(li.firstChild);
|
|
559
|
-
frag.appendChild(p);
|
|
560
|
-
}
|
|
561
|
-
currentList.replaceWith(frag);
|
|
562
|
-
}
|
|
563
|
-
else {
|
|
564
|
-
const newList = document.createElement(kind);
|
|
565
|
-
while (currentList.firstChild) {
|
|
566
|
-
const li = currentList.firstChild;
|
|
567
|
-
li.style.textAlign = li.style.textAlign || currentAlign || '';
|
|
568
|
-
newList.appendChild(li);
|
|
569
|
-
}
|
|
570
|
-
currentList.replaceWith(newList);
|
|
571
|
-
}
|
|
619
|
+
if (currentList.tagName.toLowerCase() === kind)
|
|
620
|
+
unwrapList(currentList);
|
|
621
|
+
else
|
|
622
|
+
switchListType(currentList, kind);
|
|
572
623
|
return;
|
|
573
624
|
}
|
|
574
625
|
const newList = document.createElement(kind);
|
|
626
|
+
styleList(newList);
|
|
575
627
|
for (const block of blocks) {
|
|
576
628
|
const li = document.createElement('li');
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
li.style.textAlign = align;
|
|
629
|
+
if (block.style.textAlign)
|
|
630
|
+
li.style.textAlign = block.style.textAlign;
|
|
580
631
|
while (block.firstChild)
|
|
581
632
|
li.appendChild(block.firstChild);
|
|
582
633
|
newList.appendChild(li);
|
|
@@ -617,7 +668,7 @@ export function insertOrEditLink(root, href) {
|
|
|
617
668
|
const r = document.createRange();
|
|
618
669
|
r.setStartAfter(link);
|
|
619
670
|
r.collapse(true);
|
|
620
|
-
sel
|
|
671
|
+
sel?.removeAllRanges();
|
|
621
672
|
sel.addRange(r);
|
|
622
673
|
return;
|
|
623
674
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["export function closestBlock(\n node: Node | null,\n root: HTMLElement\n): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (\n node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) ||\n display === 'block' ||\n display === 'list-item'\n ) {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n}\n\nexport function nearestElement(n: Node | null): HTMLElement | null {\n while (n && !(n instanceof HTMLElement)) n = n.parentNode as Node | null;\n return n as HTMLElement | null;\n}\n\nexport function rgbToHex(rgb: string): string {\n const m = rgb.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!m) return '#000000';\n const r = Number(m[1]).toString(16).padStart(2, '0');\n const g = Number(m[2]).toString(16).padStart(2, '0');\n const b = Number(m[3]).toString(16).padStart(2, '0');\n return `#${r}${g}${b}`;\n}\n\nexport function unwrap(node: HTMLElement) {\n const p = node.parentNode;\n if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n}\n\nexport function surroundInline(\n range: Range,\n tag: string,\n attrs?: Record<string, string>\n) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => wrap.setAttribute(k, v));\n try {\n range.surroundContents(wrap);\n } catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n}\n\nfunction unwrapAllMatching(\n node: Node,\n root: HTMLElement,\n matcher: (el: HTMLElement) => boolean\n) {\n let n: Node | null = node.parentNode;\n while (n && n !== root) {\n if (n instanceof HTMLElement && matcher(n)) {\n unwrap(n);\n\n n = node.parentNode;\n continue;\n }\n n = n.parentNode;\n }\n}\n\nexport function toggleInlineTag(\n root: HTMLElement,\n tag: 'strong' | 'em' | 'u' | 'span',\n attrs?: Record<string, string>\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) \n return;\n const range = sel.getRangeAt(0);\n const aliases: Record<string, string[]> = {\n strong: ['strong', 'b'],\n em: ['em', 'i'],\n u: ['u'],\n span: ['span'],\n };\n const candidates = aliases[tag] ?? [tag];\n const isMatch = (el: HTMLElement) =>\n candidates.includes(el.tagName.toLowerCase());\n\n function unwrap(el: HTMLElement) {\n const p = el.parentNode;\n if (!p) return;\n while (el.firstChild) p.insertBefore(el.firstChild, el);\n p.removeChild(el);\n }\n\n function removeEmptyAndNested(root: HTMLElement) {\n root.querySelectorAll(candidates.join(',')).forEach(el => {\n if (!el.textContent?.trim()) {\n el.remove();\n return;\n }\n const nested = Array.from(el.querySelectorAll(candidates.join(',')));\n nested.forEach(n => {\n if (n === el) return;\n while (n.firstChild) el.insertBefore(n.firstChild, n);\n n.remove();\n });\n });\n }\n\n function mergeAdjacent(root: HTMLElement) {\n const list = Array.from(root.querySelectorAll(candidates.join(',')));\n list.forEach(el => {\n const next = el.nextSibling;\n if (next instanceof HTMLElement && isMatch(next)) {\n while (next.firstChild) el.appendChild(next.firstChild);\n next.remove();\n }\n });\n }\n if (range.collapsed) {\n let inside = false;\n let n: Node | null = range.startContainer;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) {\n inside = true;\n break;\n }\n n = n.parentNode;\n }\n\n if (inside && n instanceof HTMLElement) {\n unwrap(n);\n } else {\n const elm = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => elm.setAttribute(k, v));\n elm.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(elm);\n range.setStart(elm.firstChild!, 1);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n removeEmptyAndNested(root);\n mergeAdjacent(root);\n return;\n }\n if (range.startContainer.nodeType === Node.TEXT_NODE)\n (range.startContainer as Text).splitText(range.startOffset);\n if (range.endContainer.nodeType === Node.TEXT_NODE)\n (range.endContainer as Text).splitText(range.endOffset);\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue?.trim()) return NodeFilter.FILTER_REJECT;\n const r = document.createRange();\n r.selectNodeContents(n);\n const inter =\n range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, r) > 0;\n return inter ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const textNodes: Text[] = [];\n let tn: Node | null;\n while ((tn = walker.nextNode())) textNodes.push(tn as Text);\n\n const allInside = textNodes.length > 0 && textNodes.every(txt => {\n let n: Node | null = txt;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) return true;\n n = n.parentNode;\n }\n return false;\n });\n\n if (allInside) {\n const first = textNodes[0];\n const last = textNodes[textNodes.length - 1];\n const common = first.parentElement?.closest(tag) as HTMLElement | null;\n if (common && common.contains(last)) {\n const parent = common.parentNode;\n if (parent) {\n const beforeRange = document.createRange();\n beforeRange.setStartBefore(common);\n beforeRange.setEndBefore(first);\n const before = beforeRange.cloneContents();\n\n const afterRange = document.createRange();\n afterRange.setStartAfter(last);\n afterRange.setEndAfter(common);\n const after = afterRange.cloneContents();\n\n const middleRange = document.createRange();\n middleRange.setStartBefore(first);\n middleRange.setEndAfter(last);\n const middle = middleRange.extractContents();\n\n const frag = document.createDocumentFragment();\n if (before.childNodes.length) {\n const b = document.createElement(tag);\n while (before.firstChild) b.appendChild(before.firstChild);\n frag.appendChild(b);\n }\n while (middle.firstChild) frag.appendChild(middle.firstChild);\n if (after.childNodes.length) {\n const a = document.createElement(tag);\n while (after.firstChild) a.appendChild(after.firstChild);\n frag.appendChild(a);\n }\n parent.insertBefore(frag, common);\n parent.removeChild(common);\n }\n } else {\n textNodes.forEach(txt => {\n let n: Node | null = txt;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) {\n unwrap(n);\n break;\n }\n n = n.parentNode;\n }\n });\n }\n } else {\n textNodes.forEach(txt => {\n const skip = txt.parentElement?.closest('a, .mention, nile-mention');\n if (skip) return;\n const wrapper = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => wrapper.setAttribute(k, v));\n txt.parentNode?.insertBefore(wrapper, txt);\n wrapper.appendChild(txt);\n });\n }\n\n removeEmptyAndNested(root);\n mergeAdjacent(root);\n\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\nexport function setBlockTag(root: HTMLElement, tag: 'p' | 'h1' | 'h2' | 'h3') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root);\n if (!block) return;\n if (block.tagName.toLowerCase() === tag) return;\n const nb = document.createElement(tag);\n while (block.firstChild) nb.appendChild(block.firstChild);\n block.replaceWith(nb);\n const r = document.createRange();\n r.selectNodeContents(nb);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n}\n\nexport function setAlignment(root: HTMLElement, alignment: string) {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const blocks: HTMLElement[] = [];\n const walker = document.createTreeWalker(\n commonAncestor,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node) => {\n const el = node as HTMLElement;\n if (\n range.intersectsNode(el) &&\n /^(P|DIV|LI|H[1-6])$/.test(el.tagName)\n ) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n }\n );\n\n let node = walker.nextNode();\n while (node) {\n blocks.push(node as HTMLElement);\n node = walker.nextNode();\n }\n\n if (blocks.length === 0) {\n const block = closestBlock(selection.focusNode, root);\n if (block) blocks.push(block);\n }\n blocks.forEach((block) => {\n block.style.textAlign = alignment;\n });\n}\n\n\nexport function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const span = document.createElement('span');\n span.style.fontFamily = family;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange();\n r.setStart(span.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n}\n\nfunction enclosingStyledSpan(\n editor: HTMLElement,\n node: Node | null,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n): HTMLSpanElement | null {\n while (node && node !== editor) {\n if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\n\nfunction applyInlineStyle(\n editor: HTMLElement,\n cssProp: 'color' | 'backgroundColor',\n value: string,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r0 = sel.getRangeAt(0);\n if (!editor.contains(r0.commonAncestorContainer)) return;\n\n const range = r0.cloneRange();\n\n if (range.collapsed) {\n const enclosing = enclosingStyledSpan(\n editor,\n range.startContainer,\n dataAttr\n );\n if (enclosing) {\n (enclosing.style as any)[cssProp] = value;\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = value;\n s.appendChild(document.createTextNode('\\u200B'));\n range.insertNode(s);\n\n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges();\n sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\n if (leftEdge && leftEdge === rightEdge) {\n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\n\n const sel = window.getSelection();\n const r = document.createRange();\n r.selectNodeContents(mid);\n sel?.removeAllRanges();\n sel?.addRange(r);\n }\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const commonEl = (() => {\n let n: Node | null = range.commonAncestorContainer;\n while (n && !(n instanceof HTMLElement)) n = n.parentNode;\n return n as HTMLElement | null;\n })();\n\n const walker = document.createTreeWalker(\n commonEl || editor,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue || !n.nodeValue.trim())\n return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const toProcess: Text[] = [];\n let t: Node | null;\n while ((t = walker.nextNode())) toProcess.push(t as Text);\n\n toProcess.forEach(text => {\n let start = 0,\n end = text.length;\n if (text === range.startContainer) start = range.startOffset;\n if (text === range.endContainer) end = range.endOffset;\n if (start > 0) text = text.splitText(start);\n if (end < text.length) text.splitText(end);\n\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n const span = document.createElement('span');\n span.setAttribute(dataAttr, '1');\n (span.style as any)[cssProp] = value;\n const parent = text.parentElement!;\n parent.replaceChild(span, text);\n span.appendChild(text);\n });\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n\n // restore selection\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n// Is the range covering the entire node's contents?\nfunction rangeCoversWholeNode(range: Range, node: Node): boolean {\n const all = document.createRange();\n all.selectNodeContents(node);\n return (\n range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, all) >= 0\n );\n}\n\nfunction hasRangeContent(r: Range): boolean {\n if (r.collapsed) return false;\n const text = r.cloneContents().textContent || '';\n return text.length > 0;\n}\n\n// Split one styled span into [left][middle][right]; recolor only middle\nfunction splitAndRecolorWithinSpan(\n span: HTMLSpanElement,\n range: Range,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor',\n newValue: string\n): HTMLSpanElement {\n const oldValue = (span.style as any)[cssProp];\n\n const left = document.createRange();\n left.setStart(span, 0);\n left.setEnd(range.startContainer, range.startOffset);\n\n const right = document.createRange();\n right.setStart(range.endContainer, range.endOffset);\n right.setEnd(span, span.childNodes.length);\n\n // Build replacement fragment\n const frag = document.createDocumentFragment();\n\n // helper to make a styled clone shell\n const makeShell = (val: string) => {\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = val;\n return s;\n };\n\n if (hasRangeContent(left)) {\n const sLeft = makeShell(oldValue);\n sLeft.appendChild(left.cloneContents());\n frag.appendChild(sLeft);\n }\n\n const mid = makeShell(newValue);\n mid.appendChild(range.cloneContents());\n frag.appendChild(mid);\n\n if (hasRangeContent(right)) {\n const sRight = makeShell(oldValue);\n sRight.appendChild(right.cloneContents());\n frag.appendChild(sRight);\n }\n\n span.replaceWith(frag);\n return mid;\n}\n\nfunction mergeAdjacentStyledSpans(\n root: HTMLElement,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor'\n) {\n const spans = Array.from(\n root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n\n const valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\n spans.forEach(s => {\n const nested = Array.from(\n s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n nested.forEach(child => {\n if (valOf(child) === valOf(s)) {\n while (child.firstChild) s.insertBefore(child.firstChild, child);\n child.remove();\n }\n });\n\n const prev = s.previousSibling;\n if (\n prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)\n ) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return;\n }\n\n const next = s.nextSibling;\n if (\n next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)\n ) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\n });\n}\n\nexport function setForeColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'color', hex, 'data-rte-color');\n}\nexport function setBackColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');\n}\n\nexport function toggleList(root: HTMLElement, kind: 'ul' | 'ol') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const block = closestBlock(range.startContainer, root);\n if (!block || block === root || block.childNodes.length === 0) {\n const list = document.createElement(kind);\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n list.appendChild(li);\n range.insertNode(list);\n const r = document.createRange();\n r.selectNodeContents(li);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n const list = document.createElement(kind);\n const li = document.createElement('li');\n while (block.firstChild) li.appendChild(block.firstChild);\n list.appendChild(li);\n block.replaceWith(list);\n const r = document.createRange();\n r.selectNodeContents(li);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n const blocks: HTMLElement[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (n) => {\n if (!(n instanceof HTMLElement)) return NodeFilter.FILTER_SKIP;\n if (!/^(P|DIV|LI|H[1-6])$/.test(n.tagName)) return NodeFilter.FILTER_SKIP;\n\n const r = document.createRange();\n r.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, r) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n\n let n: Node | null;\n while ((n = walker.nextNode())) blocks.push(n as HTMLElement);\n\n if (blocks.length === 0) {\n const block = closestBlock(range.startContainer, root);\n if (block) blocks.push(block);\n }\n\n const firstLi = blocks[0].closest('li');\n if (firstLi) {\n const currentList = firstLi.closest('ul,ol') as HTMLElement | null;\n if (!currentList) return;\n const currentAlign =\n (firstLi as HTMLElement).style.textAlign ||\n (currentList as HTMLElement).style.textAlign ||\n '';\n\n if (currentList.tagName.toLowerCase() === kind) {\n const frag = document.createDocumentFragment();\n for (const li of Array.from(currentList.querySelectorAll('li'))) {\n const p = document.createElement('p');\n p.style.textAlign = (li as HTMLElement).style.textAlign || currentAlign || '';\n while (li.firstChild) p.appendChild(li.firstChild);\n frag.appendChild(p);\n }\n currentList.replaceWith(frag);\n } else {\n const newList = document.createElement(kind);\n while (currentList.firstChild) {\n const li = currentList.firstChild as HTMLElement;\n li.style.textAlign = li.style.textAlign || currentAlign || '';\n newList.appendChild(li);\n }\n currentList.replaceWith(newList);\n }\n return;\n }\n\n const newList = document.createElement(kind);\n for (const block of blocks) {\n const li = document.createElement('li');\n const align = block.style.textAlign;\n if (align) li.style.textAlign = align;\n while (block.firstChild) li.appendChild(block.firstChild);\n newList.appendChild(li);\n }\n blocks[0].replaceWith(newList);\n for (let i = 1; i < blocks.length; i++) blocks[i].remove();\n}\n\n\n\nexport function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n let n: Node | null = range.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLAnchorElement) {\n a = n;\n break;\n }\n n = n.parentNode;\n }\n\n const url =\n href ??\n (typeof window !== 'undefined'\n ? window.prompt('Enter URL', a?.href || 'https://') || ''\n : '');\n if (!url) return;\n\n if (a) {\n a.href = url;\n return;\n }\n\n if (range.collapsed) {\n const link = document.createElement('a');\n link.href = url;\n link.textContent = url;\n range.insertNode(link);\n const r = document.createRange();\n r.setStartAfter(link);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n\n const link = document.createElement('a');\n link.href = url;\n try {\n range.surroundContents(link);\n } catch {\n const frag = range.extractContents();\n link.appendChild(frag);\n range.insertNode(link);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["export function closestBlock(\n node: Node | null,\n root: HTMLElement\n): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (\n node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) ||\n display === 'block' ||\n display === 'list-item'\n ) {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n}\n\nexport function nearestElement(n: Node | null): HTMLElement | null {\n while (n && !(n instanceof HTMLElement)) n = n.parentNode as Node | null;\n return n as HTMLElement | null;\n}\n\nexport function rgbToHex(rgb: string): string {\n const m = rgb.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!m) return '#000000';\n const r = Number(m[1]).toString(16).padStart(2, '0');\n const g = Number(m[2]).toString(16).padStart(2, '0');\n const b = Number(m[3]).toString(16).padStart(2, '0');\n return `#${r}${g}${b}`;\n}\n\nexport function unwrap(node: HTMLElement) {\n const p = node.parentNode;\n if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n}\n\nexport function surroundInline(\n range: Range,\n tag: string,\n attrs?: Record<string, string>\n) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => wrap.setAttribute(k, v));\n try {\n range.surroundContents(wrap);\n } catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n}\n\nfunction unwrapAllMatching(\n node: Node,\n root: HTMLElement,\n matcher: (el: HTMLElement) => boolean\n) {\n let n: Node | null = node.parentNode;\n while (n && n !== root) {\n if (n instanceof HTMLElement && matcher(n)) {\n unwrap(n);\n\n n = node.parentNode;\n continue;\n }\n n = n.parentNode;\n }\n}\n\nexport function toggleInlineTag(\n root: HTMLElement,\n tag: 'strong' | 'em' | 'u' | 'span',\n attrs?: Record<string, string>\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) \n return;\n const range = sel.getRangeAt(0);\n const aliases: Record<string, string[]> = {\n strong: ['strong', 'b'],\n em: ['em', 'i'],\n u: ['u'],\n span: ['span'],\n };\n const candidates = aliases[tag] ?? [tag];\n const isMatch = (el: HTMLElement) =>\n candidates.includes(el.tagName.toLowerCase());\n\n function unwrap(el: HTMLElement) {\n const p = el.parentNode;\n if (!p) return;\n while (el.firstChild) p.insertBefore(el.firstChild, el);\n p.removeChild(el);\n }\n\n function removeEmptyAndNested(root: HTMLElement) {\n root.querySelectorAll(candidates.join(',')).forEach(el => {\n if (!el.textContent?.trim()) {\n el.remove();\n return;\n }\n const nested = Array.from(el.querySelectorAll(candidates.join(',')));\n nested.forEach(n => {\n if (n === el) return;\n while (n.firstChild) el.insertBefore(n.firstChild, n);\n n.remove();\n });\n });\n }\n\n function mergeAdjacent(root: HTMLElement) {\n const list = Array.from(root.querySelectorAll(candidates.join(',')));\n list.forEach(el => {\n const next = el.nextSibling;\n if (next instanceof HTMLElement && isMatch(next)) {\n while (next.firstChild) el.appendChild(next.firstChild);\n next.remove();\n }\n });\n }\n if (range.collapsed) {\n let inside = false;\n let n: Node | null = range.startContainer;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) {\n inside = true;\n break;\n }\n n = n.parentNode;\n }\n\n if (inside && n instanceof HTMLElement) {\n unwrap(n);\n } else {\n const elm = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => elm.setAttribute(k, v));\n elm.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(elm);\n range.setStart(elm.firstChild!, 1);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n removeEmptyAndNested(root);\n mergeAdjacent(root);\n return;\n }\n if (range.startContainer.nodeType === Node.TEXT_NODE)\n (range.startContainer as Text).splitText(range.startOffset);\n if (range.endContainer.nodeType === Node.TEXT_NODE)\n (range.endContainer as Text).splitText(range.endOffset);\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue?.trim()) return NodeFilter.FILTER_REJECT;\n const r = document.createRange();\n r.selectNodeContents(n);\n const inter =\n range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, r) > 0;\n return inter ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const textNodes: Text[] = [];\n let tn: Node | null;\n while ((tn = walker.nextNode())) textNodes.push(tn as Text);\n\n const allInside = textNodes.length > 0 && textNodes.every(txt => {\n let n: Node | null = txt;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) return true;\n n = n.parentNode;\n }\n return false;\n });\n\n if (allInside) {\n const first = textNodes[0];\n const last = textNodes[textNodes.length - 1];\n const common = first.parentElement?.closest(tag) as HTMLElement | null;\n if (common && common.contains(last)) {\n const parent = common.parentNode;\n if (parent) {\n const beforeRange = document.createRange();\n beforeRange.setStartBefore(common);\n beforeRange.setEndBefore(first);\n const before = beforeRange.cloneContents();\n\n const afterRange = document.createRange();\n afterRange.setStartAfter(last);\n afterRange.setEndAfter(common);\n const after = afterRange.cloneContents();\n\n const middleRange = document.createRange();\n middleRange.setStartBefore(first);\n middleRange.setEndAfter(last);\n const middle = middleRange.extractContents();\n\n const frag = document.createDocumentFragment();\n if (before.childNodes.length) {\n const b = document.createElement(tag);\n while (before.firstChild) b.appendChild(before.firstChild);\n frag.appendChild(b);\n }\n while (middle.firstChild) frag.appendChild(middle.firstChild);\n if (after.childNodes.length) {\n const a = document.createElement(tag);\n while (after.firstChild) a.appendChild(after.firstChild);\n frag.appendChild(a);\n }\n parent.insertBefore(frag, common);\n parent.removeChild(common);\n }\n } else {\n textNodes.forEach(txt => {\n let n: Node | null = txt;\n while (n && n !== root) {\n if (n instanceof HTMLElement && isMatch(n)) {\n unwrap(n);\n break;\n }\n n = n.parentNode;\n }\n });\n }\n } else {\n textNodes.forEach(txt => {\n const skip = txt.parentElement?.closest('a, .mention, nile-mention');\n if (skip) return;\n const wrapper = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k, v]) => wrapper.setAttribute(k, v));\n txt.parentNode?.insertBefore(wrapper, txt);\n wrapper.appendChild(txt);\n });\n }\n\n removeEmptyAndNested(root);\n mergeAdjacent(root);\n\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\nexport function setBlockTag(root: HTMLElement, tag: 'p' | 'h1' | 'h2' | 'h3') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root);\n if (!block) return;\n if (block.tagName.toLowerCase() === tag) return;\n const nb = document.createElement(tag);\n while (block.firstChild) nb.appendChild(block.firstChild);\n block.replaceWith(nb);\n const r = document.createRange();\n r.selectNodeContents(nb);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n}\n\nexport function setAlignment(root: HTMLElement, alignment: string) {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const blocks: HTMLElement[] = [];\n const walker = document.createTreeWalker(\n commonAncestor,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node) => {\n const el = node as HTMLElement;\n if (\n range.intersectsNode(el) &&\n /^(P|DIV|LI|H[1-6])$/.test(el.tagName)\n ) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n }\n );\n\n let node = walker.nextNode();\n while (node) {\n blocks.push(node as HTMLElement);\n node = walker.nextNode();\n }\n\n if (blocks.length === 0) {\n const block = closestBlock(selection.focusNode, root);\n if (block) blocks.push(block);\n }\n blocks.forEach((block) => {\n block.style.textAlign = alignment;\n });\n}\n\n\nexport function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const span = document.createElement('span');\n span.style.fontFamily = family;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange();\n r.setStart(span.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n}\n\nfunction enclosingStyledSpan(\n editor: HTMLElement,\n node: Node | null,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n): HTMLSpanElement | null {\n while (node && node !== editor) {\n if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\n\nfunction applyInlineStyle(\n editor: HTMLElement,\n cssProp: 'color' | 'backgroundColor',\n value: string,\n dataAttr: 'data-rte-color' | 'data-rte-bg'\n) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r0 = sel.getRangeAt(0);\n if (!editor.contains(r0.commonAncestorContainer)) return;\n\n const range = r0.cloneRange();\n\n if (range.collapsed) {\n const enclosing = enclosingStyledSpan(\n editor,\n range.startContainer,\n dataAttr\n );\n if (enclosing) {\n (enclosing.style as any)[cssProp] = value;\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = value;\n s.appendChild(document.createTextNode('\\u200B'));\n range.insertNode(s);\n\n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges();\n sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\n if (leftEdge && leftEdge === rightEdge) {\n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\n\n const sel = window.getSelection();\n const r = document.createRange();\n r.selectNodeContents(mid);\n sel?.removeAllRanges();\n sel?.addRange(r);\n }\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n const commonEl = (() => {\n let n: Node | null = range.commonAncestorContainer;\n while (n && !(n instanceof HTMLElement)) n = n.parentNode;\n return n as HTMLElement | null;\n })();\n\n const walker = document.createTreeWalker(\n commonEl || editor,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: n => {\n if (!n.nodeValue || !n.nodeValue.trim())\n return NodeFilter.FILTER_REJECT;\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n }\n );\n\n const toProcess: Text[] = [];\n let t: Node | null;\n while ((t = walker.nextNode())) toProcess.push(t as Text);\n\n toProcess.forEach(text => {\n let start = 0,\n end = text.length;\n if (text === range.startContainer) start = range.startOffset;\n if (text === range.endContainer) end = range.endOffset;\n if (start > 0) text = text.splitText(start);\n if (end < text.length) text.splitText(end);\n\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n const span = document.createElement('span');\n span.setAttribute(dataAttr, '1');\n (span.style as any)[cssProp] = value;\n const parent = text.parentElement!;\n parent.replaceChild(span, text);\n span.appendChild(text);\n });\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n\n // restore selection\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n// Is the range covering the entire node's contents?\nfunction rangeCoversWholeNode(range: Range, node: Node): boolean {\n const all = document.createRange();\n all.selectNodeContents(node);\n return (\n range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, all) >= 0\n );\n}\n\nfunction hasRangeContent(r: Range): boolean {\n if (r.collapsed) return false;\n const text = r.cloneContents().textContent || '';\n return text.length > 0;\n}\n\n// Split one styled span into [left][middle][right]; recolor only middle\nfunction splitAndRecolorWithinSpan(\n span: HTMLSpanElement,\n range: Range,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor',\n newValue: string\n): HTMLSpanElement {\n const oldValue = (span.style as any)[cssProp];\n\n const left = document.createRange();\n left.setStart(span, 0);\n left.setEnd(range.startContainer, range.startOffset);\n\n const right = document.createRange();\n right.setStart(range.endContainer, range.endOffset);\n right.setEnd(span, span.childNodes.length);\n\n // Build replacement fragment\n const frag = document.createDocumentFragment();\n\n // helper to make a styled clone shell\n const makeShell = (val: string) => {\n const s = document.createElement('span');\n s.setAttribute(dataAttr, '1');\n (s.style as any)[cssProp] = val;\n return s;\n };\n\n if (hasRangeContent(left)) {\n const sLeft = makeShell(oldValue);\n sLeft.appendChild(left.cloneContents());\n frag.appendChild(sLeft);\n }\n\n const mid = makeShell(newValue);\n mid.appendChild(range.cloneContents());\n frag.appendChild(mid);\n\n if (hasRangeContent(right)) {\n const sRight = makeShell(oldValue);\n sRight.appendChild(right.cloneContents());\n frag.appendChild(sRight);\n }\n\n span.replaceWith(frag);\n return mid;\n}\n\nfunction mergeAdjacentStyledSpans(\n root: HTMLElement,\n dataAttr: 'data-rte-color' | 'data-rte-bg',\n cssProp: 'color' | 'backgroundColor'\n) {\n const spans = Array.from(\n root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n\n const valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\n spans.forEach(s => {\n const nested = Array.from(\n s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`)\n );\n nested.forEach(child => {\n if (valOf(child) === valOf(s)) {\n while (child.firstChild) s.insertBefore(child.firstChild, child);\n child.remove();\n }\n });\n\n const prev = s.previousSibling;\n if (\n prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)\n ) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return;\n }\n\n const next = s.nextSibling;\n if (\n next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)\n ) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\n });\n}\n\nexport function setForeColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'color', hex, 'data-rte-color');\n}\nexport function setBackColor(editor: HTMLElement, hex: string) {\n applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');\n}\n\nexport function toggleList(root: HTMLElement, kind: 'ul' | 'ol') {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n function styleList(list: HTMLElement) {\n list.style.paddingInlineStart = '0';\n list.style.margin = '0';\n }\n\n function isEmptyBlock(el: HTMLElement) {\n return !el.textContent?.trim() && !el.querySelector('img,br');\n }\n\n function setCursorInside(el: HTMLElement) {\n const selection = document.getSelection();\n if (!selection) return;\n const r = document.createRange();\n r.selectNodeContents(el);\n r.collapse(true);\n selection.removeAllRanges();\n selection.addRange(r);\n }\n\n function closestBlock(node: Node | null): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (\n node.tagName.match(/^(P|DIV|H[1-6]|LI)$/) ||\n display === 'block' ||\n display === 'list-item'\n )\n return node;\n }\n node = node.parentNode;\n }\n return null;\n }\n\n function unwrapList(list: HTMLElement) {\n const frag = document.createDocumentFragment();\n (Array.from(list.querySelectorAll('li')) as HTMLElement[]).forEach((li) => {\n const p = document.createElement('p');\n if (li.style.textAlign) p.style.textAlign = li.style.textAlign; \n while (li.firstChild) p.appendChild(li.firstChild);\n frag.appendChild(p);\n });\n list.replaceWith(frag);\n }\n \n function unwrapListItem(block: HTMLElement) {\n const li = block.closest('li');\n if (!li) return;\n const list = li.parentElement as HTMLElement;\n const p = document.createElement('p');\n if (li.style.textAlign) p.style.textAlign = li.style.textAlign; \n while (li.firstChild) p.appendChild(li.firstChild);\n list.parentNode?.insertBefore(p, list.nextSibling);\n li.remove();\n if (list.childNodes.length === 0) list.remove();\n setCursorInside(p);\n }\n \n\n function switchListType(list: HTMLElement, newType: 'ul' | 'ol') {\n const newList = document.createElement(newType);\n styleList(newList);\n while (list.firstChild) newList.appendChild(list.firstChild);\n list.replaceWith(newList);\n }\n if (range.collapsed) {\n const block = closestBlock(range.startContainer);\n const insideList = block?.closest('ul,ol') as HTMLElement | null;\n if (insideList && insideList.tagName.toLowerCase() === kind) {\n unwrapListItem(block as HTMLElement);\n return;\n }\n\n if (insideList && insideList.tagName.toLowerCase() !== kind) {\n switchListType(insideList, kind);\n return;\n }\n if (!block || block === root || block.childNodes.length === 0 || isEmptyBlock(block)) {\n const list = document.createElement(kind);\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n list.appendChild(li);\n styleList(list);\n range.insertNode(list);\n setCursorInside(li);\n return;\n }\n const list = document.createElement(kind);\n styleList(list);\n const li = document.createElement('li');\n if (block.style.textAlign) li.style.textAlign = block.style.textAlign;\n while (block.firstChild) li.appendChild(block.firstChild);\n list.appendChild(li);\n block.replaceWith(list);\n setCursorInside(li);\n return;\n }\n\n const blocks: HTMLElement[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (n) => {\n if (!(n instanceof HTMLElement)) return NodeFilter.FILTER_SKIP;\n if (!/^(P|DIV|LI|H[1-6])$/.test(n.tagName)) return NodeFilter.FILTER_SKIP;\n const r = document.createRange();\n r.selectNodeContents(n);\n const intersects =\n range.compareBoundaryPoints(Range.END_TO_START, r) < 0 &&\n range.compareBoundaryPoints(Range.START_TO_END, r) > 0;\n return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n let n: Node | null;\n while ((n = walker.nextNode())) blocks.push(n as HTMLElement);\n\n if (blocks.length === 0) {\n const block = closestBlock(range.startContainer);\n if (block) blocks.push(block);\n }\n\n const firstLi = blocks[0].closest('li');\n if (firstLi) {\n const currentList = firstLi.closest('ul,ol') as HTMLElement | null;\n if (!currentList) return;\n if (currentList.tagName.toLowerCase() === kind) unwrapList(currentList);\n else switchListType(currentList, kind);\n return;\n }\n const newList = document.createElement(kind);\n styleList(newList);\n for (const block of blocks) {\n const li = document.createElement('li');\n if (block.style.textAlign) li.style.textAlign = block.style.textAlign;\n while (block.firstChild) li.appendChild(block.firstChild);\n newList.appendChild(li);\n }\n blocks[0].replaceWith(newList);\n for (let i = 1; i < blocks.length; i++) blocks[i].remove();\n}\n\n\n\n\n\nexport function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n let n: Node | null = range.startContainer;\n let a: HTMLAnchorElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLAnchorElement) {\n a = n;\n break;\n }\n n = n.parentNode;\n }\n\n const url =\n href ??\n (typeof window !== 'undefined'\n ? window.prompt('Enter URL', a?.href || 'https://') || ''\n : '');\n if (!url) return;\n\n if (a) {\n a.href = url;\n return;\n }\n\n if (range.collapsed) {\n const link = document.createElement('a');\n link.href = url;\n link.textContent = url;\n range.insertNode(link);\n const r = document.createRange();\n r.setStartAfter(link);\n r.collapse(true);\n sel?.removeAllRanges();\n sel.addRange(r);\n return;\n }\n\n const link = document.createElement('a');\n link.href = url;\n try {\n range.surroundContents(link);\n } catch {\n const frag = range.extractContents();\n link.appendChild(frag);\n range.insertNode(link);\n }\n}\n"]}
|