diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/css/cascade.nim | 11 | ||||
-rw-r--r-- | src/layout/engine.nim | 33 |
2 files changed, 26 insertions, 18 deletions
diff --git a/src/css/cascade.nim b/src/css/cascade.nim index dc11628f..0e481a10 100644 --- a/src/css/cascade.nim +++ b/src/css/cascade.nim @@ -25,13 +25,12 @@ proc applyProperty(elem: Element, d: CSSDeclaration, pseudo: PseudoElem) = else: parent = rootProperties() - case pseudo - of PSEUDO_NONE: + if pseudo == PSEUDO_NONE: elem.css.applyValue(parent, d) - of PSEUDO_BEFORE, PSEUDO_AFTER: + else: if elem.pseudo[pseudo] == nil: elem.pseudo[pseudo] = elem.css.inheritProperties() - elem.pseudo[pseudo].applyValue(parent, d) + elem.pseudo[pseudo].applyValue(elem.css, d) elem.cssapplied = true @@ -111,10 +110,14 @@ proc checkRendered(element: Element, prev: CSSSpecifiedValues, ppseudo: array[PS if element.rendered: for p in PSEUDO_BEFORE..PSEUDO_AFTER: if ppseudo[p] != element.pseudo[p] and ppseudo[p] == nil: + if element.parentElement != nil: + element.parentElement.rendered = false element.rendered = false return for t in CSSPropertyType: if not element.css[t].equals(prev[t]): + if element.parentElement != nil: + element.parentElement.rendered = false element.rendered = false return for p in PSEUDO_BEFORE..PSEUDO_AFTER: diff --git a/src/layout/engine.nim b/src/layout/engine.nim index a0046f36..d11f1093 100644 --- a/src/layout/engine.nim +++ b/src/layout/engine.nim @@ -368,11 +368,16 @@ proc getTextBox(box: CSSBox): InlineBox = result.inlinelayout = true result.specified = box.specified.inheritProperties() -proc getPseudoBox(specified: CSSSpecifiedValues): CSSBox = +proc getPseudoBox(bctx: BlockContext, specified: CSSSpecifiedValues): CSSBox = let box = getBox(specified) if box == nil: return nil + + if specified{"display"} in {DISPLAY_BLOCK, DISPLAY_LIST_ITEM}: + let box = BlockBox(box) + box.bctx = bctx.newBlockContext(box) + box.inlinelayout = true if specified{"content"}.len > 0: let content = getTextBox(box) @@ -442,13 +447,6 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C marker.text.add(elem.css{"list-style-type"}.listMarker(ordinalvalue)) add_box(marker) - let before = elem.pseudo[PSEUDO_BEFORE] - if before != nil: - let bbox = getPseudoBox(before) - bbox.node = elem - if bbox != nil: - add_box(bbox) - for child in elem.childNodes: case child.nodeType of ELEMENT_NODE: @@ -458,10 +456,23 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C ibox = box.getTextBox() ibox.newline = true + let before = elem.pseudo[PSEUDO_BEFORE] + if before != nil: + let bbox = bctx.getPseudoBox(before) + bbox.node = elem + if bbox != nil: + add_box(bbox) + let cbox = elem.generateBox(viewport, bctx) if cbox != nil: add_ibox() add_box(cbox) + + let after = elem.pseudo[PSEUDO_AFTER] + if after != nil: + let abox = bctx.getPseudoBox(after) + if abox != nil: + add_box(abox) of TEXT_NODE: let text = Text(child) # Don't generate empty anonymous inline blocks between block boxes @@ -475,12 +486,6 @@ proc generateBox(elem: Element, viewport: Viewport, bctx: BlockContext = nil): C else: discard add_ibox() - let after = elem.pseudo[PSEUDO_AFTER] - if after != nil: - let abox = getPseudoBox(after) - if abox != nil: - add_box(abox) - viewport.map[elem.uid] = box return box |