| | |
| | | exports.compileGeneralSelector = void 0; |
| | | var attributes_1 = require("./attributes"); |
| | | var pseudo_selectors_1 = require("./pseudo-selectors"); |
| | | var css_what_1 = require("css-what"); |
| | | /* |
| | | * All available rules |
| | | */ |
| | | function compileGeneralSelector(next, selector, options, context, compileToken) { |
| | | var adapter = options.adapter, equals = options.equals; |
| | | switch (selector.type) { |
| | | case "pseudo-element": |
| | | case css_what_1.SelectorType.PseudoElement: { |
| | | throw new Error("Pseudo-elements are not supported by css-select"); |
| | | case "attribute": |
| | | } |
| | | case css_what_1.SelectorType.ColumnCombinator: { |
| | | throw new Error("Column combinators are not yet supported by css-select"); |
| | | } |
| | | case css_what_1.SelectorType.Attribute: { |
| | | if (selector.namespace != null) { |
| | | throw new Error("Namespaced attributes are not yet supported by css-select"); |
| | | } |
| | | if (!options.xmlMode || options.lowerCaseAttributeNames) { |
| | | selector.name = selector.name.toLowerCase(); |
| | | } |
| | | return attributes_1.attributeRules[selector.action](next, selector, options); |
| | | case "pseudo": |
| | | return pseudo_selectors_1.compilePseudoSelector(next, selector, options, context, compileToken); |
| | | } |
| | | case css_what_1.SelectorType.Pseudo: { |
| | | return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken); |
| | | } |
| | | // Tags |
| | | case "tag": |
| | | case css_what_1.SelectorType.Tag: { |
| | | if (selector.namespace != null) { |
| | | throw new Error("Namespaced tag names are not yet supported by css-select"); |
| | | } |
| | | var name_1 = selector.name; |
| | | if (!options.xmlMode || options.lowerCaseTags) { |
| | | name_1 = name_1.toLowerCase(); |
| | | } |
| | | return function tag(elem) { |
| | | return adapter.getName(elem) === selector.name && next(elem); |
| | | return adapter.getName(elem) === name_1 && next(elem); |
| | | }; |
| | | } |
| | | // Traversal |
| | | case "descendant": |
| | | case css_what_1.SelectorType.Descendant: { |
| | | if (options.cacheResults === false || |
| | | typeof WeakSet === "undefined") { |
| | | return function descendant(elem) { |
| | |
| | | }; |
| | | } |
| | | // @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; |
| | |
| | | } |
| | | return false; |
| | | }; |
| | | case "_flexibleDescendant": |
| | | } |
| | | case "_flexibleDescendant": { |
| | | // Include element itself, only used while querying an array |
| | | return function flexibleDescendant(elem) { |
| | | var current = elem; |
| | |
| | | } while ((current = adapter.getParent(current))); |
| | | return false; |
| | | }; |
| | | case "parent": |
| | | } |
| | | case css_what_1.SelectorType.Parent: { |
| | | return function parent(elem) { |
| | | return adapter |
| | | .getChildren(elem) |
| | | .some(function (elem) { return adapter.isTag(elem) && next(elem); }); |
| | | }; |
| | | case "child": |
| | | } |
| | | case css_what_1.SelectorType.Child: { |
| | | return function child(elem) { |
| | | var parent = adapter.getParent(elem); |
| | | return parent != null && adapter.isTag(parent) && next(parent); |
| | | }; |
| | | case "sibling": |
| | | } |
| | | case css_what_1.SelectorType.Sibling: { |
| | | return function sibling(elem) { |
| | | var siblings = adapter.getSiblings(elem); |
| | | for (var i = 0; i < siblings.length; i++) { |
| | |
| | | } |
| | | return false; |
| | | }; |
| | | case "adjacent": |
| | | } |
| | | case css_what_1.SelectorType.Adjacent: { |
| | | if (adapter.prevElementSibling) { |
| | | return function adjacent(elem) { |
| | | var previous = adapter.prevElementSibling(elem); |
| | | return previous != null && next(previous); |
| | | }; |
| | | } |
| | | return function adjacent(elem) { |
| | | var siblings = adapter.getSiblings(elem); |
| | | var lastElement; |
| | |
| | | } |
| | | return !!lastElement && next(lastElement); |
| | | }; |
| | | case "universal": |
| | | } |
| | | case css_what_1.SelectorType.Universal: { |
| | | if (selector.namespace != null && selector.namespace !== "*") { |
| | | throw new Error("Namespaced universal selectors are not yet supported by css-select"); |
| | | } |
| | | return next; |
| | | } |
| | | } |
| | | } |
| | | exports.compileGeneralSelector = compileGeneralSelector; |