blob: 5302951f9dd6e5c840ba69a5a2de7633cd2b70f7 [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001module.exports = parse;
2
3//following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
4
5//[ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
6var re_nthElement = /^([+\-]?\d*n)?\s*(?:([+\-]?)\s*(\d+))?$/;
7
8/*
9 parses a nth-check formula, returns an array of two numbers
10*/
11function 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}