|
|
- var attributes = require("./attributes.js");
- var Pseudos = require("./pseudos");
-
- /*
- all available rules
- */
- module.exports = {
- __proto__: null,
-
- attribute: attributes.compile,
- pseudo: Pseudos.compile,
-
- //tags
- tag: function(next, data, options) {
- var name = data.name;
- var adapter = options.adapter;
-
- return function tag(elem) {
- return adapter.getName(elem) === name && next(elem);
- };
- },
-
- //traversal
- descendant: function(next, data, options) {
- // eslint-disable-next-line no-undef
- var isFalseCache = typeof WeakSet !== "undefined" ? new WeakSet() : null;
- var adapter = options.adapter;
-
- return function descendant(elem) {
- var found = false;
-
- while (!found && (elem = adapter.getParent(elem))) {
- if (!isFalseCache || !isFalseCache.has(elem)) {
- found = next(elem);
- if (!found && isFalseCache) {
- isFalseCache.add(elem);
- }
- }
- }
-
- return found;
- };
- },
- _flexibleDescendant: function(next, data, options) {
- var adapter = options.adapter;
-
- // Include element itself, only used while querying an array
- return function descendant(elem) {
- var found = next(elem);
-
- while (!found && (elem = adapter.getParent(elem))) {
- found = next(elem);
- }
-
- return found;
- };
- },
- parent: function(next, data, options) {
- if (options && options.strict) {
- throw new Error("Parent selector isn't part of CSS3");
- }
-
- var adapter = options.adapter;
-
- return function parent(elem) {
- return adapter.getChildren(elem).some(test);
- };
-
- function test(elem) {
- return adapter.isTag(elem) && next(elem);
- }
- },
- child: function(next, data, options) {
- var adapter = options.adapter;
-
- return function child(elem) {
- var parent = adapter.getParent(elem);
- return !!parent && next(parent);
- };
- },
- sibling: function(next, data, options) {
- var adapter = options.adapter;
-
- return function sibling(elem) {
- var siblings = adapter.getSiblings(elem);
-
- for (var i = 0; i < siblings.length; i++) {
- if (adapter.isTag(siblings[i])) {
- if (siblings[i] === elem) break;
- if (next(siblings[i])) return true;
- }
- }
-
- return false;
- };
- },
- adjacent: function(next, data, options) {
- var adapter = options.adapter;
-
- return function adjacent(elem) {
- var siblings = adapter.getSiblings(elem),
- lastElement;
-
- for (var i = 0; i < siblings.length; i++) {
- if (adapter.isTag(siblings[i])) {
- if (siblings[i] === elem) break;
- lastElement = siblings[i];
- }
- }
-
- return !!lastElement && next(lastElement);
- };
- },
- universal: function(next) {
- return next;
- }
- };
|