diff options
author | bptato <nincsnevem662@gmail.com> | 2021-12-10 17:39:21 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2021-12-10 17:39:21 +0100 |
commit | e46f0a4cb9b6a843e900dbb3abd5ce9684f47016 (patch) | |
tree | 7d4c893343a1b26a9996ad999dbd89e091efa3a3 | |
parent | 91dee7d0d7cfe0f7faa2bf4b364e1db87ec6b70f (diff) | |
download | chawan-e46f0a4cb9b6a843e900dbb3abd5ce9684f47016.tar.gz |
Support more colors, config.nim refactoring
-rw-r--r-- | src/config/config.nim | 21 | ||||
-rw-r--r-- | src/css/parser.nim | 1 | ||||
-rw-r--r-- | src/css/values.nim | 220 | ||||
-rw-r--r-- | src/io/cell.nim | 16 | ||||
-rw-r--r-- | src/types/color.nim | 37 | ||||
-rw-r--r-- | src/utils/twtstr.nim | 6 |
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 |