diff options
author | bptato <nincsnevem662@gmail.com> | 2022-01-23 11:20:27 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2022-01-23 11:20:27 +0100 |
commit | eeebe788fef445e6fb7f92596a47238205e33a10 (patch) | |
tree | 87a06fe31cb3bc4259d1bcb4e1669c8819331229 /src/layout | |
parent | 8e1ccfe2f2809b5bbae2d311e1b30f9ffe1833f6 (diff) | |
download | chawan-eeebe788fef445e6fb7f92596a47238205e33a10.tar.gz |
Fix ::before pseudo elem positioning
Diffstat (limited to 'src/layout')
-rw-r--r-- | src/layout/engine.nim | 33 |
1 files changed, 19 insertions, 14 deletions
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 |