about summary refs log tree commit diff stats
path: root/src/css/values.nim
diff options
context:
space:
mode:
Diffstat (limited to 'src/css/values.nim')
-rw-r--r--src/css/values.nim42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/css/values.nim b/src/css/values.nim
index 7d5d5bc5..b55869f7 100644
--- a/src/css/values.nim
+++ b/src/css/values.nim
@@ -39,6 +39,8 @@ type
       textdecoration*: CSSTextDecoration
     of VALUE_WORD_BREAK:
       wordbreak*: CSSWordBreak
+    of VALUE_LIST_STYLE_TYPE:
+      liststyletype*: CSSListStyleType
     of VALUE_NONE: discard
 
   CSSComputedValues* = ref array[low(CSSPropertyType)..high(CSSPropertyType), CSSComputedValue]
@@ -66,6 +68,7 @@ const PropertyNames = {
   "word-break": PROPERTY_WORD_BREAK,
   "width": PROPERTY_WIDTH,
   "height": PROPERTY_HEIGHT,
+  "list-style-type": PROPERTY_LIST_STYLE_TYPE,
 }.toTable()
 
 const ValueTypes = [
@@ -86,11 +89,13 @@ const ValueTypes = [
   PROPERTY_WORD_BREAK: VALUE_WORD_BREAK,
   PROPERTY_WIDTH: VALUE_LENGTH,
   PROPERTY_HEIGHT: VALUE_LENGTH,
+  PROPERTY_LIST_STYLE_TYPE: VALUE_LIST_STYLE_TYPE,
 ]
 
 const InheritedProperties = {
   PROPERTY_COLOR, PROPERTY_FONT_STYLE, PROPERTY_WHITE_SPACE,
-  PROPERTY_FONT_WEIGHT, PROPERTY_TEXT_DECORATION, PROPERTY_WORD_BREAK
+  PROPERTY_FONT_WEIGHT, PROPERTY_TEXT_DECORATION, PROPERTY_WORD_BREAK,
+  PROPERTY_LIST_STYLE_TYPE
 }
 
 func getPropInheritedArray(): array[low(CSSPropertyType)..high(CSSPropertyType), bool] =
@@ -123,6 +128,15 @@ func cells*(l: CSSLength): int =
     #TODO
     return int(l.num / 8)
 
+func listMarker*(t: CSSListStyleType, i: int): string =
+  case t
+  of LIST_STYLE_TYPE_NONE: return ""
+  of LIST_STYLE_TYPE_DISC: return "* "
+  of LIST_STYLE_TYPE_CIRCLE: return "o "
+  of LIST_STYLE_TYPE_SQUARE: return "O "
+  of LIST_STYLE_TYPE_DECIMAL: return $i & ". "
+  of LIST_STYLE_TYPE_JAPANESE_INFORMAL: return japaneseNumber(i) & "、"
+
 func r(c: CSSColor): int =
   return c.rgba.r
 
@@ -436,8 +450,8 @@ func cssDisplay(d: CSSDeclaration): CSSDisplay =
       case $tok.value
       of "block": return DISPLAY_BLOCK
       of "inline": return DISPLAY_INLINE
+      of "list-item": return DISPLAY_LIST_ITEM
       # of "inline-block": return DISPLAY_INLINE_BLOCK
-      # of "list-item": return DISPLAY_LIST_ITEM
       # of "table": return DISPLAY_TABLE
       # of "table-row-group": return DISPLAY_TABLE_ROW_GROUP
       # of "table-header-group": return DISPLAY_TABLE_HEADER_GROUP
@@ -511,6 +525,19 @@ func cssWordBreak(d: CSSDeclaration): CSSWordBreak =
       of "keep-all": return WORD_BREAK_KEEP_ALL
   raise newException(CSSValueError, "Invalid text decoration")
 
+func cssListStyleType(d: CSSDeclaration): CSSListStyleType =
+  if isToken(d):
+    let tok = getToken(d)
+    if tok.tokenType == CSS_IDENT_TOKEN:
+      case $tok.value
+      of "none": return LIST_STYLE_TYPE_NONE
+      of "disc": return LIST_STYLE_TYPE_DISC
+      of "circle": return LIST_STYLE_TYPE_CIRCLE
+      of "square": return LIST_STYLE_TYPE_SQUARE
+      of "decimal": return LIST_STYLE_TYPE_DECIMAL
+      of "japanese-informal": return LIST_STYLE_TYPE_JAPANESE_INFORMAL
+  raise newException(CSSValueError, "Invalid list style")
+
 func getSpecifiedValue*(d: CSSDeclaration): CSSSpecifiedValue =
   let name = $d.name
   let ptype = propertyType(name)
@@ -529,6 +556,7 @@ func getSpecifiedValue*(d: CSSDeclaration): CSSSpecifiedValue =
         result.integer = cssFontWeight(d)
     of VALUE_TEXT_DECORATION: result.textdecoration = cssTextDecoration(d)
     of VALUE_WORD_BREAK: result.wordbreak = cssWordBreak(d)
+    of VALUE_LIST_STYLE_TYPE: result.liststyletype = cssListStyleType(d)
     of VALUE_NONE: discard
   except CSSValueError:
     result.globalValue = VALUE_UNSET
@@ -611,6 +639,8 @@ func getComputedValue*(prop: CSSSpecifiedValue, current: CSSComputedValues): CSS
     return CSSComputedValue(t: prop.t, v: VALUE_TEXT_DECORATION, textdecoration: prop.textdecoration)
   of VALUE_WORD_BREAK:
     return CSSComputedValue(t: prop.t, v: VALUE_WORD_BREAK, wordbreak: prop.wordbreak)
+  of VALUE_LIST_STYLE_TYPE:
+    return CSSComputedValue(t: prop.t, v: VALUE_LIST_STYLE_TYPE, liststyletype: prop.liststyletype)
   of VALUE_NONE: return CSSComputedValue(t: prop.t, v: VALUE_NONE)
 
 func getComputedValue*(d: CSSDeclaration, current: CSSComputedValues): CSSComputedValue =
@@ -629,3 +659,11 @@ proc inheritProperties*(vals: var CSSComputedValues, parent: CSSComputedValues)
       vals[prop] = getDefault(prop)
     if inherited(prop) and parent[prop] != nil and vals[prop] == getDefault(prop):
       vals[prop] = parent[prop]
+
+func inheritProperties*(parent: CSSComputedValues): CSSComputedValues =
+  new(result)
+  for prop in low(CSSPropertyType)..high(CSSPropertyType):
+    if inherited(prop) and parent[prop] != nil:
+      result[prop] = parent[prop]
+    else:
+      result[prop] = getDefault(prop)