diff options
author | bptato <nincsnevem662@gmail.com> | 2025-01-15 22:58:06 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2025-01-16 00:16:20 +0100 |
commit | 5209268ce43e78dabdddeec761f431fb0f23fe5b (patch) | |
tree | 3028e4020750a3f41e5fd9d34cbd0baa60b0bc62 /src | |
parent | e5a668525df418f6c490cb14118a7e3613f670b1 (diff) | |
download | chawan-5209268ce43e78dabdddeec761f431fb0f23fe5b.tar.gz |
sheet, selectorparser: fix attr hashing, hash multiple tags in :is
Diffstat (limited to 'src')
-rw-r--r-- | src/css/selectorparser.nim | 2 | ||||
-rw-r--r-- | src/css/sheet.nim | 33 |
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) |