diff options
author | bptato <nincsnevem662@gmail.com> | 2022-06-27 23:53:44 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2022-07-11 21:08:10 +0200 |
commit | 62cba694e47a7a1f4bedc7fd48ceac9c26aa3aa1 (patch) | |
tree | e20a9f39a293c256f707162c46e117d13f3d5621 /src/css | |
parent | 84882cb8a6f9bca58d178a1f2b8fb5cafa8b3a56 (diff) | |
download | chawan-62cba694e47a7a1f4bedc7fd48ceac9c26aa3aa1.tar.gz |
Implement HTML5 parsing
Completely replaced the previous HTML2 (?) parser, which was a bad re-implementation of w3m's parser in the first place. Now we have a (sort of) compliant HTML5 parser. Needs tests, badly.
Diffstat (limited to 'src/css')
-rw-r--r-- | src/css/cascade.nim | 10 | ||||
-rw-r--r-- | src/css/select.nim | 64 |
2 files changed, 38 insertions, 36 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim index 93131637..8a52cc58 100644 --- a/src/css/cascade.nim +++ b/src/css/cascade.nim @@ -85,7 +85,7 @@ func calcRules(elem: Element, sheet: CSSStylesheet): DeclarationList = for dl in item[1]: dl -#TODO couldn't these two procedures be merged? + proc applyNormal(ares: var ApplyResult, decls: seq[CSSDeclaration]) = for decl in decls: if not decl.important: @@ -172,12 +172,14 @@ proc applyRules(elem: Element, ua, user: CSSStylesheet, author: seq[CSSStyleshee proc applyRules(document: Document, ua, user: CSSStylesheet) = var author: seq[CSSStylesheet] - for sheet in document.head.sheets: - author.add(sheet) + if document.head != nil: + for sheet in document.head.sheets: + author.add(sheet) var stack: seq[Element] - stack.add(document.root) + if document.html != nil: + stack.add(document.html) var lenstack = newSeqOfCap[int](15) while stack.len > 0: diff --git a/src/css/select.nim b/src/css/select.nim index 1fa01ac5..0d6ad6f0 100644 --- a/src/css/select.nim +++ b/src/css/select.nim @@ -28,7 +28,7 @@ func pseudoSelectorMatches(elem: Element, sel: Selector): bool = 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 + 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 func selectorsMatch*(elem: Element, selectors: SelectorList): bool @@ -109,36 +109,36 @@ func selectorsMatch*(elem: Element, selectors: SelectorList): bool = return false return true -func selectElems(document: Document, sel: Selector): seq[Element] = - case sel.t - of TYPE_SELECTOR: - return document.type_elements[sel.tag] - of ID_SELECTOR: - return document.id_elements.getOrDefault(sel.id, newSeq[Element]()) - of CLASS_SELECTOR: - return document.class_elements.getOrDefault(sel.class, newSeq[Element]()) - of UNIVERSAL_SELECTOR: - return document.all_elements - of ATTR_SELECTOR: - return document.all_elements.filter((elem) => attrSelectorMatches(elem, sel)) - of PSEUDO_SELECTOR: - return document.all_elements.filter((elem) => pseudoSelectorMatches(elem, sel)) - of PSELEM_SELECTOR: - return document.all_elements - of FUNC_SELECTOR: - return document.all_elements.filter((elem) => selectorMatches(elem, sel)) - of COMBINATOR_SELECTOR: - return document.all_elements.filter((elem) => selectorMatches(elem, sel)) - -func selectElems(document: Document, selectors: SelectorList): seq[Element] = - assert(selectors.len > 0) - let sellist = optimizeSelectorList(selectors) - result = document.selectElems(selectors[0]) - var i = 1 - - while i < sellist.len: - result = result.filter((elem) => selectorMatches(elem, sellist[i])) - inc i +#func selectElems(document: Document, sel: Selector): seq[Element] = +# case sel.t +# of TYPE_SELECTOR: +# return document.type_elements[sel.tag] +# of ID_SELECTOR: +# return document.id_elements.getOrDefault(sel.id, newSeq[Element]()) +# of CLASS_SELECTOR: +# return document.class_elements.getOrDefault(sel.class, newSeq[Element]()) +# of UNIVERSAL_SELECTOR: +# return document.all_elements +# of ATTR_SELECTOR: +# return document.all_elements.filter((elem) => attrSelectorMatches(elem, sel)) +# of PSEUDO_SELECTOR: +# return document.all_elements.filter((elem) => pseudoSelectorMatches(elem, sel)) +# of PSELEM_SELECTOR: +# return document.all_elements +# of FUNC_SELECTOR: +# return document.all_elements.filter((elem) => selectorMatches(elem, sel)) +# of COMBINATOR_SELECTOR: +# return document.all_elements.filter((elem) => selectorMatches(elem, sel)) + +#func selectElems(document: Document, selectors: SelectorList): seq[Element] = +# assert(selectors.len > 0) +# let sellist = optimizeSelectorList(selectors) +# result = document.selectElems(selectors[0]) +# var i = 1 +# +# while i < sellist.len: +# result = result.filter((elem) => selectorMatches(elem, sellist[i])) +# inc i func selectElems(element: Element, sel: Selector): seq[Element] = case sel.t @@ -177,7 +177,7 @@ proc querySelectorAll*(document: Document, q: string): seq[Element] = let selectors = parseSelectors(cvals) for sel in selectors: - result.add(document.selectElems(sel)) + result.add(document.html.selectElems(sel)) proc querySelector*(document: Document, q: string): Element = let elems = document.querySelectorAll(q) |