about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-15 22:58:06 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-16 00:16:20 +0100
commit5209268ce43e78dabdddeec761f431fb0f23fe5b (patch)
tree3028e4020750a3f41e5fd9d34cbd0baa60b0bc62 /src
parente5a668525df418f6c490cb14118a7e3613f670b1 (diff)
downloadchawan-5209268ce43e78dabdddeec761f431fb0f23fe5b.tar.gz
sheet, selectorparser: fix attr hashing, hash multiple tags in :is
Diffstat (limited to 'src')
-rw-r--r--src/css/selectorparser.nim2
-rw-r--r--src/css/sheet.nim33
2 files changed, 18 insertions, 17 deletions
diff --git a/src/css/selectorparser.nim b/src/css/selectorparser.nim
index a3cbdc11..026fe140 100644
--- a/src/css/selectorparser.nim
+++ b/src/css/selectorparser.nim
@@ -449,7 +449,7 @@ proc parseAttributeSelector(state: var SelectorParser;
       flag = rfS
   return Selector(
     t: stAttr,
-    attr: state.factory.toAtom(attr.value),
+    attr: state.factory.toAtomLower(attr.value),
     value: value.value,
     rel: SelectorRelation(t: rel, flag: flag)
   )
diff --git a/src/css/sheet.nim b/src/css/sheet.nim
index 7d1359f9..c0963d2b 100644
--- a/src/css/sheet.nim
+++ b/src/css/sheet.nim
@@ -43,7 +43,7 @@ type
     attrs: ptr WindowAttributes
 
 type SelectorHashes = object
-  tag: CAtom
+  tags: seq[CAtom]
   id: CAtom
   class: CAtom
   attr: CAtom
@@ -74,7 +74,7 @@ proc getSelectorIds(hashes: var SelectorHashes; cxsel: ComplexSelector) =
 proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool =
   case sel.t
   of stType:
-    hashes.tag = sel.tag
+    hashes.tags.add(sel.tag)
     return true
   of stClass:
     hashes.class = sel.class
@@ -84,6 +84,7 @@ proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool =
     return true
   of stAttr:
     hashes.attr = sel.attr
+    return true
   of stPseudoElement, stUniversal:
     return false
   of stPseudoClass:
@@ -96,7 +97,6 @@ proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool =
     # 4.   store hashable values of selector x that aren't stored yet
     # 5.   for every hashable value of selector 1 that doesn't match selector x
     # 6.     cancel hashable value
-    var cancelTag = false
     var cancelId = false
     var cancelClass = false
     var cancelAttr = false
@@ -107,10 +107,7 @@ proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool =
     while i < sel.pseudo.fsels.len:
       var nhashes = SelectorHashes()
       nhashes.getSelectorIds(sel.pseudo.fsels[i])
-      if hashes.tag == CAtomNull:
-        hashes.tag = nhashes.tag
-      elif nhashes.tag != CAtomNull and nhashes.tag != hashes.tag:
-        cancelTag = true
+      hashes.tags.add(nhashes.tags)
       if hashes.id == CAtomNull:
         hashes.id = nhashes.id
       elif nhashes.id != CAtomNull and nhashes.id != hashes.id:
@@ -124,26 +121,25 @@ proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool =
       elif nhashes.attr != CAtomNull and nhashes.attr != hashes.attr:
         cancelAttr = true
       inc i
-    if cancelTag:
-      hashes.tag = CAtomNull
     if cancelId:
       hashes.id = CAtomNull
     if cancelClass:
       hashes.class = CAtomNull
     if cancelAttr:
       hashes.attr = CAtomNull
-    return hashes.tag != CAtomNull or hashes.id != CAtomNull or
-      hashes.class != CAtomNull
+    return hashes.tags.len > 0 or hashes.id != CAtomNull or
+      hashes.class != CAtomNull or hashes.attr != CAtomNull
 
 proc add(sheet: CSSStylesheet; rule: CSSRuleDef) =
   var hashes = SelectorHashes()
   for cxsel in rule.sels:
     hashes.getSelectorIds(cxsel)
-    if hashes.tag != CAtomNull:
-      sheet.tagTable.withValue(hashes.tag, p):
-        p[].add(rule)
-      do:
-        sheet.tagTable[hashes.tag] = @[rule]
+    if hashes.tags.len > 0:
+      for tag in hashes.tags:
+        sheet.tagTable.withValue(tag, p):
+          p[].add(rule)
+        do:
+          sheet.tagTable[tag] = @[rule]
     elif hashes.id != CAtomNull:
       sheet.idTable.withValue(hashes.id, p):
         p[].add(rule)
@@ -154,6 +150,11 @@ proc add(sheet: CSSStylesheet; rule: CSSRuleDef) =
         p[].add(rule)
       do:
         sheet.classTable[hashes.class] = @[rule]
+    elif hashes.attr != CAtomNull:
+      sheet.attrTable.withValue(hashes.attr, p):
+        p[].add(rule)
+      do:
+        sheet.attrTable[hashes.attr] = @[rule]
     else:
       sheet.generalList.add(rule)