about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2021-12-10 17:39:21 +0100
committerbptato <nincsnevem662@gmail.com>2021-12-10 17:39:21 +0100
commite46f0a4cb9b6a843e900dbb3abd5ce9684f47016 (patch)
tree7d4c893343a1b26a9996ad999dbd89e091efa3a3
parent91dee7d0d7cfe0f7faa2bf4b364e1db87ec6b70f (diff)
downloadchawan-e46f0a4cb9b6a843e900dbb3abd5ce9684f47016.tar.gz
Support more colors, config.nim refactoring
-rw-r--r--src/config/config.nim21
-rw-r--r--src/css/parser.nim1
-rw-r--r--src/css/values.nim220
-rw-r--r--src/io/cell.nim16
-rw-r--r--src/types/color.nim37
-rw-r--r--src/utils/twtstr.nim6
6 files changed, 238 insertions, 63 deletions
diff --git a/src/config/config.nim b/src/config/config.nim
index 98d08442..3602476b 100644
--- a/src/config/config.nim
+++ b/src/config/config.nim
@@ -5,7 +5,6 @@ import streams
 
 import config/toml
 import utils/twtstr
-import utils/radixtree
 
 type
   TwtAction* =
@@ -124,18 +123,17 @@ proc readUserStylesheet(dir: string, file: string): string =
       result = f.readAll()
       f.close()
 
-func parseConfig(t: TomlValue): Config =
+proc parseConfig(config: var Config, dir: string, t: TomlValue) =
   if "page" in t:
     for k, v in t["page"].pairs:
-      result.nmap[getRealKey(k)] = getAction(v.s)
+      config.nmap[getRealKey(k)] = getAction(v.s)
     for k, v in t["line"].pairs:
-      result.nmap[getRealKey(k)] = getLineAction(v.s)
+      config.lemap[getRealKey(k)] = getLineAction(v.s)
   if "stylesheet" in t:
-    result.stylesheet = t["stylesheet"].s
+    config.stylesheet = readUserStylesheet(dir, t["stylesheet"].s)
 
 proc staticReadConfig(): Config =
-  result = parseConfig(parseToml(newStringStream(staticRead"res/config.toml")))
-  result.stylesheet = readUserStylesheet("res", result.stylesheet)
+  result.parseConfig("res", parseToml(newStringStream(staticRead"res/config.toml")))
 
 const defaultConfig = staticReadConfig()
 var gconfig* = defaultConfig
@@ -143,14 +141,7 @@ var gconfig* = defaultConfig
 proc readConfig(dir: string) =
   let fs = newFileStream(dir / "config.toml")
   if fs != nil:
-    let t = parseToml(fs)
-    if "page" in t:
-      for k, v in t["page"].pairs:
-        gconfig.nmap[getRealKey(k)] = getAction(v.s)
-      for k, v in t["line"].pairs:
-        gconfig.lemap[getRealKey(k)] = getLineAction(v.s)
-    if "stylesheet" in t:
-      gconfig.stylesheet = readUserStylesheet(dir, t["stylesheet"].s)
+    gconfig.parseConfig(dir, parseToml(fs))
 
 proc getNormalAction*(s: string): TwtAction =
   if gconfig.nmap.hasKey(s):
diff --git a/src/css/parser.nim b/src/css/parser.nim
index 0c1f91cc..0cfda3ed 100644
--- a/src/css/parser.nim
+++ b/src/css/parser.nim
@@ -1,6 +1,5 @@
 import unicode
 import streams
-import math
 import options
 import sugar
 
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)
diff --git a/src/io/cell.nim b/src/io/cell.nim
index 9587e5dd..0b991a0a 100644
--- a/src/io/cell.nim
+++ b/src/io/cell.nim
@@ -194,12 +194,12 @@ proc parseAnsiCode*(formatting: var Formatting, buf: string, fi: int): int =
               if ip[pi] == 2:
                 inc pi
                 if pi + 2 < ip.len:
-                  let r = uint8(ip[pi])
+                  let r = ip[pi]
                   inc pi
-                  let g = uint8(ip[pi])
+                  let g = ip[pi]
                   inc pi
