"use strict"; // Following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = void 0; // Whitespace as per https://www.w3.org/TR/selectors-3/#lex is " \t\r\n\f" var whitespace = new Set([9, 10, 12, 13, 32]); var ZERO = "0".charCodeAt(0); var NINE = "9".charCodeAt(0); /** * Parses an expression. * * @throws An `Error` if parsing fails. * @returns An array containing the integer step size and the integer offset of the nth rule. * @example nthCheck.parse("2n+3"); // returns [2, 3] */ function parse(formula) { formula = formula.trim().toLowerCase(); if (formula === "even") { return [2, 0]; } else if (formula === "odd") { return [2, 1]; } // Parse [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]? var idx = 0; var a = 0; var sign = readSign(); var number = readNumber(); if (idx < formula.length && formula.charAt(idx) === "n") { idx++; a = sign * (number !== null && number !== void 0 ? number : 1); skipWhitespace(); if (idx < formula.length) { sign = readSign(); skipWhitespace(); number = readNumber(); } else { sign = number = 0; } } // Throw if there is anything else if (number === null || idx < formula.length) { throw new Error("n-th rule couldn't be parsed ('" + formula + "')"); } return [a, sign * number]; function readSign() { if (formula.charAt(idx) === "-") { idx++; return -1; } if (formula.charAt(idx) === "+") { idx++; } return 1; } function readNumber() { var start = idx; var value = 0; while (idx < formula.length && formula.charCodeAt(idx) >= ZERO && formula.charCodeAt(idx) <= NINE) { value = value * 10 + (formula.charCodeAt(idx) - ZERO); idx++; } // Return `null` if we didn't read anything. return idx === start ? null : value; } function skipWhitespace() { while (idx < formula.length && whitespace.has(formula.charCodeAt(idx))) { idx++; } } } exports.parse = parse;