diff options
Diffstat (limited to 'src/css')
-rw-r--r-- | src/css/cascade.nim | 7 | ||||
-rw-r--r-- | src/css/select.nim | 35 |
2 files changed, 27 insertions, 15 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim index 16e5664a..8b93e8d0 100644 --- a/src/css/cascade.nim +++ b/src/css/cascade.nim @@ -261,9 +261,10 @@ proc applyRules(document: Document, ua, user: CSSStylesheet, cachedTree: StyledN let elem = Element(styledChild.node) # Add a nil before the last element (in-stack), so we can remove the # stylesheets - if elem.sheets.len > 0: - author.add(elem.sheets) - lenstack.add(elem.sheets.len) + let sheets = elem.sheets() + if sheets.len > 0: + author.add(sheets) + lenstack.add(sheets.len) styledStack.add((nil, nil, PSEUDO_NONE, nil)) stack_append styledChild, PSEUDO_AFTER diff --git a/src/css/select.nim b/src/css/select.nim index f8769418..b43604c4 100644 --- a/src/css/select.nim +++ b/src/css/select.nim @@ -30,7 +30,14 @@ func pseudoSelectorMatches(elem: Element, sel: Selector): bool = 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.document.html - of PSEUDO_NTH_CHILD: return int64(sel.pseudonum - 1) in elem.parentNode.children.low..elem.parentNode.children.high and elem.parentNode.children[int64(sel.pseudonum - 1)] == elem + of PSEUDO_NTH_CHILD: + let n = int64(sel.pseudonum - 1) + var i = 0 + for child in elem.parentNode.children: + if i == n: + return child == elem + inc i + return false of PSEUDO_CHECKED: if elem.tagType == TAG_INPUT: return HTMLInputElement(elem).checked @@ -74,18 +81,22 @@ func combinatorSelectorMatches(elem: Element, sel: Selector): bool = dec i e = e.parentElement of NEXT_SIBLING_COMBINATOR: - var e = elem.previousElementSibling - while e != nil and i >= 0: - if not e.selectorsMatch(sel.csels[i]): - return false - dec i - e = e.previousElementSibling - of SUBSEQ_SIBLING_COMBINATOR: - var e = elem.previousElementSibling - while e != nil and i >= 0: - if e.selectorsMatch(sel.csels[i]): + var found = false + for child in elem.parentElement.children_rev: + if found: + if not child.selectorsMatch(sel.csels[i]): + return false dec i - e = e.previousElementSibling + if child == elem: + found = true + of SUBSEQ_SIBLING_COMBINATOR: + var found = false + for child in elem.parentElement.children_rev: + if found: + if child.selectorsMatch(sel.csels[i]): + dec i + if child == elem: + found = true return i == -1 return false |