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.nim220
1 files changed, 187 insertions, 33 deletions
diff --git a/src/css/values.nim b/src/css/values.nim
index 54324538..b3a5d0d4 100644
--- a/src/css/values.nim
+++ b/src/css/values.nim
@@ -1,5 +1,7 @@
 import unicode
 import tables
+import sugar
+import sequtils
 
 import utils/twtstr
 import types/enums
@@ -12,7 +14,9 @@ type
     unit*: CSSUnit
     auto*: bool
 
-  CSSColor* = tuple[r: uint8, g: uint8, b: uint8, a: uint8]
+  CSSColor* = object
+    rgba: RGBAColor
+    termcolor: int
   
   CSSComputedValue* = ref object of RootObj
     t*: CSSPropertyType
@@ -109,29 +113,174 @@ func cells*(l: CSSLength): int =
     return int(l.num)
   of UNIT_CH:
     return int(l.num)
+  of UNIT_REM:
+    return int(l.num)
   else:
     #TODO
     return int(l.num / 8)
 
+func r(c: CSSColor): int =
+  return c.rgba.r
+
+func g(c: CSSColor): int =
+  return c.rgba.g
+
+func b(c: CSSColor): int =
+  return c.rgba.b
+
+func a(c: CSSColor): int =
+  return c.rgba.a
+
 const colors = {
-  "maroon":  (0x80u8, 0x00u8, 0x00u8, 0x00u8),
-  "red":     (0xffu8, 0x00u8, 0x00u8, 0x00u8),
-  "orange":  (0xffu8, 0xa5u8, 0x00u8, 0x00u8),
-  "yellow":  (0xffu8, 0xffu8, 0x00u8, 0x00u8),
-  "olive":   (0x80u8, 0x80u8, 0x00u8, 0x00u8),
-  "purple":  (0x80u8, 0x00u8, 0x80u8, 0x00u8),
-  "fuchsia": (0xffu8, 0x00u8, 0x00u8, 0x00u8),
-  "white":   (0xffu8, 0xffu8, 0xffu8, 0x00u8),
-  "lime":    (0x00u8, 0xffu8, 0x00u8, 0x00u8),
-  "green":   (0x00u8, 0x80u8, 0x00u8, 0x00u8),
-  "navy":    (0x00u8, 0x00u8, 0x80u8, 0x00u8),
-  "blue":    (0x00u8, 0x00u8, 0xffu8, 0x00u8),
-  "aqua":    (0x00u8, 0xffu8, 0xffu8, 0x00u8),
-  "teal":    (0x00u8, 0x80u8, 0x80u8, 0x00u8),
-  "black":   (0x00u8, 0x00u8, 0x00u8, 0x00u8),
-  "silver":  (0xc0u8, 0xc0u8, 0xc0u8, 0x00u8),
-  "gray":    (0x80u8, 0x80u8, 0x80u8, 0x00u8),
-}.toTable()
+  "aliceblue": 0xf0f8ff,
+  "antiquewhite": 0xfaebd7,
+  "aqua": 0x00ffff,
+  "aquamarine": 0x7fffd4,
+  "azure": 0xf0ffff,
+  "beige": 0xf5f5dc,
+  "bisque": 0xffe4c4,
+  "black": 0x000000,
+  "blanchedalmond": 0xffebcd,
+  "blue": 0x0000ff,
+  "blueviolet": 0x8a2be2,
+  "brown": 0xa52a2a,
+  "burlywood": 0xdeb887,
+  "cadetblue": 0x5f9ea0,
+  "chartreuse": 0x7fff00,
+  "chocolate": 0xd2691e,
+  "coral": 0xff7f50,
+  "cornflowerblue": 0x6495ed,
+  "cornsilk": 0xfff8dc,
+  "crimson": 0xdc143c,
+  "cyan": 0x00ffff,
+  "darkblue": 0x00008b,
+  "darkcyan": 0x008b8b,
+  "darkgoldenrod": 0xb8860b,
+  "darkgray": 0xa9a9a9,
+  "darkgreen": 0x006400,
+  "darkgrey": 0xa9a9a9,
+  "darkkhaki": 0xbdb76b,
+  "darkmagenta": 0x8b008b,
+  "darkolivegreen": 0x556b2f,
+  "darkorange": 0xff8c00,
+  "darkorchid": 0x9932cc,
+  "darkred": 0x8b0000,
+  "darksalmon": 0xe9967a,
+  "darkseagreen": 0x8fbc8f,
+  "darkslateblue": 0x483d8b,
+  "darkslategray": 0x2f4f4f,
+  "darkslategrey": 0x2f4f4f,
+  "darkturquoise": 0x00ced1,
+  "darkviolet": 0x9400d3,
+  "deeppink": 0xff1493,
+  "deepskyblue": 0x00bfff,
+  "dimgray": 0x696969,
+  "dimgrey": 0x696969,
+  "dodgerblue": 0x1e90ff,
+  "firebrick": 0xb22222,
+  "floralwhite": 0xfffaf0,
+  "forestgreen": 0x228b22,
+  "fuchsia": 0xff00ff,
+  "gainsboro": 0xdcdcdc,
+  "ghostwhite": 0xf8f8ff,
+  "gold": 0xffd700,
+  "goldenrod": 0xdaa520,
+  "gray": 0x808080,
+  "green": 0x008000,
+  "greenyellow": 0xadff2f,
+  "grey": 0x808080,
+  "honeydew": 0xf0fff0,
+  "hotpink": 0xff69b4,
+  "indianred": 0xcd5c5c,
+  "indigo": 0x4b0082,
+  "ivory": 0xfffff0,
+  "khaki": 0xf0e68c,
+  "lavender": 0xe6e6fa,
+  "lavenderblush": 0xfff0f5,
+  "lawngreen": 0x7cfc00,
+  "lemonchiffon": 0xfffacd,
+  "lightblue": 0xadd8e6,
+  "lightcoral": 0xf08080,
+  "lightcyan": 0xe0ffff,
+  "lightgoldenrodyellow": 0xfafad2,
+  "lightgray": 0xd3d3d3,
+  "lightgreen": 0x90ee90,
+  "lightgrey": 0xd3d3d3,
+  "lightpink": 0xffb6c1,
+  "lightsalmon": 0xffa07a,
+  "lightseagreen": 0x20b2aa,
+  "lightskyblue": 0x87cefa,
+  "lightslategray": 0x778899,
+  "lightslategrey": 0x778899,
+  "lightsteelblue": 0xb0c4de,
+  "lightyellow": 0xffffe0,
+  "lime": 0x00ff00,
+  "limegreen": 0x32cd32,
+  "linen": 0xfaf0e6,
+  "magenta": 0xff00ff,
+  "maroon": 0x800000,
+  "mediumaquamarine": 0x66cdaa,
+  "mediumblue": 0x0000cd,
+  "mediumorchid": 0xba55d3,
+  "mediumpurple": 0x9370db,
+  "mediumseagreen": 0x3cb371,
+  "mediumslateblue": 0x7b68ee,
+  "mediumspringgreen": 0x00fa9a,
+  "mediumturquoise": 0x48d1cc,
+  "mediumvioletred": 0xc71585,
+  "midnightblue": 0x191970,
+  "mintcream": 0xf5fffa,
+  "mistyrose": 0xffe4e1,
+  "moccasin": 0xffe4b5,
+  "navajowhite": 0xffdead,
+  "navy": 0x000080,
+  "oldlace": 0xfdf5e6,
+  "olive": 0x808000,
+  "olivedrab": 0x6b8e23,
+  "orange": 0xffa500,
+  "orangered": 0xff4500,
+  "orchid": 0xda70d6,
+  "palegoldenrod": 0xeee8aa,
+  "palegreen": 0x98fb98,
+  "paleturquoise": 0xafeeee,
+  "palevioletred": 0xdb7093,
+  "papayawhip": 0xffefd5,
+  "peachpuff": 0xffdab9,
+  "peru": 0xcd853f,
+  "pink": 0xffc0cb,
+  "plum": 0xdda0dd,
+  "powderblue": 0xb0e0e6,
+  "purple": 0x800080,
+  "red": 0xff0000,
+  "rosybrown": 0xbc8f8f,
+  "royalblue": 0x4169e1,
+  "saddlebrown": 0x8b4513,
+  "salmon": 0xfa8072,
+  "sandybrown": 0xf4a460,
+  "seagreen": 0x2e8b57,
+  "seashell": 0xfff5ee,
+  "sienna": 0xa0522d,
+  "silver": 0xc0c0c0,
+  "skyblue": 0x87ceeb,
+  "slateblue": 0x6a5acd,
+  "slategray": 0x708090,
+  "slategrey": 0x708090,
+  "snow": 0xfffafa,
+  "springgreen": 0x00ff7f,
+  "steelblue": 0x4682b4,
+  "tan": 0xd2b48c,
+  "teal": 0x008080,
+  "thistle": 0xd8bfd8,
+  "tomato": 0xff6347,
+  "turquoise": 0x40e0d0,
+  "violet": 0xee82ee,
+  "wheat": 0xf5deb3,
+  "white": 0xffffff,
+  "whitesmoke": 0xf5f5f5,
+  "yellow": 0xffff00,
+  "yellowgreen": 0x9acd32,
+  "rebeccapurple": 0x663399,
+}.map((a) => (a[0], CSSColor(rgba: RGBAColor(a[1])))).toTable()
 
 func cssLength(val: float64, unit: string): CSSLength =
   case unit
