123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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;
- }
- };
|