diff options
author | bptato <nincsnevem662@gmail.com> | 2021-12-15 22:11:41 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2021-12-15 22:11:41 +0100 |
commit | bc1aceb8d8060bc45d352cd9f411b9976044641c (patch) | |
tree | 9d4700419f7ffecfa18b14844922977cc1a2696b | |
parent | dd58218f02b0d73e4e148947b7fd61c7d3716804 (diff) | |
download | chawan-bc1aceb8d8060bc45d352cd9f411b9976044641c.tar.gz |
Better inline block support
Still needs a refactoring of at least the inline processing algorithm to work somewhat correctly. (how that should be done is another question...)
-rw-r--r-- | res/ua.css | 14 | ||||
-rw-r--r-- | src/css/values.nim | 1 | ||||
-rw-r--r-- | src/layout/engine.nim | 85 |
3 files changed, 63 insertions, 37 deletions
diff --git a/res/ua.css b/res/ua.css index 37f39592..573c73a2 100644 --- a/res/ua.css +++ b/res/ua.css @@ -35,8 +35,20 @@ colgroup { display: table-column-group; } -input { +input[type="text"] { width: 20ch; + margin-left: 1ch; + margin-right: 1ch; +} + +input[type="text"]::before { + content: '['; + text-decoration: none !important; +} + +input[type="text"]::after { + content: ']'; + text-decoration: none !important; } tr { diff --git a/src/css/values.nim b/src/css/values.nim index 82b82588..3f982b8d 100644 --- a/src/css/values.nim +++ b/src/css/values.nim @@ -588,6 +588,7 @@ func cssTextDecoration(d: CSSDeclaration): CSSTextDecoration = let tok = getToken(d) if tok.tokenType == CSS_IDENT_TOKEN: case $tok.value + of "none": return TEXT_DECORATION_NONE of "underline": return TEXT_DECORATION_UNDERLINE of "overline": return TEXT_DECORATION_OVERLINE of "line-through": return TEXT_DECORATION_LINE_THROUGH diff --git a/src/layout/engine.nim b/src/layout/engine.nim index 70914251..25da94b2 100644 --- a/src/layout/engine.nim +++ b/src/layout/engine.nim @@ -161,7 +161,6 @@ proc inlineWrap(state: var InlineState) = state.ibox.icontext.whitespace = true state.ibox.icontext.ws_initial = false state.ibox.icontext.conty = true - #eprint "wrap", state.rowbox.y, state.rowbox.str state.newRowBox() proc addWord(state: var InlineState) = @@ -281,7 +280,6 @@ proc processInlineText(lstate: var LayoutState, ibox: CSSInlineBox, str: string) state.ww += rw state.addWord() - #eprint "write", state.rowbox.y, state.rowbox.str if state.rowbox.str.len > 0: state.ibox.content.add(state.rowbox) @@ -313,38 +311,60 @@ proc processInlineBox(lstate: var LayoutState, parent: CSSBox, str: string): CSS lstate.processInlineText(ibox, str) return ibox -proc add(state: var LayoutState, parent: CSSBox, box: CSSBox) = - if box == nil: - return - if box of CSSBlockBox: - parent.icontext.fromx = parent.x - parent.icontext.whitespace = true - parent.icontext.ws_initial = true +proc addBlock(state: var LayoutState, parent: CSSBox, box: CSSBox) = + parent.icontext.fromx = parent.x + parent.icontext.whitespace = true + parent.icontext.ws_initial = true - box.flushLines() + box.flushLines() - let mbot = box.cssvalues[PROPERTY_MARGIN_BOTTOM].length.cells_h(state, parent.bcontext.width) - parent.bcontext.margin_todo += mbot + let mbot = box.cssvalues[PROPERTY_MARGIN_BOTTOM].length.cells_h(state, parent.bcontext.width) + parent.bcontext.margin_todo += mbot - parent.bcontext.margin_done = box.bcontext.margin_done - parent.bcontext.margin_todo = max(parent.bcontext.margin_todo - box.bcontext.margin_done, 0) + parent.bcontext.margin_done = box.bcontext.margin_done + parent.bcontext.margin_todo = max(parent.bcontext.margin_todo - box.bcontext.margin_done, 0) - if box.bcontext.height.isnone: - parent.icontext.fromy = box.icontext.fromy - else: - parent.icontext.fromy += box.bcontext.height.get - #eprint "END", CSSBlockBox(box).tag, box.icontext.fromy - elif box of CSSInlineBox: - parent.icontext.fromx += box.cssvalues[PROPERTY_MARGIN_RIGHT].length.cells_w(state, parent.bcontext.width) - parent.icontext.fromy = box.icontext.fromy - elif box of CSSInlineBlockBox: - parent.icontext.fromx += box.cssvalues[PROPERTY_MARGIN_RIGHT].length.cells_w(state, parent.bcontext.width) + if box.bcontext.height.isnone: parent.icontext.fromy = box.icontext.fromy + else: + parent.icontext.fromy += box.bcontext.height.get + + parent.children.add(box) - parent.height += box.height +proc addInline(state: var LayoutState, parent: CSSBox, box: CSSBox) = + parent.icontext.fromx += box.cssvalues[PROPERTY_MARGIN_RIGHT].length.cells_w(state, parent.bcontext.width) + parent.icontext.fromy = box.icontext.fromy parent.children.add(box) +proc addInlineBlock(state: var LayoutState, parent: CSSBox, box: CSSBox) = + parent.icontext.fromx = box.icontext.fromx + + parent.icontext.fromx += box.cssvalues[PROPERTY_MARGIN_RIGHT].length.cells_w(state, parent.bcontext.width) + + let mbot = box.cssvalues[PROPERTY_MARGIN_BOTTOM].length.cells_h(state, parent.bcontext.width) + parent.bcontext.margin_todo += mbot + + parent.bcontext.margin_done = box.bcontext.margin_done + parent.bcontext.margin_todo = max(parent.bcontext.margin_todo - box.bcontext.margin_done, 0) + + if box.bcontext.height.isnone: + parent.icontext.fromy = box.icontext.fromy + else: + parent.icontext.fromy += box.bcontext.height.get + + parent.children.add(box) + +proc add(state: var LayoutState, parent: CSSBox, box: CSSBox) = + if box == nil: + return + if box of CSSBlockBox: + state.addBlock(parent, box) + elif box of CSSInlineBox: + state.addInline(parent, box) + elif box of CSSInlineBlockBox: + state.addInlineBlock(parent, box) + proc processComputedValueBox(state: var LayoutState, parent: CSSBox, values: CSSComputedValues): CSSBox = case values[PROPERTY_DISPLAY].display of DISPLAY_BLOCK: @@ -355,12 +375,6 @@ proc processComputedValueBox(state: var LayoutState, parent: CSSBox, values: CSS result = state.newInlineBox(parent, values) of DISPLAY_LIST_ITEM: result = state.newBlockBox(parent, values) - of DISPLAY_TABLE: - result = state.newBlockBox(parent, values) - of DISPLAY_TABLE_ROW: - result = state.newBlockBox(parent, values) - of DISPLAY_TABLE_CELL: - result = state.newInlineBox(parent, values) of DISPLAY_NONE: return nil else: @@ -403,8 +417,7 @@ proc processNode(state: var LayoutState, parent: CSSBox, node: Node): CSSBox = proc processBeforePseudoElem(state: var LayoutState, parent: CSSBox, elem: Element) = if elem.cssvalues_before != nil: - var box: CSSBox - box = state.processComputedValueBox(parent, elem.cssvalues_before) + let box = state.processComputedValueBox(parent, elem.cssvalues_before) if box != nil: box.node = elem @@ -412,7 +425,7 @@ proc processBeforePseudoElem(state: var LayoutState, parent: CSSBox, elem: Eleme var inline = state.processInlineBox(box, $text) if inline != nil: inline.node = elem - state.add(box, inline) + state.addInline(box, inline) state.add(parent, box) @@ -426,7 +439,7 @@ proc processAfterPseudoElem(state: var LayoutState, parent: CSSBox, elem: Elemen var inline = state.processInlineBox(box, $text) if inline != nil: inline.node = elem - state.add(box, inline) + state.addInline(box, inline) state.add(parent, box) @@ -440,7 +453,7 @@ proc processMarker(state: var LayoutState, parent: CSSBox, elem: Element) = let tlen = text.width() parent.icontext.fromx -= tlen let marker = state.processInlineBox(parent, text) - state.add(parent, marker) + state.addInline(parent, marker) proc processNodes(state: var LayoutState, parent: CSSBox, nodes: seq[Node]) = for node in nodes: |