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