Skip to content

Commit

Permalink
Update collect nth handler
Browse files Browse the repository at this point in the history
  • Loading branch information
asamuzaK committed Nov 7, 2024
1 parent ea3ac0f commit 66f5bfc
Showing 1 changed file with 39 additions and 55 deletions.
94 changes: 39 additions & 55 deletions src/js/finder.js
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,9 @@ export class Finder {
selectorBranches = branches;
}
if (parentNode) {
const walker = this._createTreeWalker(parentNode, {
force: true
});
let refNode = walker.firstChild();
const nodeArr = [];
let refNode = parentNode.firstElementChild;
const selectorNodes = new Set();
let l = 0;
if (selectorBranches) {
while (refNode) {
if (isVisible(refNode)) {
Expand All @@ -391,26 +388,28 @@ export class Finder {
selectorNodes.add(refNode);
}
}
l++;
refNode = walker.nextSibling();
nodeArr.push(refNode);
refNode = refNode.nextElementSibling;
}
} else {
while (refNode) {
l++;
refNode = walker.nextSibling();
nodeArr.push(refNode);
refNode = refNode.nextElementSibling;
}
}
const l = nodeArr.length;
let idx;
if (reverse) {
idx = l - 1;
} else {
idx = 0;
}
// :first-child, :last-child, :nth-child(b of S), :nth-last-child(b of S)
if (a === 0) {
if (b > 0 && b <= l) {
if (selectorNodes.size) {
refNode = traverseNode(parentNode, walker);
if (reverse) {
refNode = walker.lastChild();
} else {
refNode = walker.firstChild();
}
let i = 0;
refNode = nodeArr[idx];
while (refNode) {
if (selectorNodes.has(refNode)) {
if (i === b - 1) {
Expand All @@ -420,28 +419,23 @@ export class Finder {
i++;
}
if (reverse) {
refNode = walker.previousSibling();
refNode = nodeArr[--idx];
} else {
refNode = walker.nextSibling();
refNode = nodeArr[++idx];
}
}
} else if (!selector) {
refNode = traverseNode(parentNode, walker);
if (reverse) {
refNode = walker.lastChild();
} else {
refNode = walker.firstChild();
}
let i = 0;
refNode = nodeArr[idx];
while (refNode) {
if (i === b - 1) {
matched.add(refNode);
break;
}
if (reverse) {
refNode = walker.previousSibling();
refNode = nodeArr[--idx];
} else {
refNode = walker.nextSibling();
refNode = nodeArr[++idx];
}
i++;
}
Expand All @@ -456,14 +450,9 @@ export class Finder {
}
}
if (nth >= 0 && nth < l) {
refNode = traverseNode(parentNode, walker);
if (reverse) {
refNode = walker.lastChild();
} else {
refNode = walker.firstChild();
}
let i = 0;
let j = a > 0 ? 0 : b - 1;
refNode = nodeArr[idx];
while (refNode) {
if (refNode && nth >= 0 && nth < l) {
if (selectorNodes.size) {
Expand All @@ -485,9 +474,9 @@ export class Finder {
nth += a;
}
if (reverse) {
refNode = walker.previousSibling();
refNode = nodeArr[--idx];
} else {
refNode = walker.nextSibling();
refNode = nodeArr[++idx];
}
i++;
} else {
Expand Down Expand Up @@ -534,24 +523,24 @@ export class Finder {
const { localName, namespaceURI, parentNode, prefix } = node;
const matched = new Set();
if (parentNode) {
const walker = this._createTreeWalker(parentNode);
let refNode = traverseNode(parentNode, walker);
refNode = walker.firstChild();
let l = 0;
const nodeArr = [];
let refNode = parentNode.firstElementChild;
while (refNode) {
l++;
refNode = walker.nextSibling();
nodeArr.push(refNode);
refNode = refNode.nextElementSibling;
}
const l = nodeArr.length;
let idx;
if (reverse) {
idx = l - 1;
} else {
idx = 0;
}
// :first-of-type, :last-of-type
if (a === 0) {
if (b > 0 && b <= l) {
refNode = traverseNode(parentNode, walker);
if (reverse) {
refNode = walker.lastChild();
} else {
refNode = walker.firstChild();
}
let j = 0;
refNode = nodeArr[idx];
while (refNode) {
const {
localName: itemLocalName, namespaceURI: itemNamespaceURI,
Expand All @@ -566,9 +555,9 @@ export class Finder {
j++;
}
if (reverse) {
refNode = walker.previousSibling();
refNode = nodeArr[--idx];
} else {
refNode = walker.nextSibling();
refNode = nodeArr[++idx];
}
}
}
Expand All @@ -581,13 +570,8 @@ export class Finder {
}
}
if (nth >= 0 && nth < l) {
refNode = traverseNode(parentNode, walker);
if (reverse) {
refNode = walker.lastChild();
} else {
refNode = walker.firstChild();
}
let j = a > 0 ? 0 : b - 1;
refNode = nodeArr[idx];
while (refNode) {
const {
localName: itemLocalName, namespaceURI: itemNamespaceURI,
Expand All @@ -608,9 +592,9 @@ export class Finder {
}
}
if (reverse) {
refNode = walker.previousSibling();
refNode = nodeArr[--idx];
} else {
refNode = walker.nextSibling();
refNode = nodeArr[++idx];
}
}
}
Expand Down

0 comments on commit 66f5bfc

Please sign in to comment.