diff options
author | bptato <nincsnevem662@gmail.com> | 2021-12-13 13:51:21 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2021-12-13 13:51:21 +0100 |
commit | 332dedce2ba760d942fea337a285456427828fe4 (patch) | |
tree | 3ee78810aa4fa1b3ec01c770b0f5a9070fca5ab1 /src | |
parent | e1194507b4f6240cb15c1783240f8a21d359bc16 (diff) | |
download | chawan-332dedce2ba760d942fea337a285456427828fe4.tar.gz |
Support width property
Diffstat (limited to 'src')
-rw-r--r-- | src/css/values.nim | 13 | ||||
-rw-r--r-- | src/io/buffer.nim | 2 | ||||
-rw-r--r-- | src/layout/engine.nim | 9 | ||||
-rw-r--r-- | src/types/enums.nim | 2 |
4 files changed, 21 insertions, 5 deletions
diff --git a/src/css/values.nim b/src/css/values.nim index e68d7d15..ea169bbb 100644 --- a/src/css/values.nim +++ b/src/css/values.nim @@ -64,6 +64,7 @@ const PropertyNames = { "font-weight": PROPERTY_FONT_WEIGHT, "text-decoration": PROPERTY_TEXT_DECORATION, "word-break": PROPERTY_WORD_BREAK, + "width": PROPERTY_WIDTH, }.toTable() const ValueTypes = [ @@ -82,6 +83,7 @@ const ValueTypes = [ PROPERTY_FONT_WEIGHT: VALUE_INTEGER, PROPERTY_TEXT_DECORATION: VALUE_TEXT_DECORATION, PROPERTY_WORD_BREAK: VALUE_WORD_BREAK, + PROPERTY_WIDTH: VALUE_LENGTH, ] const InheritedProperties = { @@ -534,13 +536,20 @@ func getSpecifiedValue*(d: CSSDeclaration): CSSSpecifiedValue = if result.globalValue == VALUE_NOGLOBAL: result.globalValue = cssGlobal(d) -func getInitialColor*(t: CSSPropertyType): CSSColor = +func getInitialColor(t: CSSPropertyType): CSSColor = case t of PROPERTY_COLOR: return colors["white"] else: return colors["black"] +func getInitialLength(t: CSSPropertyType): CSSLength = + case t + of PROPERTY_WIDTH: + return CSSLength(auto: true) + else: + return CSSLength() + func calcDefault(t: CSSPropertyType): CSSComputedValue = let v = valueType(t) var nv: CSSComputedValue @@ -551,6 +560,8 @@ func calcDefault(t: CSSPropertyType): CSSComputedValue = nv = CSSComputedValue(t: t, v: v, display: DISPLAY_INLINE) of VALUE_WORD_BREAK: nv = CSSComputedValue(t: t, v: v, wordbreak: WORD_BREAK_NORMAL) + of VALUE_LENGTH: + nv = CSSComputedValue(t: t, v: v, length: getInitialLength(t)) else: nv = CSSComputedValue(t: t, v: v) return nv diff --git a/src/io/buffer.nim b/src/io/buffer.nim index 1033e44c..a43223ef 100644 --- a/src/io/buffer.nim +++ b/src/io/buffer.nim @@ -273,7 +273,7 @@ proc refreshDisplay*(buffer: Buffer) = buffer.display[dls + k].formatting = cf.formatting buffer.display[dls + k].nodes = cf.nodes let tk = k + r.width() - while k < tk: + while k < tk and k < buffer.width - 1: buffer.display[dls + k].ow += r.width() inc k inc j diff --git a/src/layout/engine.nim b/src/layout/engine.nim index 277bc70d..9b139d77 100644 --- a/src/layout/engine.nim +++ b/src/layout/engine.nim @@ -42,7 +42,12 @@ func newBlockBox(state: var LayoutState, parent: CSSBox, vals: CSSComputedValues result.bcontext.margin_done = parent.bcontext.margin_done - result.width = parent.width + let pwidth = vals[PROPERTY_WIDTH] + if pwidth.length.auto: + result.width = parent.width + else: + result.width = pwidth.length.cells() + result.icontext = newInlineContext(parent) result.icontext.fromy = result.y result.cssvalues = vals @@ -215,7 +220,7 @@ proc processInlineBox(lstate: var LayoutState, parent: CSSBox, str: string): CSS rw = r.width() #TODO a better line wrapping algorithm would be nice - if rw > 1 and state.ibox.cssvalues[PROPERTY_WORD_BREAK].wordbreak != WORD_BREAK_KEEP_ALL: + if rw > 1 or state.ibox.cssvalues[PROPERTY_WORD_BREAK].wordbreak == WORD_BREAK_BREAK_ALL: state.addWord() state.checkWrap(r) diff --git a/src/types/enums.nim b/src/types/enums.nim index 2dea39a1..9aacfc21 100644 --- a/src/types/enums.nim +++ b/src/types/enums.nim @@ -60,7 +60,7 @@ type PROPERTY_MARGIN_TOP, PROPERTY_MARGIN_LEFT, PROPERTY_MARGIN_RIGHT, PROPERTY_MARGIN_BOTTOM, PROPERTY_FONT_STYLE, PROPERTY_DISPLAY, PROPERTY_CONTENT, PROPERTY_WHITE_SPACE, PROPERTY_FONT_WEIGHT, - PROPERTY_TEXT_DECORATION, PROPERTY_WORD_BREAK + PROPERTY_TEXT_DECORATION, PROPERTY_WORD_BREAK, PROPERTY_WIDTH CSSValueType* = enum VALUE_NONE, VALUE_LENGTH, VALUE_COLOR, VALUE_CONTENT, VALUE_DISPLAY, |