TelegramPWA/src/util/selection.ts
2023-02-08 00:43:48 +01:00

51 lines
1.3 KiB
TypeScript

const extractorEl = document.createElement('div');
export function insertHtmlInSelection(html: string) {
const selection = window.getSelection();
if (selection?.getRangeAt && selection.rangeCount) {
const range = selection.getRangeAt(0);
range.deleteContents();
const fragment = range.createContextualFragment(html);
const lastInsertedNode = fragment.lastChild;
range.insertNode(fragment);
if (lastInsertedNode) {
range.setStartAfter(lastInsertedNode);
range.setEndAfter(lastInsertedNode);
} else {
range.collapse(false);
}
selection.removeAllRanges();
selection.addRange(range);
}
}
export function getHtmlBeforeSelection(container?: HTMLElement, useCommonAncestor?: boolean) {
if (!container) {
return '';
}
const sel = window.getSelection();
if (!sel || !sel.rangeCount) {
return container.innerHTML;
}
const range = sel.getRangeAt(0).cloneRange();
if (!range.intersectsNode(container)) {
return container.innerHTML;
}
if (!useCommonAncestor && !container.contains(range.commonAncestorContainer)) {
return '';
}
range.collapse(true);
range.setStart(container, 0);
extractorEl.innerHTML = '';
extractorEl.appendChild(range.cloneContents());
return extractorEl.innerHTML;
}