Move static DOM scanning functions into TextSourceRange

This commit is contained in:
toasted-nutbread 2019-09-01 10:28:50 -04:00
parent f4b81eff30
commit fad5332488
2 changed files with 46 additions and 46 deletions

View File

@ -515,58 +515,14 @@ class Frontend {
length = textSource.text().length;
while (textSource.range && length > 0) {
const nodes = Frontend.getNodesInRange(textSource.range);
if (Frontend.isValidScanningNodeList(nodes, this.ignoreNodes)) {
const nodes = TextSourceRange.getNodesInRange(textSource.range);
if (!TextSourceRange.anyNodeMatchesSelector(nodes, this.ignoreNodes)) {
break;
}
--length;
textSource.setEndOffset(length);
}
}
static getNodesInRange(range) {
const end = range.endContainer;
const nodes = [];
for (let node = range.startContainer; node !== null; node = Frontend.getNextNode(node)) {
nodes.push(node);
if (node === end) { break; }
}
return nodes;
}
static getNextNode(node) {
let next = node.firstChild;
if (next === null) {
while (true) {
next = node.nextSibling;
if (next !== null) { break; }
next = node.parentNode;
if (node === null) { break; }
node = next;
}
}
return next;
}
static isValidScanningNodeList(nodeList, selector) {
for (const node of nodeList) {
if (!Frontend.isValidScanningNode(node, selector)) {
return false;
}
}
return true;
}
static isValidScanningNode(node, selector) {
for (; node !== null; node = node.parentNode) {
if (node.nodeType === Node.ELEMENT_NODE) {
return !node.matches(selector);
}
}
return true;
}
}
window.yomichan_frontend = Frontend.create();

View File

@ -232,6 +232,50 @@ class TextSourceRange {
const writingMode = style.writingMode;
return typeof writingMode === 'string' ? writingMode : 'horizontal-tb';
}
static getNodesInRange(range) {
const end = range.endContainer;
const nodes = [];
for (let node = range.startContainer; node !== null; node = TextSourceRange.getNextNode(node)) {
nodes.push(node);
if (node === end) { break; }
}
return nodes;
}
static getNextNode(node) {
let next = node.firstChild;
if (next === null) {
while (true) {
next = node.nextSibling;
if (next !== null) { break; }
next = node.parentNode;
if (node === null) { break; }
node = next;
}
}
return next;
}
static anyNodeMatchesSelector(nodeList, selector) {
for (const node of nodeList) {
if (TextSourceRange.nodeMatchesSelector(node, selector)) {
return true;
}
}
return false;
}
static nodeMatchesSelector(node, selector) {
for (; node !== null; node = node.parentNode) {
if (node.nodeType === Node.ELEMENT_NODE) {
return node.matches(selector);
}
}
return false;
}
}