@aquera/nile-elements 0.1.67-beta-1.2 → 0.1.67-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/demo/index.html +9 -9
- package/dist/index.js +31 -29
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +3 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
- 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/nile-rich-text-editor.css.js +3 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +64 -8
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
- package/dist/src/nile-rich-text-editor/utils.d.ts +2 -2
- package/dist/src/nile-rich-text-editor/utils.js +181 -27
- 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/nile-rich-text-editor.css.ts +3 -1
- package/src/nile-rich-text-editor/nile-rich-text-editor.ts +89 -11
- package/src/nile-rich-text-editor/utils.ts +248 -26
- package/vscode-html-custom-data.json +1 -1
@@ -127,41 +127,195 @@ export function setFontFamily(root, family) {
|
|
127
127
|
}
|
128
128
|
surroundInline(range, 'span', { style: `font-family:${family}` });
|
129
129
|
}
|
130
|
-
|
130
|
+
function enclosingStyledSpan(editor, node, dataAttr) {
|
131
|
+
while (node && node !== editor) {
|
132
|
+
if (node instanceof HTMLSpanElement && node.hasAttribute(dataAttr)) {
|
133
|
+
return node;
|
134
|
+
}
|
135
|
+
node = node.parentNode;
|
136
|
+
}
|
137
|
+
return null;
|
138
|
+
}
|
139
|
+
function applyInlineStyle(editor, cssProp, value, dataAttr) {
|
131
140
|
const sel = window.getSelection();
|
132
141
|
if (!sel || sel.rangeCount === 0)
|
133
142
|
return;
|
134
|
-
const
|
135
|
-
if (!
|
136
|
-
return;
|
137
|
-
const span = document.createElement('span');
|
138
|
-
span.style.backgroundColor = color;
|
139
|
-
span.appendChild(range.extractContents());
|
140
|
-
range.insertNode(span);
|
141
|
-
const after = document.createRange();
|
142
|
-
after.setStartAfter(span);
|
143
|
-
after.collapse(true);
|
144
|
-
sel.removeAllRanges();
|
145
|
-
sel.addRange(after);
|
146
|
-
}
|
147
|
-
export function setForeColor(root, color) {
|
148
|
-
const sel = document.getSelection();
|
149
|
-
if (!sel || sel.rangeCount === 0)
|
143
|
+
const r0 = sel.getRangeAt(0);
|
144
|
+
if (!editor.contains(r0.commonAncestorContainer))
|
150
145
|
return;
|
151
|
-
const range =
|
146
|
+
const range = r0.cloneRange();
|
152
147
|
if (range.collapsed) {
|
153
|
-
const
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
148
|
+
const enclosing = enclosingStyledSpan(editor, range.startContainer, dataAttr);
|
149
|
+
if (enclosing) {
|
150
|
+
enclosing.style[cssProp] = value;
|
151
|
+
mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
|
152
|
+
return;
|
153
|
+
}
|
154
|
+
const s = document.createElement('span');
|
155
|
+
s.setAttribute(dataAttr, '1');
|
156
|
+
s.style[cssProp] = value;
|
157
|
+
s.appendChild(document.createTextNode('\u200B'));
|
158
|
+
range.insertNode(s);
|
159
|
+
const caret = document.createRange();
|
160
|
+
caret.setStart(s.firstChild, 1);
|
161
|
+
caret.collapse(true);
|
160
162
|
sel.removeAllRanges();
|
161
|
-
sel.addRange(
|
163
|
+
sel.addRange(caret);
|
164
|
+
mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
|
162
165
|
return;
|
163
166
|
}
|
164
|
-
|
167
|
+
const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);
|
168
|
+
const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);
|
169
|
+
if (leftEdge && leftEdge === rightEdge) {
|
170
|
+
if (rangeCoversWholeNode(range, leftEdge)) {
|
171
|
+
leftEdge.style[cssProp] = value;
|
172
|
+
}
|
173
|
+
else {
|
174
|
+
const mid = splitAndRecolorWithinSpan(leftEdge, range, dataAttr, cssProp, value);
|
175
|
+
const sel = window.getSelection();
|
176
|
+
const r = document.createRange();
|
177
|
+
r.selectNodeContents(mid);
|
178
|
+
sel?.removeAllRanges();
|
179
|
+
sel?.addRange(r);
|
180
|
+
}
|
181
|
+
mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
|
182
|
+
return;
|
183
|
+
}
|
184
|
+
const commonEl = (() => {
|
185
|
+
let n = range.commonAncestorContainer;
|
186
|
+
while (n && !(n instanceof HTMLElement))
|
187
|
+
n = n.parentNode;
|
188
|
+
return n;
|
189
|
+
})();
|
190
|
+
const walker = document.createTreeWalker(commonEl || editor, NodeFilter.SHOW_TEXT, {
|
191
|
+
acceptNode: (n) => {
|
192
|
+
if (!n.nodeValue || !n.nodeValue.trim())
|
193
|
+
return NodeFilter.FILTER_REJECT;
|
194
|
+
const nodeRange = document.createRange();
|
195
|
+
nodeRange.selectNodeContents(n);
|
196
|
+
const intersects = range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&
|
197
|
+
range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0;
|
198
|
+
return intersects ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
|
199
|
+
}
|
200
|
+
});
|
201
|
+
const toProcess = [];
|
202
|
+
let t;
|
203
|
+
while ((t = walker.nextNode()))
|
204
|
+
toProcess.push(t);
|
205
|
+
toProcess.forEach((text) => {
|
206
|
+
let start = 0, end = text.length;
|
207
|
+
if (text === range.startContainer)
|
208
|
+
start = range.startOffset;
|
209
|
+
if (text === range.endContainer)
|
210
|
+
end = range.endOffset;
|
211
|
+
if (start > 0)
|
212
|
+
text = text.splitText(start);
|
213
|
+
if (end < text.length)
|
214
|
+
text.splitText(end);
|
215
|
+
// If this slice already sits in a styled span → update it, don’t nest.
|
216
|
+
const existing = enclosingStyledSpan(editor, text, dataAttr);
|
217
|
+
if (existing) {
|
218
|
+
existing.style[cssProp] = value;
|
219
|
+
return;
|
220
|
+
}
|
221
|
+
// Create a new, single-purpose span
|
222
|
+
const span = document.createElement('span');
|
223
|
+
span.setAttribute(dataAttr, '1');
|
224
|
+
span.style[cssProp] = value;
|
225
|
+
const parent = text.parentElement;
|
226
|
+
parent.replaceChild(span, text);
|
227
|
+
span.appendChild(text);
|
228
|
+
});
|
229
|
+
mergeAdjacentStyledSpans(editor, dataAttr, cssProp);
|
230
|
+
// restore selection
|
231
|
+
sel.removeAllRanges();
|
232
|
+
sel.addRange(range);
|
233
|
+
}
|
234
|
+
// Is the range covering the entire node's contents?
|
235
|
+
function rangeCoversWholeNode(range, node) {
|
236
|
+
const all = document.createRange();
|
237
|
+
all.selectNodeContents(node);
|
238
|
+
return (range.compareBoundaryPoints(Range.START_TO_START, all) <= 0 &&
|
239
|
+
range.compareBoundaryPoints(Range.END_TO_END, all) >= 0);
|
240
|
+
}
|
241
|
+
function hasRangeContent(r) {
|
242
|
+
if (r.collapsed)
|
243
|
+
return false;
|
244
|
+
const text = r.cloneContents().textContent || '';
|
245
|
+
return text.length > 0;
|
246
|
+
}
|
247
|
+
// Split one styled span into [left][middle][right]; recolor only middle
|
248
|
+
function splitAndRecolorWithinSpan(span, range, dataAttr, cssProp, newValue) {
|
249
|
+
const oldValue = span.style[cssProp];
|
250
|
+
const left = document.createRange();
|
251
|
+
left.setStart(span, 0);
|
252
|
+
left.setEnd(range.startContainer, range.startOffset);
|
253
|
+
const right = document.createRange();
|
254
|
+
right.setStart(range.endContainer, range.endOffset);
|
255
|
+
right.setEnd(span, span.childNodes.length);
|
256
|
+
// Build replacement fragment
|
257
|
+
const frag = document.createDocumentFragment();
|
258
|
+
// helper to make a styled clone shell
|
259
|
+
const makeShell = (val) => {
|
260
|
+
const s = document.createElement('span');
|
261
|
+
s.setAttribute(dataAttr, '1');
|
262
|
+
s.style[cssProp] = val;
|
263
|
+
return s;
|
264
|
+
};
|
265
|
+
if (hasRangeContent(left)) {
|
266
|
+
const sLeft = makeShell(oldValue);
|
267
|
+
sLeft.appendChild(left.cloneContents());
|
268
|
+
frag.appendChild(sLeft);
|
269
|
+
}
|
270
|
+
const mid = makeShell(newValue);
|
271
|
+
mid.appendChild(range.cloneContents());
|
272
|
+
frag.appendChild(mid);
|
273
|
+
if (hasRangeContent(right)) {
|
274
|
+
const sRight = makeShell(oldValue);
|
275
|
+
sRight.appendChild(right.cloneContents());
|
276
|
+
frag.appendChild(sRight);
|
277
|
+
}
|
278
|
+
// Replace original span
|
279
|
+
span.replaceWith(frag);
|
280
|
+
return mid; // return the middle span so caller can restore selection
|
281
|
+
}
|
282
|
+
function mergeAdjacentStyledSpans(root, dataAttr, cssProp) {
|
283
|
+
const spans = Array.from(root.querySelectorAll(`span[${dataAttr}]`));
|
284
|
+
const valOf = (el) => el.style[cssProp];
|
285
|
+
spans.forEach((s) => {
|
286
|
+
const nested = Array.from(s.querySelectorAll(`span[${dataAttr}]`));
|
287
|
+
nested.forEach((child) => {
|
288
|
+
if (valOf(child) === valOf(s)) {
|
289
|
+
while (child.firstChild)
|
290
|
+
s.insertBefore(child.firstChild, child);
|
291
|
+
child.remove();
|
292
|
+
}
|
293
|
+
});
|
294
|
+
const prev = s.previousSibling;
|
295
|
+
if (prev instanceof HTMLSpanElement &&
|
296
|
+
prev.hasAttribute(dataAttr) &&
|
297
|
+
valOf(prev) === valOf(s)) {
|
298
|
+
while (s.firstChild)
|
299
|
+
prev.appendChild(s.firstChild);
|
300
|
+
s.remove();
|
301
|
+
return; // s is gone, next checks not needed
|
302
|
+
}
|
303
|
+
// 3) Merge with next sibling if identical
|
304
|
+
const next = s.nextSibling;
|
305
|
+
if (next instanceof HTMLSpanElement &&
|
306
|
+
next.hasAttribute(dataAttr) &&
|
307
|
+
valOf(next) === valOf(s)) {
|
308
|
+
while (next.firstChild)
|
309
|
+
s.appendChild(next.firstChild);
|
310
|
+
next.remove();
|
311
|
+
}
|
312
|
+
});
|
313
|
+
}
|
314
|
+
export function setForeColor(editor, hex) {
|
315
|
+
applyInlineStyle(editor, 'color', hex, 'data-rte-color');
|
316
|
+
}
|
317
|
+
export function setBackColor(editor, hex) {
|
318
|
+
applyInlineStyle(editor, 'backgroundColor', hex, 'data-rte-bg');
|
165
319
|
}
|
166
320
|
export function toggleList(root, kind) {
|
167
321
|
const sel = document.getSelection();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// src/nile-rich-text-editor/utils.ts\nexport function closestBlock(node: Node | null, root: HTMLElement): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) || display === 'block' || display === 'list-item') {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n }\n \n export 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 \n export 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 \n export function unwrap(node: HTMLElement) {\n const p = node.parentNode; if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n }\n \n export function surroundInline(range: Range, tag: string, attrs?: Record<string,string>) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => wrap.setAttribute(k, v));\n try { range.surroundContents(wrap); }\n catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n }\n \n export function toggleInlineTag(root: HTMLElement, tag: 'strong'|'em'|'u'|'span', attrs?: Record<string,string>) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n \n if (range.collapsed) {\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 const r = document.createRange();\n r.setStart(elm.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n let n: Node | null = range.startContainer;\n let target: HTMLElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLElement && n.tagName.toLowerCase() === tag) { target = n; break; }\n n = n.parentNode;\n }\n if (target) unwrap(target); else surroundInline(range, tag, attrs);\n }\n \n export function setBlockTag(root: HTMLElement, tag: 'p'|'h1'|'h2'|'h3') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); 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(); r.selectNodeContents(nb); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n }\n \n export function setAlignment(root: HTMLElement, align: 'left'|'center'|'right'|'justify') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n block.style.textAlign = align === 'justify' ? 'justify' : align;\n }\n \n export function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection(); 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(); r.setStart(span.firstChild!, 1); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n }\n\nexport function setBackColor(rootEl: HTMLElement, color: string) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (!rootEl.contains(range.commonAncestorContainer) || range.collapsed) return;\n\n const span = document.createElement('span');\n span.style.backgroundColor = color;\n span.appendChild(range.extractContents());\n range.insertNode(span);\n const after = document.createRange();\n after.setStartAfter(span);\n after.collapse(true);\n sel.removeAllRanges();\n sel.addRange(after);\n}\n\n \n export function setForeColor(root: HTMLElement, color: string) {\n const sel = document.getSelection(); 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.color = color;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const r = document.createRange(); r.setStart(span.firstChild!, 1); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `color:${color}` });\n }\n \n export function toggleList(root: HTMLElement, kind: 'ul'|'ol') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n \n let li = block.closest('li');\n if (li) {\n const list = li.closest('ul,ol') as HTMLElement | null;\n if (!list) return;\n if (list.tagName.toLowerCase() === kind) {\n const parent = list.parentElement!;\n const frag = document.createDocumentFragment();\n for (const child of Array.from(list.children)) {\n if (child.tagName.toLowerCase() === 'li') {\n const p = document.createElement('p');\n while (child.firstChild) p.appendChild(child.firstChild);\n frag.appendChild(p);\n }\n }\n parent.replaceChild(frag, list);\n } else {\n const newList = document.createElement(kind);\n while (list.firstChild) newList.appendChild(list.firstChild);\n list.replaceWith(newList);\n }\n return;\n }\n \n const list = document.createElement(kind);\n const item = document.createElement('li'); list.appendChild(item);\n while (block.firstChild) item.appendChild(block.firstChild);\n block.replaceWith(list);\n }\n \n export function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection(); 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) { if (n instanceof HTMLAnchorElement) { a = n; break; } n = n.parentNode; }\n \n const url = href ?? (typeof window !== 'undefined' ? window.prompt('Enter URL', a?.href || 'https://') || '' : '');\n if (!url) return;\n \n if (a) { a.href = url; return; }\n \n if (range.collapsed) {\n const link = document.createElement('a'); link.href = url; link.textContent = url; range.insertNode(link);\n const r = document.createRange(); r.setStartAfter(link); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n const link = document.createElement('a'); link.href = url;\n try { range.surroundContents(link); }\n catch { const frag = range.extractContents(); link.appendChild(frag); range.insertNode(link); }\n }\n "]}
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// src/nile-rich-text-editor/utils.ts\nexport function closestBlock(node: Node | null, root: HTMLElement): HTMLElement | null {\n while (node && node !== root) {\n if (node instanceof HTMLElement) {\n const display = getComputedStyle(node).display;\n if (node.tagName.match(/^(P|DIV|H1|H2|H3|H4|H5|H6|LI)$/) || display === 'block' || display === 'list-item') {\n return node;\n }\n }\n node = node?.parentNode || null;\n }\n return root;\n }\n \n export 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 \n export 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 \n export function unwrap(node: HTMLElement) {\n const p = node.parentNode; if (!p) return;\n while (node.firstChild) p.insertBefore(node.firstChild, node);\n p.removeChild(node);\n }\n \n export function surroundInline(range: Range, tag: string, attrs?: Record<string,string>) {\n const wrap = document.createElement(tag);\n if (attrs) Object.entries(attrs).forEach(([k,v]) => wrap.setAttribute(k, v));\n try { range.surroundContents(wrap); }\n catch {\n const frag = range.extractContents();\n wrap.appendChild(frag);\n range.insertNode(wrap);\n }\n }\n \n export function toggleInlineTag(root: HTMLElement, tag: 'strong'|'em'|'u'|'span', attrs?: Record<string,string>) {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n \n if (range.collapsed) {\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 const r = document.createRange();\n r.setStart(elm.firstChild!, 1);\n r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n let n: Node | null = range.startContainer;\n let target: HTMLElement | null = null;\n while (n && n !== root) {\n if (n instanceof HTMLElement && n.tagName.toLowerCase() === tag) { target = n; break; }\n n = n.parentNode;\n }\n if (target) unwrap(target); else surroundInline(range, tag, attrs);\n }\n \n export function setBlockTag(root: HTMLElement, tag: 'p'|'h1'|'h2'|'h3') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); 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(); r.selectNodeContents(nb); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n }\n \n export function setAlignment(root: HTMLElement, align: 'left'|'center'|'right'|'justify') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n block.style.textAlign = align === 'justify' ? 'justify' : align;\n }\n \n export function setFontFamily(root: HTMLElement, family: string) {\n const sel = document.getSelection(); 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(); r.setStart(span.firstChild!, 1); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n surroundInline(range, 'span', { style: `font-family:${family}` });\n }\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\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 \n if (range.collapsed) {\n const enclosing = enclosingStyledSpan(editor, range.startContainer, dataAttr);\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 \n const caret = document.createRange();\n caret.setStart(s.firstChild!, 1);\n caret.collapse(true);\n sel.removeAllRanges(); sel.addRange(caret);\n\n mergeAdjacentStyledSpans(editor, dataAttr, cssProp);\n return;\n }\n\n \n const leftEdge = enclosingStyledSpan(editor, range.startContainer, dataAttr);\n const rightEdge = enclosingStyledSpan(editor, range.endContainer, dataAttr);\n if (leftEdge && leftEdge === rightEdge) {\n \n if (rangeCoversWholeNode(range, leftEdge)) {\n (leftEdge.style as any)[cssProp] = value;\n } else {\n \n const mid = splitAndRecolorWithinSpan(\n leftEdge,\n range,\n dataAttr,\n cssProp,\n value\n );\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 \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()) 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 \n let start = 0, 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 // If this slice already sits in a styled span → update it, don’t nest.\n const existing = enclosingStyledSpan(editor, text, dataAttr);\n if (existing) {\n (existing.style as any)[cssProp] = value;\n return;\n }\n\n // Create a new, single-purpose span\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(); 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 // Replace original span\n span.replaceWith(frag);\n return mid; // return the middle span so caller can restore selection\n}\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(root.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\n\n const valOf = (el: HTMLElement) => (el.style as any)[cssProp];\n\n spans.forEach((s) => {\n \n const nested = Array.from(s.querySelectorAll<HTMLSpanElement>(`span[${dataAttr}]`));\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 \n const prev = s.previousSibling;\n if (prev instanceof HTMLSpanElement &&\n prev.hasAttribute(dataAttr) &&\n valOf(prev) === valOf(s)) {\n while (s.firstChild) prev.appendChild(s.firstChild);\n s.remove();\n return; // s is gone, next checks not needed\n }\n\n // 3) Merge with next sibling if identical\n const next = s.nextSibling;\n if (next instanceof HTMLSpanElement &&\n next.hasAttribute(dataAttr) &&\n valOf(next) === valOf(s)) {\n while (next.firstChild) s.appendChild(next.firstChild);\n next.remove();\n }\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\n\n export function toggleList(root: HTMLElement, kind: 'ul'|'ol') {\n const sel = document.getSelection(); if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const block = closestBlock(range.startContainer, root); if (!block) return;\n \n let li = block.closest('li');\n if (li) {\n const list = li.closest('ul,ol') as HTMLElement | null;\n if (!list) return;\n if (list.tagName.toLowerCase() === kind) {\n const parent = list.parentElement!;\n const frag = document.createDocumentFragment();\n for (const child of Array.from(list.children)) {\n if (child.tagName.toLowerCase() === 'li') {\n const p = document.createElement('p');\n while (child.firstChild) p.appendChild(child.firstChild);\n frag.appendChild(p);\n }\n }\n parent.replaceChild(frag, list);\n } else {\n const newList = document.createElement(kind);\n while (list.firstChild) newList.appendChild(list.firstChild);\n list.replaceWith(newList);\n }\n return;\n }\n \n const list = document.createElement(kind);\n const item = document.createElement('li'); list.appendChild(item);\n while (block.firstChild) item.appendChild(block.firstChild);\n block.replaceWith(list);\n }\n \n export function insertOrEditLink(root: HTMLElement, href?: string) {\n const sel = document.getSelection(); 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) { if (n instanceof HTMLAnchorElement) { a = n; break; } n = n.parentNode; }\n \n const url = href ?? (typeof window !== 'undefined' ? window.prompt('Enter URL', a?.href || 'https://') || '' : '');\n if (!url) return;\n \n if (a) { a.href = url; return; }\n \n if (range.collapsed) {\n const link = document.createElement('a'); link.href = url; link.textContent = url; range.insertNode(link);\n const r = document.createRange(); r.setStartAfter(link); r.collapse(true);\n sel.removeAllRanges(); sel.addRange(r);\n return;\n }\n \n const link = document.createElement('a'); link.href = url;\n try { range.surroundContents(link); }\n catch { const frag = range.extractContents(); link.appendChild(frag); range.insertNode(link); }\n }\n "]}
|