dom-seek
Version:
Text traversal for HTML documents.
108 lines (87 loc) • 2.34 kB
JavaScript
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
;