about summary refs log tree commit diff stats
path: root/src/css
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-01-24 23:20:05 +0100
committerbptato <nincsnevem662@gmail.com>2022-01-24 23:20:05 +0100
commit2a94a2709e4a6784a1269c7afe77f7125c900d1a (patch)
tree9a8fdd12cfd532736a9c47ea8c1b0a9acb93629a /src/css
parentacf7cfad349f45bc97d84e9d0690aa36b1332919 (diff)
downloadchawan-2a94a2709e4a6784a1269c7afe77f7125c900d1a.tar.gz
Selector adjustments
Diffstat (limited to 'src/css')
-rw-r--r--src/css/select.nim18
-rw-r--r--src/css/selparser.nim20
2 files changed, 21 insertions, 17 deletions
diff --git a/src/css/select.nim b/src/css/select.nim
index 2d4706dd..e9f55b3c 100644
--- a/src/css/select.nim
+++ b/src/css/select.nim
@@ -22,17 +22,13 @@ func attrSelectorMatches(elem: Element, sel: Selector): bool =
   of '*': return elem.attr(sel.attr).contains(sel.value)
   else: return false
 
-func pseudoElemSelectorMatches(elem: Element, sel: Selector): bool {.inline.} =
-  return true
-
 func pseudoSelectorMatches(elem: Element, sel: Selector): bool =
   case sel.pseudo
-  of "first-child": return elem.parentNode.firstElementChild == elem
-  of "last-child": return elem.parentNode.lastElementChild == elem
-  of "only-child": return elem.parentNode.firstElementChild == elem and elem.parentNode.lastElementChild == elem
-  of "hover": return elem.hover
-  of "root": return elem == elem.ownerDocument.root
-  else: return false
+  of PSEUDO_FIRST_CHILD: return elem.parentNode.firstElementChild == elem
+  of PSEUDO_LAST_CHILD: return elem.parentNode.lastElementChild == elem
+  of PSEUDO_ONLY_CHILD: return elem.parentNode.firstElementChild == elem and elem.parentNode.lastElementChild == elem
+  of PSEUDO_HOVER: return elem.hover
+  of PSEUDO_ROOT: return elem == elem.ownerDocument.root
 
 func selectorsMatch*(elem: Element, selectors: SelectorList): bool
 
@@ -98,7 +94,7 @@ func selectorMatches(elem: Element, sel: Selector): bool =
   of PSEUDO_SELECTOR:
     return pseudoSelectorMatches(elem, sel)
   of PSELEM_SELECTOR:
-    return pseudoElemSelectorMatches(elem, sel)
+    return true
   of UNIVERSAL_SELECTOR:
     return true
   of FUNC_SELECTOR:
@@ -127,7 +123,7 @@ func selectElems(document: Document, sel: Selector): seq[Element] =
   of PSEUDO_SELECTOR:
     return document.all_elements.filter((elem) => pseudoSelectorMatches(elem, sel))
   of PSELEM_SELECTOR:
-    return document.all_elements.filter((elem) => pseudoElemSelectorMatches(elem, sel))
+    return document.all_elements
   of FUNC_SELECTOR:
     return document.all_elements.filter((elem) => selectorMatches(elem, sel))
   of COMBINATOR_SELECTOR:
diff --git a/src/css/selparser.nim b/src/css/selparser.nim
index 488005a4..bd114876 100644
--- a/src/css/selparser.nim
+++ b/src/css/selparser.nim
@@ -17,9 +17,9 @@ type
   PseudoElem* = enum
     PSEUDO_NONE, PSEUDO_BEFORE, PSEUDO_AFTER
 
-  #PseudoSelector* = enum
-  #  PSEUDO_FIRST_CHILD, PSEUDO_LAST_CHILD, PSEUDO_ONLY_CHILD, PSEUDO_HOVER,
-  #  PSEUDO_ROOT
+  PseudoClass* = enum
+    PSEUDO_FIRST_CHILD, PSEUDO_LAST_CHILD, PSEUDO_ONLY_CHILD, PSEUDO_HOVER,
+    PSEUDO_ROOT
 
   CombinatorType* = enum
     DESCENDANT_COMBINATOR, CHILD_COMBINATOR, NEXT_SIBLING_COMBINATOR,
@@ -46,7 +46,7 @@ type
     of UNIVERSAL_SELECTOR: #TODO namespaces?
       discard
     of PSEUDO_SELECTOR:
-      pseudo*: string
+      pseudo*: PseudoClass
     of PSELEM_SELECTOR:
       elem*: PseudoElem
     of FUNC_SELECTOR:
@@ -197,8 +197,16 @@ proc parseSelectorToken(state: var SelectorParser, csstoken: CSSToken) =
         state.addSelector(Selector(t: PSELEM_SELECTOR, elem: PSEUDO_BEFORE))
       of "after":
         state.addSelector(Selector(t: PSELEM_SELECTOR, elem: PSEUDO_AFTER))
-      else:
-        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: $csstoken.value))
+      of "first-child":
+        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: PSEUDO_FIRST_CHILD))
+      of "last-child":
+        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: PSEUDO_LAST_CHILD))
+      of "only-child":
+        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: PSEUDO_ONLY_CHILD))
+      of "hover":
+        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: PSEUDO_HOVER))
+      of "root":
+        state.addSelector(Selector(t: PSEUDO_SELECTOR, pseudo: PSEUDO_ROOT))
     of QUERY_PSELEM:
       case $csstoken.value
       of "before":