about summary refs log tree commit diff stats
path: root/src/css/sheet.nim
diff options
context:
space:
mode:
Diffstat (limited to 'src/css/sheet.nim')
-rw-r--r--src/css/sheet.nim42
1 files changed, 23 insertions, 19 deletions
diff --git a/src/css/sheet.nim b/src/css/sheet.nim
index 0793e903..818e30f8 100644
--- a/src/css/sheet.nim
+++ b/src/css/sheet.nim
@@ -7,6 +7,7 @@ import css/mediaquery
 import css/selectorparser
 import html/catom
 import types/url
+import types/winattrs
 import utils/twtstr
 
 type
@@ -36,6 +37,7 @@ type
     importList*: seq[URL]
     len: int
     factory*: CAtomFactory
+    attrs: ptr WindowAttributes
 
 type SelectorHashes = object
   tag: CAtom
@@ -43,7 +45,8 @@ type SelectorHashes = object
   class: CAtom
   attr: CAtom
 
-func newStylesheet*(cap: int; factory: CAtomFactory): CSSStylesheet =
+func newStylesheet*(cap: int; factory: CAtomFactory;
+    attrs: ptr WindowAttributes): CSSStylesheet =
   let bucketsize = cap div 2
   return CSSStylesheet(
     tagTable: initTable[CAtom, seq[CSSRuleDef]](bucketsize),
@@ -51,7 +54,8 @@ func newStylesheet*(cap: int; factory: CAtomFactory): CSSStylesheet =
     classTable: initTable[CAtom, seq[CSSRuleDef]](bucketsize),
     attrTable: initTable[CAtom, seq[CSSRuleDef]](bucketsize),
     generalList: newSeqOfCap[CSSRuleDef](bucketsize),
-    factory: factory
+    factory: factory,
+    attrs: attrs
   )
 
 proc getSelectorIds(hashes: var SelectorHashes; sel: Selector): bool
@@ -176,29 +180,29 @@ proc add*(sheet, sheet2: CSSStylesheet) =
     do:
       sheet.attrTable[key] = value
 
-proc addRule(stylesheet: CSSStylesheet; rule: CSSQualifiedRule) =
-  let sels = parseSelectors(rule.prelude, stylesheet.factory)
+proc addRule(sheet: CSSStylesheet; rule: CSSQualifiedRule) =
+  let sels = parseSelectors(rule.prelude, sheet.factory)
   if sels.len > 0:
     var normalVals: seq[CSSComputedEntry] = @[]
     var importantVals: seq[CSSComputedEntry] = @[]
     let decls = rule.oblock.value.parseDeclarations()
     for decl in decls:
-      let vals = parseComputedValues(decl.name, decl.value)
+      let vals = parseComputedValues(decl.name, decl.value, sheet.attrs[])
       if decl.important:
         importantVals.add(vals)
       else:
         normalVals.add(vals)
-    stylesheet.add(CSSRuleDef(
+    sheet.add(CSSRuleDef(
       sels: sels,
       normalVals: normalVals,
       importantVals: importantVals,
-      idx: stylesheet.len
+      idx: sheet.len
     ))
-    inc stylesheet.len
+    inc sheet.len
 
-proc addAtRule(stylesheet: CSSStylesheet; atrule: CSSAtRule; base: URL) =
+proc addAtRule(sheet: CSSStylesheet; atrule: CSSAtRule; base: URL) =
   if atrule.name.equalsIgnoreCase("import"):
-    if stylesheet.len == 0 and base != nil:
+    if sheet.len == 0 and base != nil:
       var i = 0
       atrule.prelude.skipWhitespace(i)
       # Warning: this is a tracking vector minefield. If you implement
@@ -212,28 +216,28 @@ proc addAtRule(stylesheet: CSSStylesheet; atrule: CSSAtRule; base: URL) =
             atrule.prelude.skipWhitespace(i)
             # check if there are really no media queries/layers/etc
             if i == atrule.prelude.len:
-              stylesheet.importList.add(url.get)
+              sheet.importList.add(url.get)
   elif atrule.name.equalsIgnoreCase("media"):
     if atrule.oblock != nil:
-      let query = parseMediaQueryList(atrule.prelude)
+      let query = parseMediaQueryList(atrule.prelude, sheet.attrs)
       let rules = atrule.oblock.value.parseListOfRules()
       if rules.len > 0:
         var media = CSSMediaQueryDef()
-        media.children = newStylesheet(rules.len, stylesheet.factory)
-        media.children.len = stylesheet.len
+        media.children = newStylesheet(rules.len, sheet.factory, sheet.attrs)
+        media.children.len = sheet.len
         media.query = query
         for rule in rules:
           if rule of CSSAtRule:
             media.children.addAtRule(CSSAtRule(rule), nil)
           else:
             media.children.addRule(CSSQualifiedRule(rule))
-        stylesheet.mqList.add(media)
-        stylesheet.len = media.children.len
+        sheet.mqList.add(media)
+        sheet.len = media.children.len
 
-proc parseStylesheet*(ibuf: string; factory: CAtomFactory; base: URL):
-    CSSStylesheet =
+proc parseStylesheet*(ibuf: string; factory: CAtomFactory; base: URL;
+    attrs: ptr WindowAttributes): CSSStylesheet =
   let raw = parseStylesheet(ibuf)
-  let sheet = newStylesheet(raw.value.len, factory)
+  let sheet = newStylesheet(raw.value.len, factory, attrs)
   for v in raw.value:
     if v of CSSAtRule:
       sheet.addAtRule(CSSAtRule(v), base)