| module.exports = parse; |
| |
| //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(isNaN(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 |
| ]; |
| } |
| } |