@@ -152,6 +301,12 @@ func cssLength(val: float64, unit: string): CSSLength =
   of "vmax": return CSSLength(num: val, unit: UNIT_VMAX)
   else: raise newException(CSSValueError, "Invalid unit")
 
+func color(r, g, b: int): CSSColor =
+  return CSSColor(rgba: rgba(r, g, b, 256))
+
+func color(r, g, b, a: int): CSSColor =
+  return CSSColor(rgba: rgba(r, g, b, a))
+
 func cssColor*(d: CSSDeclaration): CSSColor =
   if d.value.len > 0:
     if d.value[0] of CSSToken:
@@ -163,19 +318,18 @@ func cssColor*(d: CSSDeclaration): CSSColor =
           for r in s:
             if hexValue(r) == -1:
               raise newException(CSSValueError, "Invalid color")
-          let r = hexValue(s[0]) * 0x10 + hexValue(s[0])
-          let g = hexValue(s[1]) * 0x10 + hexValue(s[1])
-          let b = hexValue(s[2]) * 0x10 + hexValue(s[2])
-
-          return (uint8(r), uint8(g), uint8(b), 0x00u8)
+          let c = (hexValue(s[0]) shl 20) or (hexValue(s[0]) shl 16) or
+                  (hexValue(s[1]) shl 12) or (hexValue(s[1]) shl 8) or
+                  (hexValue(s[2]) shl 4) or hexValue(s[2])
+          return CSSColor(rgba: RGBAColor(c))
         elif s.len == 6:
           for r in s:
             if hexValue(r) == -1:
               raise newException(CSSValueError, "Invalid color")
