about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2021-12-13 13:51:21 +0100
committerbptato <nincsnevem662@gmail.com>2021-12-13 13:51:21 +0100
commit332dedce2ba760d942fea337a285456427828fe4 (patch)
tree3ee78810aa4fa1b3ec01c770b0f5a9070fca5ab1 /src
parente1194507b4f6240cb15c1783240f8a21d359bc16 (diff)
downloadchawan-332dedce2ba760d942fea337a285456427828fe4.tar.gz
Support width property
Diffstat (limited to 'src')
-rw-r--r--src/css/values.nim13
-rw-r--r--src/io/buffer.nim2
-rw-r--r--src/layout/engine.nim9
-rw-r--r--src/types/enums.nim2
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,