diff options
author | bptato <nincsnevem662@gmail.com> | 2022-01-24 23:20:05 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2022-01-24 23:20:05 +0100 |
commit | 2a94a2709e4a6784a1269c7afe77f7125c900d1a (patch) | |
tree | 9a8fdd12cfd532736a9c47ea8c1b0a9acb93629a /src/css | |
parent | acf7cfad349f45bc97d84e9d0690aa36b1332919 (diff) | |
download | chawan-2a94a2709e4a6784a1269c7afe77f7125c900d1a.tar.gz |
Selector adjustments
Diffstat (limited to 'src/css')
-rw-r--r-- | src/css/select.nim | 18 | ||||
-rw-r--r-- | src/css/selparser.nim | 20 |
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": |