-          let r = hexValue(s[0]) * 0x10 + hexValue(s[1])
-          let g = hexValue(s[2]) * 0x10 + hexValue(s[3])
-          let b = hexValue(s[4]) * 0x10 + hexValue(s[5])
-          return (uint8(r), uint8(g), uint8(b), 0x00u8)
+          let c = (hexValue(s[0]) shl 20) or (hexValue(s[1]) shl 16) or
+                  (hexValue(s[2]) shl 12) or (hexValue(s[3]) shl 8) or
+                  (hexValue(s[4]) shl 4) or hexValue(s[5])
+          return CSSColor(rgba: RGBAColor(c))
         else:
           raise newException(CSSValueError, "Invalid color")
       of CSS_IDENT_TOKEN:
@@ -199,7 +353,7 @@ func cssColor*(d: CSSDeclaration): CSSColor =
         let r = CSSToken(f.value[0]).nvalue
         let g = CSSToken(f.value[1]).nvalue
         let b = CSSToken(f.value[2]).nvalue
-        return (uint8(r), uint8(g), uint8(b), 0x00u8)
+        return color(int(r), int(g), int(b))
       of "rgba":
         if f.value.len != 4:
           raise newException(CSSValueError, "Invalid color")
@@ -210,7 +364,7 @@ func cssColor*(d: CSSDeclaration): CSSColor =
         let g = CSSToken(f.value[1]).nvalue
         let b = CSSToken(f.value[2]).nvalue
         let a = CSSToken(f.value[3]).nvalue
-        return (uint8(r), uint8(g), uint8(b), uint8(a))
+        return color(int(r), int(g), int(b), int(a))
       else: discard
 
   raise newException(CSSValueError, "Invalid color")
@@ -218,7 +372,7 @@ func cssColor*(d: CSSDeclaration): CSSColor =
 func cellColor*(color: CSSColor): CellColor =
   #TODO better would be to store color names and return term colors on demand
   #option)
-  return CellColor(rgb: true, rgbcolor: (r: color.r, g: color.g, b: color.b))
+  return CellColor(rgb: true, rgbcolor: RGBColor(color.rgba))
 
 func cssLength(d: CSSDeclaration): CSSLength =
   if d.value.len > 0 and d.value[0] of CSSToken:
@@ -383,9 +537,9 @@ func getSpecifiedValue*(d: CSSDeclaration): CSSSpecifiedValue =
 func getInitialColor*(t: CSSPropertyType): CSSColor =
   case t
   of PROPERTY_COLOR:
-    return (0xffu8, 0xffu8, 0xffu8, 0x00u8)
+    return colors["white"]
   else:
-    return (0u8, 0u8, 0u8, 255u8)
+    return colors["black"]
 
 func calcDefault(t: CSSPropertyType): CSSComputedValue =
   let v = valueType(t)