UNPKG

dom-seek

Version:

Text traversal for HTML documents.

108 lines (87 loc) 2.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = seek; var E_END = 'Iterator exhausted before seek ended.'; var E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.'; var E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.'; var DOCUMENT_POSITION_PRECEDING = 2; var SHOW_TEXT = 4; var TEXT_NODE = 3; function seek(iter, where) { if (iter.whatToShow !== SHOW_TEXT) { var error; // istanbul ignore next try { error = new DOMException(E_SHOW, 'InvalidStateError'); } catch (_unused) { error = new Error(E_SHOW); error.code = 11; error.name = 'InvalidStateError'; error.toString = function () { return "InvalidStateError: ".concat(E_SHOW); }; } throw error; } var count = 0; var node = iter.referenceNode; var predicates = null; if (isInteger(where)) { predicates = { forward: function forward() { return count < where; }, backward: function backward() { return count > where || !iter.pointerBeforeReferenceNode; } }; } else if (isText(where)) { var forward = before(node, where) ? function () { return false; } : function () { return node !== where; }; var backward = function backward() { return node !== where || !iter.pointerBeforeReferenceNode; }; predicates = { forward: forward, backward: backward }; } else { throw new TypeError(E_WHERE); } while (predicates.forward()) { node = iter.nextNode(); if (node === null) { throw new RangeError(E_END); } count += node.nodeValue.length; } if (iter.nextNode()) { node = iter.previousNode(); } while (predicates.backward()) { node = iter.previousNode(); if (node === null) { throw new RangeError(E_END); } count -= node.nodeValue.length; } if (!isText(iter.referenceNode)) { throw new RangeError(E_END); } return count; } function isInteger(n) { if (typeof n !== 'number') return false; return isFinite(n) && Math.floor(n) === n; } function isText(node) { return node.nodeType === TEXT_NODE; } function before(ref, node) { return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING; } //# sourceMappingURL=index.js.map