Move static DOM scanning functions into TextSourceRange
This commit is contained in:
parent
f4b81eff30
commit
fad5332488
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user