aboutsummaryrefslogtreecommitdiff
path: root/node_modules/nth-check/lib/parse.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-02-09 17:58:07 +0100
committerMinteck <contact@minteck.org>2022-02-09 17:58:07 +0100
commit22a25ded9f7d9c9a96cce8d1bc12475ca0434201 (patch)
tree0e33d0650fe58f41c00bbc4b8047956905766823 /node_modules/nth-check/lib/parse.js
parent8f54d903fb3470823a5e4d6ff4655de009836245 (diff)
downloadyoutoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.tar.gz
youtoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.tar.bz2
youtoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.zip
Major update
Diffstat (limited to 'node_modules/nth-check/lib/parse.js')
-rw-r--r--node_modules/nth-check/lib/parse.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/node_modules/nth-check/lib/parse.js b/node_modules/nth-check/lib/parse.js
new file mode 100644
index 0000000..eaea29b
--- /dev/null
+++ b/node_modules/nth-check/lib/parse.js
@@ -0,0 +1,76 @@
+"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;