about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-04-02 18:22:38 +0200
committerbptato <nincsnevem662@gmail.com>2025-04-02 18:22:38 +0200
commitc7f7042b0089086278a68e49a24c6d1aafa9d61f (patch)
tree75a6be1e2148a383fda3320e620eef89683f2e51 /src
parent7cf2d3856f3a39fcca14c28889a9c1ba08e9e8f1 (diff)
downloadchawan-c7f7042b0089086278a68e49a24c6d1aafa9d61f.tar.gz
cssparser: ignore case in AnB parsing of odd/even
Diffstat (limited to 'src')
-rw-r--r--src/css/cssparser.nim123
1 files changed, 65 insertions, 58 deletions
diff --git a/src/css/cssparser.nim b/src/css/cssparser.nim
index dc23d0da..f5c47ffd 100644
--- a/src/css/cssparser.nim
+++ b/src/css/cssparser.nim
@@ -735,13 +735,18 @@ iterator parseCommaSepComponentValues*(cvals: openArray[CSSComponentValue]):
   while cvals.nextCommaSepComponentValue(s, i):
     yield move(s)
 
+type AnBIdent = enum
+  abiOdd = "odd"
+  abiEven = "even"
+  abiN = "n"
+  abiDashN = "-n"
+  abiNDash = "n-"
+  abiDashNDash = "-n-"
+
 proc parseAnB*(cvals: openArray[CSSComponentValue]; i: var int):
     Opt[CSSAnB] =
   template is_eof: bool =
     i >= cvals.len or not (cvals[i] of CSSToken)
-  template fail_eof =
-    if is_eof:
-      return err()
   template get_plus: bool =
     let tok = cvals.getToken(i, cttDelim)
     if tok.isSome and tok.get.cvalue == '+':
@@ -753,11 +758,10 @@ proc parseAnB*(cvals: openArray[CSSComponentValue]; i: var int):
     i = cvals.skipBlanks(i)
     ?cvals.consumeToken(i)
   template fail_plus =
-    if is_plus:
+    if isPlus:
       return err()
-  template parse_sub_int(sub: string; skip: int): int32 =
-    let s = sub.substr(skip)
-    let x = parseInt32(s)
+  template parse_sub_int(s: string; skip: int): int32 =
+    let x = parseInt32(s.toOpenArray(skip, s.high))
     if x.isNone:
       return err()
     x.get
@@ -772,60 +776,63 @@ proc parseAnB*(cvals: openArray[CSSComponentValue]; i: var int):
     fail_non_integer tok, res #TODO check if signless?
 
   i = cvals.skipBlanks(i)
-  fail_eof
-  let is_plus = get_plus
+  if is_eof:
+    return err()
+  let isPlus = get_plus
   let tok = ?cvals.consumeToken(i)
   case tok.t
   of cttIdent:
-    case tok.value
-    of "odd":
-      fail_plus
-      return ok((2i32, 1i32))
-    of "even":
-      fail_plus
-      return ok((2i32, 0i32))
-    of "n", "N":
-      i = cvals.skipBlanks(i)
-      if is_eof:
-        return ok((1i32, 0i32))
-      let tok2 = ?cvals.consumeToken(i)
-      if tok2.t == cttDelim:
-        let sign = case tok2.cvalue
-        of '+': 1i32
-        of '-': -1i32
-        else: return err()
-        let tok3 = get_tok
-        fail_non_signless_integer tok3, ok((1i32, 0i32))
-        return ok((1i32, sign * int32(tok3.nvalue)))
-      else:
-        fail_non_integer tok2, ok((1i32, 0i32))
-        return ok((1i32, int32(tok2.nvalue)))
-    of "-n", "-N":
-      fail_plus
-      i = cvals.skipBlanks(i)
-      if is_eof:
-        return ok((-1i32, 0i32))
-      let tok2 = ?cvals.consumeToken(i)
-      if tok2.t == cttDelim:
-        let sign = case tok2.cvalue
-        of '+': 1i32
-        of '-': -1i32
-        else: return err()
-        let tok3 = get_tok
-        fail_non_signless_integer tok3, ok((-1i32, 0i32))
-        return ok((-1i32, sign * int32(tok3.nvalue)))
-      else:
-        fail_non_integer tok2, ok((-1i32, 0i32))
-        return ok((-1i32, int32(tok2.nvalue)))
-    of "n-", "N-":
-      let tok2 = get_tok
-      fail_non_signless_integer tok2, err()
-      return ok((1i32, -int32(tok2.nvalue)))
-    of "-n-", "-N-":
-      fail_plus
-      let tok2 = get_tok
-      fail_non_signless_integer tok2, err()
-      return ok((-1i32, -int32(tok2.nvalue)))
+    let x = parseEnumNoCase[AnBIdent](tok.value)
+    if x.isSome:
+      case x.get
+      of abiOdd:
+        fail_plus
+        return ok((2i32, 1i32))
+      of abiEven:
+        fail_plus
+        return ok((2i32, 0i32))
+      of abiN:
+        i = cvals.skipBlanks(i)
+        if is_eof:
+          return ok((1i32, 0i32))
+        let tok2 = ?cvals.consumeToken(i)
+        if tok2.t == cttDelim:
+          let sign = case tok2.cvalue
+          of '+': 1i32
+          of '-': -1i32
+          else: return err()
+          let tok3 = get_tok
+          fail_non_signless_integer tok3, ok((1i32, 0i32))
+          return ok((1i32, sign * int32(tok3.nvalue)))
+        else:
+          fail_non_integer tok2, ok((1i32, 0i32))
+          return ok((1i32, int32(tok2.nvalue)))
+      of abiDashN:
+        fail_plus
+        i = cvals.skipBlanks(i)
+        if is_eof:
+          return ok((-1i32, 0i32))
+        let tok2 = ?cvals.consumeToken(i)
+        if tok2.t == cttDelim:
+          let sign = case tok2.cvalue
+          of '+': 1i32
+          of '-': -1i32
+          else: return err()
+          let tok3 = get_tok
+          fail_non_signless_integer tok3, ok((-1i32, 0i32))
+          return ok((-1i32, sign * int32(tok3.nvalue)))
+        else:
+          fail_non_integer tok2, ok((-1i32, 0i32))
+          return ok((-1i32, int32(tok2.nvalue)))
+      of abiNDash:
+        let tok2 = get_tok
+        fail_non_signless_integer tok2, err()
+        return ok((1i32, -int32(tok2.nvalue)))
+      of abiDashNDash:
+        fail_plus
+        let tok2 = get_tok
+        fail_non_signless_integer tok2, err()
+        return ok((-1i32, -int32(tok2.nvalue)))
     elif tok.value.startsWithIgnoreCase("n-"):
       return ok((1i32, -parse_sub_int(tok.value, "n-".len)))
     elif tok.value.startsWithIgnoreCase("-n-"):