-                  let b = uint8(ip[pi])
-                  formatting.fgcolor = CellColor(rgb: true, rgbcolor: (r: r, g: g, b: b))
+                  let b = ip[pi]
+                  formatting.fgcolor = CellColor(rgb: true, rgbcolor: rgb(r, g, b))
               else:
                 #TODO
                 inc pi
@@ -216,12 +216,12 @@ proc parseAnsiCode*(formatting: var Formatting, buf: string, fi: int): int =
               if ip[pi] == 2:
                 inc pi
                 if pi + 2 < ip.len:
-                  let r = uint8(ip[pi])
+                  let r = ip[pi]
                   inc pi
-                  let g = uint8(ip[pi])
+                  let g = ip[pi]
                   inc pi
-                  let b = uint8(ip[pi])
-                  formatting.bgcolor = CellColor(rgb: true, rgbcolor: (r: r, g: g, b: b))
+                  let b = ip[pi]
+                  formatting.bgcolor = CellColor(rgb: true, rgbcolor: rgb(r, g, b))
               else:
                 #TODO
                 inc pi
diff --git a/src/types/color.nim b/src/types/color.nim
index 45a3f31d..ca04a0e7 100644
--- a/src/types/color.nim
+++ b/src/types/color.nim
@@ -1,5 +1,7 @@
 type
-  RGBColor* = tuple[r: uint8, g: uint8, b: uint8]
+  RGBColor* = distinct int
+
+  RGBAColor* = distinct int
 
   CellColor* = object
     case rgb*: bool
@@ -12,7 +14,38 @@ func `==`*(color1: CellColor, color2: CellColor): bool =
   if color1.rgb != color2.rgb:
     return false
   if color1.rgb:
-    return color1.rgbcolor == color2.rgbcolor
+    return int(color1.rgbcolor) == int(color2.rgbcolor)
   return color1.color == color2.color
 
 const defaultColor* = CellColor(rgb: false, color: 0)
+
+func r*(c: RGBAColor): int =
+  return int(c) shr 16 and 0xff
+
+func g*(c: RGBAColor): int =
+  return int(c) shr 8 and 0xff
+
+func b*(c: RGBAColor): int =
+  return int(c) and 0xff
+
+func a*(c: RGBAColor): int =
+  return int(c) shr 24 and 0xff
+
+func rgb*(r, g, b: int): RGBColor =
+  return RGBColor((r shl 16) or (g shl 8) or b)
+
+
+func r*(c: RGBColor): int =
+  return int(c) shr 16 and 0xff
+
+func g*(c: RGBColor): int =
+  return int(c) shr 8 and 0xff
+
+func b*(c: RGBColor): int =
+  return int(c) and 0xff
+
+func rgba*(r, g, b, a: int): RGBAColor =
+  return RGBAColor((a shl 24) or (r shl 16) or (g shl 8) or b)
+
+converter toRGBColor*(i: RGBAColor): RGBColor =
+  return RGBColor(int(i) and 0xFFFFFF)
diff --git a/src/utils/twtstr.nim b/src/utils/twtstr.nim
index d437be6a..5bd25247 100644
--- a/src/utils/twtstr.nim
+++ b/src/utils/twtstr.nim
@@ -3,7 +3,6 @@ import strutils
 import unicode
 import tables
 import json
-import bitops
 import os
 import math
 
@@ -69,7 +68,7 @@ func genControlCharMap*(): string =
     if c == '?':
       result &= char(127)
     else:
-      result &= char(bitand(int(c), 0x1f))
+      result &= char((int(c) and 0x1f))
 
 const controlCharMap = genControlCharMap()
 
@@ -81,7 +80,7 @@ func genControlLetterMap*(): string =
     if c == char(127):
       result &= '?'
     else:
-      result &= char(bitor(int(c), 0x40))
+      result &= char((int(c) or 0x40))
 
 const controlLetterMap = genControlLetterMap()
 
@@ -193,7 +192,6 @@ func skipBlanks*(buf: string, at: int): int =
 func parseInt64*(s: string): int64 =
   var sign = 1
   var t = 1
-  var d = 0
   var integer: int64 = 0
   var e: int64 = 0