@taiga-ui/kit
Version:
Taiga UI Angular main components kit
52 lines • 8.13 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) {
var range = currentRange.cloneRange();
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset;
var ownerDocument = startContainer.ownerDocument;
if (!ownerDocument) {
return range;
}
var treeWalker = ownerDocument.createTreeWalker(ownerDocument.body, NodeFilter.SHOW_TEXT, svgNodeFilter, false);
treeWalker.currentNode = startContainer;
do {
var container = treeWalker.currentNode;
var textContent = container.textContent || '';
var content = container === startContainer
? textContent.substr(0, startOffset + 1)
: textContent;
var 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 {
var container = treeWalker.currentNode;
var textContent = container.textContent || '';
var content = container === endContainer ? textContent.substr(endOffset + 1) : textContent;
var offset = [
content.indexOf(' '),
content.indexOf(CHAR_NO_BREAK_SPACE),
content.indexOf(CHAR_ZERO_WIDTH_SPACE),
].reduce(function (result, item) {
return 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmQtcmFuZ2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGFpZ2EtdWkva2l0L3V0aWxzL2RvbS8iLCJzb3VyY2VzIjpbImdldC13b3JkLXJhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFeEY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFlBQW1CO0lBQzVDLElBQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNqQyxJQUFBLHFDQUFjLEVBQUUsK0JBQVcsRUFBRSxpQ0FBWSxFQUFFLDJCQUFTLENBQVU7SUFDOUQsSUFBQSw0Q0FBYSxDQUFtQjtJQUV2QyxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ2hCLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRUQsSUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixDQUM3QyxhQUFhLENBQUMsSUFBSSxFQUNsQixVQUFVLENBQUMsU0FBUyxFQUNwQixhQUFhLEVBQ2IsS0FBSyxDQUNSLENBQUM7SUFFRixVQUFVLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQztJQUV4QyxHQUFHO1FBQ0MsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxJQUFNLE9BQU8sR0FDVCxTQUFTLEtBQUssY0FBYztZQUN4QixDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ3RCLElBQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxHQUFHLENBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFDeEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUN4QyxPQUFPLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQzdDLEdBQUcsQ0FBQyxDQUFDO1FBRVYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBSSxNQUFNLEVBQUU7WUFDUixLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsQyxNQUFNO1NBQ1Q7S0FDSixRQUFRLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtJQUVwQyxVQUFVLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztJQUV0QyxHQUFHO1FBQ0MsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxJQUFNLE9BQU8sR0FDVCxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ2pGLElBQU0sTUFBTSxHQUFHO1lBQ1gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDcEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1NBQ3pDLENBQUMsTUFBTSxDQUNKLFVBQUMsTUFBTSxFQUFFLElBQUk7WUFDVCxPQUFBLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO2dCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1FBRjVCLENBRTRCLEVBQ2hDLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFRixLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsTUFBTTtTQUNUO0tBQ0osUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUU7SUFFaEMsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q0hBUl9OT19CUkVBS19TUEFDRSwgQ0hBUl9aRVJPX1dJRFRIX1NQQUNFLCBzdmdOb2RlRmlsdGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmVkIHJhbmdlIHdpdGggaXRzIGJvdW5kYXJpZXMgc2V0IGF0IHdvcmQgYm91bmRhcmllc1xuICpcbiAqIEBwYXJhbSBjdXJyZW50UmFuZ2UgYSByYW5nZSB0byBjbG9uZVxuICogQHJldHVybiBtb2RpZmllZCByYW5nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29yZFJhbmdlKGN1cnJlbnRSYW5nZTogUmFuZ2UpOiBSYW5nZSB7XG4gICAgY29uc3QgcmFuZ2UgPSBjdXJyZW50UmFuZ2UuY2xvbmVSYW5nZSgpO1xuICAgIGNvbnN0IHtzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0fSA9IHJhbmdlO1xuICAgIGNvbnN0IHtvd25lckRvY3VtZW50fSA9IHN0YXJ0Q29udGFpbmVyO1xuXG4gICAgaWYgKCFvd25lckRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiByYW5nZTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmVlV2Fsa2VyID0gb3duZXJEb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgICBvd25lckRvY3VtZW50LmJvZHksXG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICBzdmdOb2RlRmlsdGVyLFxuICAgICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgdHJlZVdhbGtlci5jdXJyZW50Tm9kZSA9IHN0YXJ0Q29udGFpbmVyO1xuXG4gICAgZG8ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlO1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGNvbnRhaW5lci50ZXh0Q29udGVudCB8fCAnJztcbiAgICAgICAgY29uc3QgY29udGVudCA9XG4gICAgICAgICAgICBjb250YWluZXIgPT09IHN0YXJ0Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgPyB0ZXh0Q29udGVudC5zdWJzdHIoMCwgc3RhcnRPZmZzZXQgKyAxKVxuICAgICAgICAgICAgICAgIDogdGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICBjb250ZW50Lmxhc3RJbmRleE9mKCcgJyksXG4gICAgICAgICAgICAgICAgY29udGVudC5sYXN0SW5kZXhPZihDSEFSX05PX0JSRUFLX1NQQUNFKSxcbiAgICAgICAgICAgICAgICBjb250ZW50Lmxhc3RJbmRleE9mKENIQVJfWkVST19XSURUSF9TUEFDRSksXG4gICAgICAgICAgICApICsgMTtcblxuICAgICAgICByYW5nZS5zZXRTdGFydChjb250YWluZXIsIDApO1xuXG4gICAgICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGNvbnRhaW5lciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAodHJlZVdhbGtlci5wcmV2aW91c05vZGUoKSk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZW5kQ29udGFpbmVyO1xuXG4gICAgZG8ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlO1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGNvbnRhaW5lci50ZXh0Q29udGVudCB8fCAnJztcbiAgICAgICAgY29uc3QgY29udGVudCA9XG4gICAgICAgICAgICBjb250YWluZXIgPT09IGVuZENvbnRhaW5lciA/IHRleHRDb250ZW50LnN1YnN0cihlbmRPZmZzZXQgKyAxKSA6IHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBbXG4gICAgICAgICAgICBjb250ZW50LmluZGV4T2YoJyAnKSxcbiAgICAgICAgICAgIGNvbnRlbnQuaW5kZXhPZihDSEFSX05PX0JSRUFLX1NQQUNFKSxcbiAgICAgICAgICAgIGNvbnRlbnQuaW5kZXhPZihDSEFSX1pFUk9fV0lEVEhfU1BBQ0UpLFxuICAgICAgICBdLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHQsIGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgcmVzdWx0ID09PSAtMSB8fCBpdGVtID09PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IE1hdGgubWF4KHJlc3VsdCwgaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbihyZXN1bHQsIGl0ZW0pLFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGNvbnRhaW5lciwgdGV4dENvbnRlbnQubGVuZ3RoKTtcblxuICAgICAgICBpZiAob2Zmc2V0ICE9PSAtMSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGNvbnRhaW5lciwgb2Zmc2V0ICsgdGV4dENvbnRlbnQubGVuZ3RoIC0gY29udGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlICh0cmVlV2Fsa2VyLm5leHROb2RlKCkpO1xuXG4gICAgcmV0dXJuIHJhbmdlO1xufVxuIl19