| Index: node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/nth-check.js
 | 
| diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/nth-check.js b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/nth-check.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..14b37ccc9cd3b16e5a1cac3b66fabdc2e05e546a
 | 
| --- /dev/null
 | 
| +++ b/node_modules/vulcanize/node_modules/whacko/node_modules/CSSselect/lib/nth-check.js
 | 
| @@ -0,0 +1,84 @@
 | 
| +var BaseFuncs = require("./basefunctions.js"),
 | 
| +    trueFunc  = BaseFuncs.trueFunc,
 | 
| +    falseFunc = BaseFuncs.falseFunc;
 | 
| +
 | 
| +module.exports = function nthCheck(formula){
 | 
| +	return compile(parse(formula));
 | 
| +};
 | 
| +
 | 
| +module.exports.parse = parse;
 | 
| +module.exports.compile = compile;
 | 
| +
 | 
| +//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
 | 
| +
 | 
| +//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
 | 
| +var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
 | 
| +
 | 
| +/*
 | 
| +	parses a nth-check formula, returns an array of two numbers
 | 
| +*/
 | 
| +function parse(formula){
 | 
| +	formula = formula.trim().toLowerCase();
 | 
| +
 | 
| +	if(formula === "even"){
 | 
| +		return [2, 0];
 | 
| +	} else if(formula === "odd"){
 | 
| +		return [2, 1];
 | 
| +	} else {
 | 
| +		var parsed = formula.match(re_nthElement);
 | 
| +
 | 
| +		if(!parsed){
 | 
| +			throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')");
 | 
| +		}
 | 
| +
 | 
| +		var a;
 | 
| +
 | 
| +		if(parsed[1]){
 | 
| +			a = parseInt(parsed[1], 10);
 | 
| +			if(!a){
 | 
| +				if(parsed[1].charAt(0) === "-") a = -1;
 | 
| +				else a = 1;
 | 
| +			}
 | 
| +		} else a = 0;
 | 
| +
 | 
| +		return [
 | 
| +			a,
 | 
| +			parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0
 | 
| +		];
 | 
| +	}
 | 
| +}
 | 
| +
 | 
| +/*
 | 
| +	returns a function that checks if an elements index matches the given rule
 | 
| +	highly optimized to return the fastest solution
 | 
| +*/
 | 
| +function compile(parsed){
 | 
| +	var a = parsed[0],
 | 
| +	    b = parsed[1] - 1;
 | 
| +
 | 
| +	//when b <= 0, a*n won't be possible for any matches when a < 0
 | 
| +	//besides, the specification says that no element is matched when a and b are 0
 | 
| +	if(b < 0 && a <= 0) return falseFunc;
 | 
| +
 | 
| +	//when a is in the range -1..1, it matches any element (so only b is checked)
 | 
| +	if(a ===-1) return function(pos){ return pos <= b; };
 | 
| +	if(a === 0) return function(pos){ return pos === b; };
 | 
| +	//when b <= 0 and a === 1, they match any element
 | 
| +	if(a === 1) return b < 0 ? trueFunc : function(pos){ return pos >= b; };
 | 
| +
 | 
| +	//when a > 0, modulo can be used to check if there is a match
 | 
| +	var bMod = b % a;
 | 
| +	if(bMod < 0) bMod += a;
 | 
| +
 | 
| +	if(a > 1){
 | 
| +		return function(pos){
 | 
| +			return pos >= b && pos % a === bMod;
 | 
| +		};
 | 
| +	}
 | 
| +
 | 
| +	a *= -1; //make `a` positive
 | 
| +
 | 
| +	return function(pos){
 | 
| +		return pos <= b && pos % a === bMod;
 | 
| +	};
 | 
| +}
 | 
| 
 |