textarea-pattern-handler
Version:
A TypeScript utility for handling textarea patterns and DOM manipulation
71 lines (70 loc) • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.removeTrailingBR = exports.cleanHtmlContent = exports.cleanTextContent = exports.setSelectionToRange = exports.createNewRange = exports.getCurrentSelection = exports.createTagElement = exports.createEmptyTextNode = exports.createBRNode = exports.createSpaceNode = exports.createTextNode = void 0;
// DOM Manipulation Helpers
const createTextNode = (text) => document.createTextNode(text);
exports.createTextNode = createTextNode;
const createSpaceNode = () => (0, exports.createTextNode)(' ');
exports.createSpaceNode = createSpaceNode;
const createBRNode = () => document.createElement('br');
exports.createBRNode = createBRNode;
const createEmptyTextNode = () => (0, exports.createTextNode)('\u200B');
exports.createEmptyTextNode = createEmptyTextNode;
const createTagElement = (tagContent, tagId) => {
const tag = document.createElement('span');
tag.id = tagId;
tag.className = 'tag';
tag.contentEditable = 'false';
tag.textContent = tagContent;
return tag;
};
exports.createTagElement = createTagElement;
// Selection and Range Helpers
const getCurrentSelection = () => {
const selection = window.getSelection();
if (!selection || selection.rangeCount === 0)
return null;
return selection;
};
exports.getCurrentSelection = getCurrentSelection;
const createNewRange = (startNode, startOffset = 0) => {
const range = document.createRange();
range.setStart(startNode, startOffset);
range.collapse(true);
return range;
};
exports.createNewRange = createNewRange;
const setSelectionToRange = (range) => {
const selection = window.getSelection();
if (selection) {
selection.removeAllRanges();
selection.addRange(range);
}
};
exports.setSelectionToRange = setSelectionToRange;
// Content Cleaning Helpers
const cleanTextContent = (text) => {
return text
.replace(/\u200B/g, '')
.replace(/^\s+/, '')
.replace(/\n+$/, '');
};
exports.cleanTextContent = cleanTextContent;
const cleanHtmlContent = (html) => {
return html
.replace(/<br\s*\/?>\s*<br\s*\/?>/g, '<br>')
.replace(/^\s+/, '')
.replace(/<br\s*\/?>\s*$/, '');
};
exports.cleanHtmlContent = cleanHtmlContent;
const removeTrailingBR = (box) => {
var _a;
const lastChild = box.lastChild;
if (lastChild && lastChild.nodeName === 'BR') {
const nextSibling = lastChild.nextSibling;
if (!nextSibling || (nextSibling.nodeType === Node.TEXT_NODE && !((_a = nextSibling.textContent) === null || _a === void 0 ? void 0 : _a.trim()))) {
lastChild.remove();
}
}
};
exports.removeTrailingBR = removeTrailingBR;