You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
4.2 KiB
104 lines
4.2 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.compileGeneralSelector = void 0; |
|
var attributes_1 = require("./attributes"); |
|
var pseudo_selectors_1 = require("./pseudo-selectors"); |
|
/* |
|
* All available rules |
|
*/ |
|
function compileGeneralSelector(next, selector, options, context, compileToken) { |
|
var adapter = options.adapter, equals = options.equals; |
|
switch (selector.type) { |
|
case "pseudo-element": |
|
throw new Error("Pseudo-elements are not supported by css-select"); |
|
case "attribute": |
|
return attributes_1.attributeRules[selector.action](next, selector, options); |
|
case "pseudo": |
|
return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken); |
|
// Tags |
|
case "tag": |
|
return function tag(elem) { |
|
return adapter.getName(elem) === selector.name && next(elem); |
|
}; |
|
// Traversal |
|
case "descendant": |
|
if (options.cacheResults === false || |
|
typeof WeakSet === "undefined") { |
|
return function descendant(elem) { |
|
var current = elem; |
|
while ((current = adapter.getParent(current))) { |
|
if (adapter.isTag(current) && next(current)) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}; |
|
} |
|
// @ts-expect-error `ElementNode` is not extending object |
|
// eslint-disable-next-line no-case-declarations |
|
var isFalseCache_1 = new WeakSet(); |
|
return function cachedDescendant(elem) { |
|
var current = elem; |
|
while ((current = adapter.getParent(current))) { |
|
if (!isFalseCache_1.has(current)) { |
|
if (adapter.isTag(current) && next(current)) { |
|
return true; |
|
} |
|
isFalseCache_1.add(current); |
|
} |
|
} |
|
return false; |
|
}; |
|
case "_flexibleDescendant": |
|
// Include element itself, only used while querying an array |
|
return function flexibleDescendant(elem) { |
|
var current = elem; |
|
do { |
|
if (adapter.isTag(current) && next(current)) |
|
return true; |
|
} while ((current = adapter.getParent(current))); |
|
return false; |
|
}; |
|
case "parent": |
|
return function parent(elem) { |
|
return adapter |
|
.getChildren(elem) |
|
.some(function (elem) { return adapter.isTag(elem) && next(elem); }); |
|
}; |
|
case "child": |
|
return function child(elem) { |
|
var parent = adapter.getParent(elem); |
|
return parent != null && adapter.isTag(parent) && next(parent); |
|
}; |
|
case "sibling": |
|
return function sibling(elem) { |
|
var siblings = adapter.getSiblings(elem); |
|
for (var i = 0; i < siblings.length; i++) { |
|
var currentSibling = siblings[i]; |
|
if (equals(elem, currentSibling)) |
|
break; |
|
if (adapter.isTag(currentSibling) && next(currentSibling)) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}; |
|
case "adjacent": |
|
return function adjacent(elem) { |
|
var siblings = adapter.getSiblings(elem); |
|
var lastElement; |
|
for (var i = 0; i < siblings.length; i++) { |
|
var currentSibling = siblings[i]; |
|
if (equals(elem, currentSibling)) |
|
break; |
|
if (adapter.isTag(currentSibling)) { |
|
lastElement = currentSibling; |
|
} |
|
} |
|
return !!lastElement && next(lastElement); |
|
}; |
|
case "universal": |
|
return next; |
|
} |
|
} |
|
exports.compileGeneralSelector = compileGeneralSelector;
|
|
|