@taiga-ui/kit
Version:
Taiga UI Angular main components kit
50 lines • 8.06 kB
JavaScript
import { CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_SPACE, svgNodeFilter } from '@taiga-ui/cdk';
/**
* Creates a cloned range with its boundaries set at word boundaries
*
* @param currentRange a range to clone
* @return modified range
*/
export function getWordRange(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, false);
treeWalker.currentNode = startContainer;
do {
const container = treeWalker.currentNode;
const textContent = container.textContent || '';
const content = container === startContainer
? textContent.substr(0, startOffset + 1)
: textContent;
const offset = Math.max(content.lastIndexOf(' '), 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.substr(endOffset + 1) : textContent;
const offset = [
content.indexOf(' '),
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmQtcmFuZ2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGFpZ2EtdWkva2l0L3V0aWxzL2RvbS8iLCJzb3VyY2VzIjpbImdldC13b3JkLXJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFeEY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFlBQW1CO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JFLE1BQU0sRUFBQyxhQUFhLEVBQUMsR0FBRyxjQUFjLENBQUM7SUFFdkMsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNoQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDN0MsYUFBYSxDQUFDLElBQUksRUFDbEIsVUFBVSxDQUFDLFNBQVMsRUFDcEIsYUFBYSxFQUNiLEtBQUssQ0FDUixDQUFDO0lBRUYsVUFBVSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFFeEMsR0FBRztRQUNDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQ1QsU0FBUyxLQUFLLGNBQWM7WUFDeEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUN0QixNQUFNLE1BQU0sR0FDUixJQUFJLENBQUMsR0FBRyxDQUNKLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQ3hCLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsRUFDeEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUM3QyxHQUFHLENBQUMsQ0FBQztRQUVWLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdCLElBQUksTUFBTSxFQUFFO1lBQ1IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbEMsTUFBTTtTQUNUO0tBQ0osUUFBUSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUU7SUFFcEMsVUFBVSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFFdEMsR0FBRztRQUNDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQ1QsU0FBUyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNqRixNQUFNLE1BQU0sR0FBRztZQUNYLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7WUFDcEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztTQUN6QyxDQUFDLE1BQU0sQ0FDSixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUNiLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUNoQyxDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRUYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLE1BQU07U0FDVDtLQUNKLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBRWhDLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NIQVJfTk9fQlJFQUtfU1BBQ0UsIENIQVJfWkVST19XSURUSF9TUEFDRSwgc3ZnTm9kZUZpbHRlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lZCByYW5nZSB3aXRoIGl0cyBib3VuZGFyaWVzIHNldCBhdCB3b3JkIGJvdW5kYXJpZXNcbiAqXG4gKiBAcGFyYW0gY3VycmVudFJhbmdlIGEgcmFuZ2UgdG8gY2xvbmVcbiAqIEByZXR1cm4gbW9kaWZpZWQgcmFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmRSYW5nZShjdXJyZW50UmFuZ2U6IFJhbmdlKTogUmFuZ2Uge1xuICAgIGNvbnN0IHJhbmdlID0gY3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgICBjb25zdCB7c3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRDb250YWluZXIsIGVuZE9mZnNldH0gPSByYW5nZTtcbiAgICBjb25zdCB7b3duZXJEb2N1bWVudH0gPSBzdGFydENvbnRhaW5lcjtcblxuICAgIGlmICghb3duZXJEb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuXG4gICAgY29uc3QgdHJlZVdhbGtlciA9IG93bmVyRG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgb3duZXJEb2N1bWVudC5ib2R5LFxuICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcbiAgICAgICAgc3ZnTm9kZUZpbHRlcixcbiAgICAgICAgZmFsc2UsXG4gICAgKTtcblxuICAgIHRyZWVXYWxrZXIuY3VycmVudE5vZGUgPSBzdGFydENvbnRhaW5lcjtcblxuICAgIGRvIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgICAgY29udGFpbmVyID09PSBzdGFydENvbnRhaW5lclxuICAgICAgICAgICAgICAgID8gdGV4dENvbnRlbnQuc3Vic3RyKDAsIHN0YXJ0T2Zmc2V0ICsgMSlcbiAgICAgICAgICAgICAgICA6IHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgY29udGVudC5sYXN0SW5kZXhPZignICcpLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQubGFzdEluZGV4T2YoQ0hBUl9OT19CUkVBS19TUEFDRSksXG4gICAgICAgICAgICAgICAgY29udGVudC5sYXN0SW5kZXhPZihDSEFSX1pFUk9fV0lEVEhfU1BBQ0UpLFxuICAgICAgICAgICAgKSArIDE7XG5cbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY29udGFpbmVyLCAwKTtcblxuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChjb250YWluZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKHRyZWVXYWxrZXIucHJldmlvdXNOb2RlKCkpO1xuXG4gICAgdHJlZVdhbGtlci5jdXJyZW50Tm9kZSA9IGVuZENvbnRhaW5lcjtcblxuICAgIGRvIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjb250YWluZXIudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgICAgICAgY29udGFpbmVyID09PSBlbmRDb250YWluZXIgPyB0ZXh0Q29udGVudC5zdWJzdHIoZW5kT2Zmc2V0ICsgMSkgOiB0ZXh0Q29udGVudDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gW1xuICAgICAgICAgICAgY29udGVudC5pbmRleE9mKCcgJyksXG4gICAgICAgICAgICBjb250ZW50LmluZGV4T2YoQ0hBUl9OT19CUkVBS19TUEFDRSksXG4gICAgICAgICAgICBjb250ZW50LmluZGV4T2YoQ0hBUl9aRVJPX1dJRFRIX1NQQUNFKSxcbiAgICAgICAgXS5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0LCBpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9PT0gLTEgfHwgaXRlbSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChyZXN1bHQsIGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4ocmVzdWx0LCBpdGVtKSxcbiAgICAgICAgICAgIC0xLFxuICAgICAgICApO1xuXG4gICAgICAgIHJhbmdlLnNldEVuZChjb250YWluZXIsIHRleHRDb250ZW50Lmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKG9mZnNldCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChjb250YWluZXIsIG9mZnNldCArIHRleHRDb250ZW50Lmxlbmd0aCAtIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAodHJlZVdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgIHJldHVybiByYW5nZTtcbn1cbiJdfQ==