UNPKG

@taiga-ui/core

Version:

Core library for creating Angular components and applications using Taiga UI

51 lines 8.45 kB
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=