about summary refs log tree commit diff stats
path: root/src/css
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-06-27 23:53:44 +0200
committerbptato <nincsnevem662@gmail.com>2022-07-11 21:08:10 +0200
commit62cba694e47a7a1f4bedc7fd48ceac9c26aa3aa1 (patch)
treee20a9f39a293c256f707162c46e117d13f3d5621 /src/css
parent84882cb8a6f9bca58d178a1f2b8fb5cafa8b3a56 (diff)
downloadchawan-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.nim10
-rw-r--r--src/css/select.nim64
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)