Index: node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/compile.js |
diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/compile.js b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/compile.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5c617d353f2782023346c03678cf784e3acf64f4 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/compile.js |
@@ -0,0 +1,84 @@ |
+/* |
+ compiles a selector to an executable function |
+*/ |
+ |
+module.exports = compile; |
+module.exports.compileUnsafe = compileUnsafe; |
+ |
+var parse = require("CSSwhat"), |
+ DomUtils = require("domutils"), |
+ isTag = DomUtils.isTag, |
+ Rules = require("./general.js"), |
+ sortRules = require("./sort.js"), |
+ BaseFuncs = require("./basefunctions.js"), |
+ trueFunc = BaseFuncs.trueFunc, |
+ falseFunc = BaseFuncs.falseFunc; |
+ |
+function compile(selector, options){ |
+ var next = compileUnsafe(selector, options); |
+ |
+ return function base(elem){ |
+ return isTag(elem) && next(elem); |
+ }; |
+} |
+ |
+function compileUnsafe(selector, options){ |
+ return parse(selector, options) |
+ .map(compileRules) |
+ .reduce(reduceRules, falseFunc); |
+} |
+ |
+function compileRules(arr){ |
+ if(arr.length === 0) return falseFunc; |
+ return sortRules(arr).reduce(function(func, rule){ |
+ if(func === falseFunc) return func; |
+ return Rules[rule.type](func, rule); |
+ }, trueFunc); |
+} |
+ |
+function reduceRules(a, b){ |
+ if(b === falseFunc || a === trueFunc){ |
+ return a; |
+ } |
+ if(a === falseFunc || b === trueFunc){ |
+ return b; |
+ } |
+ |
+ return function combine(elem){ |
+ return a(elem) || b(elem); |
+ }; |
+} |
+ |
+//:not and :has have to compile selectors |
+//doing this in lib/pseudos.js would lead to circular dependencies, |
+//so we add them here |
+ |
+var Pseudos = require("./pseudos.js"), |
+ filters = Pseudos.filters, |
+ isParent = Pseudos.pseudos.parent, |
+ existsOne = DomUtils.existsOne, |
+ getChildren = DomUtils.getChildren; |
+ |
+filters.not = function(next, select){ |
+ var func = compileUnsafe(select); |
+ |
+ if(func === falseFunc) return next; |
+ if(func === trueFunc) return falseFunc; |
+ |
+ return function(elem){ |
+ return !func(elem) && next(elem); |
+ }; |
+}; |
+ |
+filters.has = function(next, selector){ |
+ var func = compile(selector); |
+ |
+ if(func === falseFunc) return falseFunc; |
+ if(func === trueFunc) return function(elem){ |
+ return isParent(elem) && next(elem); |
+ }; |
+ |
+ return function has(elem){ |
+ return next(elem) && existsOne(func, getChildren(elem)); |
+ }; |
+}; |