| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 1 | module.exports = parse; |
| 2 | |
| 3 | //following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo |
| 4 | |
| 5 | //[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]? |
| 6 | var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/; |
| 7 | |
| 8 | /* |
| 9 | parses a nth-check formula, returns an array of two numbers |
| 10 | */ |
| 11 | function parse(formula){ |
| 12 | formula = formula.trim().toLowerCase(); |
| 13 | |
| 14 | if(formula === "even"){ |
| 15 | return [2, 0]; |
| 16 | } else if(formula === "odd"){ |
| 17 | return [2, 1]; |
| 18 | } else { |
| 19 | var parsed = formula.match(re_nthElement); |
| 20 | |
| 21 | if(!parsed){ |
| 22 | throw new SyntaxError("n-th rule couldn't be parsed ('" + formula + "')"); |
| 23 | } |
| 24 | |
| 25 | var a; |
| 26 | |
| 27 | if(parsed[1]){ |
| 28 | a = parseInt(parsed[1], 10); |
| 29 | if(isNaN(a)){ |
| 30 | if(parsed[1].charAt(0) === "-") a = -1; |
| 31 | else a = 1; |
| 32 | } |
| 33 | } else a = 0; |
| 34 | |
| 35 | return [ |
| 36 | a, |
| 37 | parsed[3] ? parseInt((parsed[2] || "") + parsed[3], 10) : 0 |
| 38 | ]; |
| 39 | } |
| 40 | } |