diff options
Diffstat (limited to 'src/css/values.nim')
-rw-r--r-- | src/css/values.nim | 220 |
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) |