@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
51 lines • 8.45 kB
JavaScript
import { CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_SPACE, svgNodeFilter, } from '@taiga-ui/cdk/constants';
/**
* Creates a cloned range with its boundaries set at word boundaries
*
* @param currentRange a range to clone
* @return modified range
*/
export function tuiGetWordRange(currentRange) {
const range = currentRange.cloneRange();
const { startContainer, startOffset, endContainer, endOffset } = range;
const { ownerDocument } = startContainer;
if (!ownerDocument) {
return range;
}
const treeWalker = ownerDocument.createTreeWalker(ownerDocument.body, NodeFilter.SHOW_TEXT, svgNodeFilter);
treeWalker.currentNode = startContainer;
do {
const container = treeWalker.currentNode;
const textContent = container.textContent || '';
const content = container === startContainer
? textContent.slice(0, Math.max(0, startOffset + 1))
: textContent;
const offset = Math.max(content.lastIndexOf(' '), content.lastIndexOf('\n'), content.lastIndexOf(CHAR_NO_BREAK_SPACE), content.lastIndexOf(CHAR_ZERO_WIDTH_SPACE)) + 1;
range.setStart(container, 0);
if (offset) {
range.setStart(container, offset);
break;
}
} while (treeWalker.previousNode());
treeWalker.currentNode = endContainer;
do {
const container = treeWalker.currentNode;
const textContent = container.textContent || '';
const content = container === endContainer ? textContent.slice(endOffset + 1) : textContent;
const offset = [
content.indexOf(' '),
content.lastIndexOf('\n'),
content.indexOf(CHAR_NO_BREAK_SPACE),
content.indexOf(CHAR_ZERO_WIDTH_SPACE),
].reduce((result, item) => result === -1 || item === -1
? Math.max(result, item)
: Math.min(result, item), -1);
range.setEnd(container, textContent.length);
if (offset !== -1) {
range.setEnd(container, offset + textContent.length - content.length);
break;
}
} while (treeWalker.nextNode());
return range;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmQtcmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3V0aWxzL2RvbS9nZXQtd29yZC1yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixhQUFhLEdBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFlBQW1CO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JFLE1BQU0sRUFBQyxhQUFhLEVBQUMsR0FBRyxjQUFjLENBQUM7SUFFdkMsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNoQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDN0MsYUFBYSxDQUFDLElBQUksRUFDbEIsVUFBVSxDQUFDLFNBQVMsRUFDcEIsYUFBYSxDQUNoQixDQUFDO0lBRUYsVUFBVSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFFeEMsR0FBRztRQUNDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQ1QsU0FBUyxLQUFLLGNBQWM7WUFDeEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxHQUFHLENBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFDeEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDekIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUN4QyxPQUFPLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQzdDLEdBQUcsQ0FBQyxDQUFDO1FBRVYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBSSxNQUFNLEVBQUU7WUFDUixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsQyxNQUFNO1NBQ1Q7S0FDSixRQUFRLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtJQUVwQyxVQUFVLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztJQUV0QyxHQUFHO1FBQ0MsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FDVCxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ2hGLE1BQU0sTUFBTSxHQUFHO1lBQ1gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDcEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1NBQ3pDLENBQUMsTUFBTSxDQUNKLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQ2IsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQ2hDLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFRixLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsTUFBTTtTQUNUO0tBQ0osUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUU7SUFFaEMsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ0hBUl9OT19CUkVBS19TUEFDRSxcbiAgICBDSEFSX1pFUk9fV0lEVEhfU1BBQ0UsXG4gICAgc3ZnTm9kZUZpbHRlcixcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZWQgcmFuZ2Ugd2l0aCBpdHMgYm91bmRhcmllcyBzZXQgYXQgd29yZCBib3VuZGFyaWVzXG4gKlxuICogQHBhcmFtIGN1cnJlbnRSYW5nZSBhIHJhbmdlIHRvIGNsb25lXG4gKiBAcmV0dXJuIG1vZGlmaWVkIHJhbmdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dWlHZXRXb3JkUmFuZ2UoY3VycmVudFJhbmdlOiBSYW5nZSk6IFJhbmdlIHtcbiAgICBjb25zdCByYW5nZSA9IGN1cnJlbnRSYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgY29uc3Qge3N0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCwgZW5kQ29udGFpbmVyLCBlbmRPZmZzZXR9ID0gcmFuZ2U7XG4gICAgY29uc3Qge293bmVyRG9jdW1lbnR9ID0gc3RhcnRDb250YWluZXI7XG5cbiAgICBpZiAoIW93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBvd25lckRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgICAgIG93bmVyRG9jdW1lbnQuYm9keSxcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXG4gICAgICAgIHN2Z05vZGVGaWx0ZXIsXG4gICAgKTtcblxuICAgIHRyZWVXYWxrZXIuY3VycmVudE5vZGUgPSBzdGFydENvbnRhaW5lcjtcblxuICAgIGRvIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgICAgY29udGFpbmVyID09PSBzdGFydENvbnRhaW5lclxuICAgICAgICAgICAgICAgID8gdGV4dENvbnRlbnQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgc3RhcnRPZmZzZXQgKyAxKSlcbiAgICAgICAgICAgICAgICA6IHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgY29udGVudC5sYXN0SW5kZXhPZignICcpLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicpLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQubGFzdEluZGV4T2YoQ0hBUl9OT19CUkVBS19TUEFDRSksXG4gICAgICAgICAgICAgICAgY29udGVudC5sYXN0SW5kZXhPZihDSEFSX1pFUk9fV0lEVEhfU1BBQ0UpLFxuICAgICAgICAgICAgKSArIDE7XG5cbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY29udGFpbmVyLCAwKTtcblxuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChjb250YWluZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKHRyZWVXYWxrZXIucHJldmlvdXNOb2RlKCkpO1xuXG4gICAgdHJlZVdhbGtlci5jdXJyZW50Tm9kZSA9IGVuZENvbnRhaW5lcjtcblxuICAgIGRvIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgICAgY29udGFpbmVyID09PSBlbmRDb250YWluZXIgPyB0ZXh0Q29udGVudC5zbGljZShlbmRPZmZzZXQgKyAxKSA6IHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBbXG4gICAgICAgICAgICBjb250ZW50LmluZGV4T2YoJyAnKSxcbiAgICAgICAgICAgIGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicpLFxuICAgICAgICAgICAgY29udGVudC5pbmRleE9mKENIQVJfTk9fQlJFQUtfU1BBQ0UpLFxuICAgICAgICAgICAgY29udGVudC5pbmRleE9mKENIQVJfWkVST19XSURUSF9TUEFDRSksXG4gICAgICAgIF0ucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdCwgaXRlbSkgPT5cbiAgICAgICAgICAgICAgICByZXN1bHQgPT09IC0xIHx8IGl0ZW0gPT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gTWF0aC5tYXgocmVzdWx0LCBpdGVtKVxuICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKHJlc3VsdCwgaXRlbSksXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgKTtcblxuICAgICAgICByYW5nZS5zZXRFbmQoY29udGFpbmVyLCB0ZXh0Q29udGVudC5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChvZmZzZXQgIT09IC0xKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoY29udGFpbmVyLCBvZmZzZXQgKyB0ZXh0Q29udGVudC5sZW5ndGggLSBjb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKHRyZWVXYWxrZXIubmV4dE5vZGUoKSk7XG5cbiAgICByZXR1cm4gcmFuZ2U7XG59XG4iXX0=