diff options
Diffstat (limited to 'thcolor/builtin/_css.py')
-rwxr-xr-x | thcolor/builtin/_css.py | 423 |
1 files changed, 423 insertions, 0 deletions
diff --git a/thcolor/builtin/_css.py b/thcolor/builtin/_css.py new file mode 100755 index 0000000..12bb1aa --- /dev/null +++ b/thcolor/builtin/_css.py @@ -0,0 +1,423 @@ +#!/usr/bin/env python3 +#****************************************************************************** +# Copyright (C) 2019 Thomas "Cakeisalie5" Touhey <thomas@touhey.fr> +# This file is part of the thcolor project, which is MIT-licensed. +#****************************************************************************** +""" Named colors and function definitions. Color names are case-insensitive. + Taken from: https://www.w3schools.com/cssref/css_colors.asp """ + +from .._color import Color as _Color +from .._ref import Reference as _Reference +from .._exc import InvalidArgumentValueError as _InvalidArgumentValueError + +__all__ = ["CSS1Reference", "CSS2Reference", "CSS3Reference", + "CSS4Reference"] + +def _rgb(raw): + r = int(raw[1:3], 16) + g = int(raw[3:5], 16) + b = int(raw[5:7], 16) + + return _Color(_Color.Type.RGB, r, g, b) + +class CSS1Reference(_Reference): + """ Named colors from `CSS Level 1 <https://www.w3.org/TR/CSS1/>`_. """ + + number = _Reference.number + percentage = _Reference.percentage + color = _Reference.color + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # --- + # Named colors. + # --- + + __colors = { + 'black': _rgb('#000000'), + 'silver': _rgb('#c0c0c0'), + 'gray': _rgb('#808080'), + 'white': _rgb('#ffffff'), + + 'maroon': _rgb('#800000'), + 'red': _rgb('#ff0000'), + 'purple': _rgb('#800080'), + 'fuchsia': _rgb('#ff00ff'), + 'green': _rgb('#008000'), + 'lime': _rgb('#00ff00'), + 'olive': _rgb('#808000'), + 'yellow': _rgb('#ffff00'), + 'navy': _rgb('#000080'), + 'blue': _rgb('#0000ff'), + 'teal': _rgb('#008080'), + 'aqua': _rgb('#00ffff')} + + def _color(self, name): + if name == 'transparent': + return _Color(_Color.Type.RGB, 0, 0, 0, 0) + + try: + return self.__colors[name] + except: + return super()._color(name) + + # --- + # Utilities. + # --- + + def _rgb(self, rgba, rgb_indexes): + r, g, b, alpha = rgba + ri, gi, bi = rgb_indexes + + try: + r = r.to_byte() + except ValueError as e: + raise _InvalidArgumentValueError(ri, str(e)) + + try: + g = g.to_byte() + except ValueError as e: + raise _InvalidArgumentValueError(gi, str(e)) + + try: + b = b.to_byte() + except ValueError as e: + raise _InvalidArgumentValueError(bi, str(e)) + + try: + alpha = alpha.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(3, str(e)) + + return _Reference.color(_Color(_Color.Type.RGB, r, g, b, alpha)) + + # --- + # Functions. + # --- + + def rgb(self, r: number | percentage, + g: number | percentage = number(0), + b: number | percentage = number(0)): + return self._rgb((r, g, b, 1.0), (0, 1, 2)) + +class CSS2Reference(CSS1Reference): + """ Named colors from `CSS Level 2 (Revision 1) + <https://www.w3.org/TR/CSS2/>`_. """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # --- + # Named colors. + # --- + + __colors = { + 'orange': _rgb('#ffa500')} + + def _color(self, name): + try: + return self.__colors[name] + except: + return super()._color(name) + +class CSS3Reference(CSS2Reference): + """ Named colors and functions from `CSS Color Module Level 3 + <https://drafts.csswg.org/css-color-3/>`_. """ + + number = _Reference.number + percentage = _Reference.percentage + angle = _Reference.angle + color = _Reference.color + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # --- + # Named colors. + # --- + + __colors = { + 'darkblue': _rgb('#00008B'), + 'mediumblue': _rgb('#0000CD'), + 'darkgreen': _rgb('#006400'), + 'darkcyan': _rgb('#008B8B'), + 'deepskyblue': _rgb('#00BFFF'), + 'darkturquoise': _rgb('#00CED1'), + 'mediumspringgreen': _rgb('#00FA9A'), + 'springgreen': _rgb('#00FF7F'), + 'cyan': _rgb('#00FFFF'), + 'midnightblue': _rgb('#191970'), + 'dodgerblue': _rgb('#1E90FF'), + 'lightseagreen': _rgb('#20B2AA'), + 'forestgreen': _rgb('#228B22'), + 'seagreen': _rgb('#2E8B57'), + 'darkslategray': _rgb('#2F4F4F'), + 'darkslategrey': _rgb('#2F4F4F'), + 'limegreen': _rgb('#32CD32'), + 'mediumseagreen': _rgb('#3CB371'), + 'turquoise': _rgb('#40E0D0'), + 'royalblue': _rgb('#4169E1'), + 'steelblue': _rgb('#4682B4'), + 'darkslateblue': _rgb('#483D8B'), + 'mediumturquoise': _rgb('#48D1CC'), + 'indigo': _rgb('#4B0082'), + 'darkolivegreen': _rgb('#556B2F'), + 'cadetblue': _rgb('#5F9EA0'), + 'cornflowerblue': _rgb('#6495ED'), + 'mediumaquamarine': _rgb('#66CDAA'), + 'dimgray': _rgb('#696969'), + 'dimgrey': _rgb('#696969'), + 'slateblue': _rgb('#6A5ACD'), + 'olivedrab': _rgb('#6B8E23'), + 'slategray': _rgb('#708090'), + 'slategrey': _rgb('#708090'), + 'lightslategray': _rgb('#778899'), + 'lightslategrey': _rgb('#778899'), + 'mediumslateblue': _rgb('#7B68EE'), + 'lawngreen': _rgb('#7CFC00'), + 'chartreuse': _rgb('#7FFF00'), + 'aquamarine': _rgb('#7FFFD4'), + 'grey': _rgb('#808080'), + 'skyblue': _rgb('#87CEEB'), + 'lightskyblue': _rgb('#87CEFA'), + 'blueviolet': _rgb('#8A2BE2'), + 'darkred': _rgb('#8B0000'), + 'darkmagenta': _rgb('#8B008B'), + 'saddlebrown': _rgb('#8B4513'), + 'darkseagreen': _rgb('#8FBC8F'), + 'lightgreen': _rgb('#90EE90'), + 'mediumpurple': _rgb('#9370DB'), + 'darkviolet': _rgb('#9400D3'), + 'palegreen': _rgb('#98FB98'), + 'darkorchid': _rgb('#9932CC'), + 'yellowgreen': _rgb('#9ACD32'), + 'sienna': _rgb('#A0522D'), + 'brown': _rgb('#A52A2A'), + 'darkgray': _rgb('#A9A9A9'), + 'darkgrey': _rgb('#A9A9A9'), + 'lightblue': _rgb('#ADD8E6'), + 'greenyellow': _rgb('#ADFF2F'), + 'paleturquoise': _rgb('#AFEEEE'), + 'lightsteelblue': _rgb('#B0C4DE'), + 'powderblue': _rgb('#B0E0E6'), + 'firebrick': _rgb('#B22222'), + 'darkgoldenrod': _rgb('#B8860B'), + 'mediumorchid': _rgb('#BA55D3'), + 'rosybrown': _rgb('#BC8F8F'), + 'darkkhaki': _rgb('#BDB76B'), + 'mediumvioletred': _rgb('#C71585'), + 'indianred': _rgb('#CD5C5C'), + 'peru': _rgb('#CD853F'), + 'chocolate': _rgb('#D2691E'), + 'tan': _rgb('#D2B48C'), + 'lightgray': _rgb('#D3D3D3'), + 'lightgrey': _rgb('#D3D3D3'), + 'thistle': _rgb('#D8BFD8'), + 'orchid': _rgb('#DA70D6'), + 'goldenrod': _rgb('#DAA520'), + 'palevioletred': _rgb('#DB7093'), + 'crimson': _rgb('#DC143C'), + 'gainsboro': _rgb('#DCDCDC'), + 'plum': _rgb('#DDA0DD'), + 'burlywood': _rgb('#DEB887'), + 'lightcyan': _rgb('#E0FFFF'), + 'lavender': _rgb('#E6E6FA'), + 'darksalmon': _rgb('#E9967A'), + 'violet': _rgb('#EE82EE'), + 'palegoldenrod': _rgb('#EEE8AA'), + 'lightcoral': _rgb('#F08080'), + 'khaki': _rgb('#F0E68C'), + 'aliceblue': _rgb('#F0F8FF'), + 'honeydew': _rgb('#F0FFF0'), + 'azure': _rgb('#F0FFFF'), + 'sandybrown': _rgb('#F4A460'), + 'wheat': _rgb('#F5DEB3'), + 'beige': _rgb('#F5F5DC'), + 'whitesmoke': _rgb('#F5F5F5'), + 'mintcream': _rgb('#F5FFFA'), + 'ghostwhite': _rgb('#F8F8FF'), + 'salmon': _rgb('#FA8072'), + 'antiquewhite': _rgb('#FAEBD7'), + 'linen': _rgb('#FAF0E6'), + 'lightgoldenrodyellow': _rgb('#FAFAD2'), + 'oldlace': _rgb('#FDF5E6'), + 'magenta': _rgb('#FF00FF'), + 'deeppink': _rgb('#FF1493'), + 'orangered': _rgb('#FF4500'), + 'tomato': _rgb('#FF6347'), + 'hotpink': _rgb('#FF69B4'), + 'coral': _rgb('#FF7F50'), + 'darkorange': _rgb('#FF8C00'), + 'lightsalmon': _rgb('#FFA07A'), + 'lightpink': _rgb('#FFB6C1'), + 'pink': _rgb('#FFC0CB'), + 'gold': _rgb('#FFD700'), + 'peachpuff': _rgb('#FFDAB9'), + 'navajowhite': _rgb('#FFDEAD'), + 'moccasin': _rgb('#FFE4B5'), + 'bisque': _rgb('#FFE4C4'), + 'mistyrose': _rgb('#FFE4E1'), + 'blanchedalmond': _rgb('#FFEBCD'), + 'papayawhip': _rgb('#FFEFD5'), + 'lavenderblush': _rgb('#FFF0F5'), + 'seashell': _rgb('#FFF5EE'), + 'cornsilk': _rgb('#FFF8DC'), + 'lemonchiffon': _rgb('#FFFACD'), + 'floralwhite': _rgb('#FFFAF0'), + 'snow': _rgb('#FFFAFA'), + 'lightyellow': _rgb('#FFFFE0'), + 'ivory': _rgb('#FFFFF0')} + + def _color(self, name): + try: + return self.__colors[name] + except: + return super()._color(name) + + # --- + # Utilities. + # --- + + def _hsl(self, hsla, hsl_indexes): + h, s, l, alpha = hsla + hi, si, li = hsl_indexes + + try: + h = h.to_hue() + except ValueError as e: + raise _InvalidArgumentValueError(hi, str(e)) + + try: + s = s.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(si, str(e)) + + try: + l = l.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(li, str(e)) + + try: + alpha = alpha.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(3, str(e)) + + return _Reference.color(_Color(_Color.Type.HSL, h, s, l, alpha)) + + # --- + # Functions. + # --- + + def rgb(self, r: number | percentage, + g: number | percentage = number(0), b: number | percentage = number(0), + alpha: number | percentage = number(1.0)): + return self._rgb((r, g, b, alpha), (0, 1, 2)) + + def rgba(self, r: number | percentage, + g: number | percentage = number(0), b: number | percentage = number(0), + alpha: number | percentage = number(1.0)): + return self._rgb((r, g, b, alpha), (0, 1, 2)) + + def hsl(self, h: number | angle, s: number | percentage, + l: number | percentage, alpha: number | percentage = number(1.0)): + return self._hsl((h, s, l, alpha), (0, 1, 2)) + + def hsla(self, h: number | angle, s: number | percentage, + l: number | percentage, alpha: number | percentage = number(1.0)): + return self._hsl((h, s, l, alpha), (0, 1, 2)) + +class CSS4Reference(CSS3Reference): + """ Named colors and functions from `CSS Color Module Level 4 + <https://drafts.csswg.org/css-color/>`_. """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + number = _Reference.number + percentage = _Reference.percentage + angle = _Reference.angle + color = _Reference.color + + # --- + # Named colors. + # --- + + __colors = { + 'rebeccapurple': _rgb('#663399')} + + def _color(self, name): + try: + return self.__colors[name] + except: + return super()._color(name) + + # --- + # Utilities. + # --- + + def _hwb(self, hwba, hwb_indexes): + h, w, b, alpha = hwba + hi, wi, bi = hwb_indexes + + try: + h = h.to_hue() + except ValueError as e: + raise _InvalidArgumentValueError(hi, str(e)) + + try: + w = w.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(wi, str(e)) + + try: + b = b.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(bi, str(e)) + + try: + alpha = alpha.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(3, str(e)) + + return _Reference.color(_Color(_Color.Type.HWB, h, w, b, alpha)) + + # --- + # Functions. + # --- + + def hwb(self, h: number | angle, w: number | percentage = number(0), + b: number | percentage = number(0), + alpha: number | percentage = number(1.0)): + return self._hwb((h, w, b, alpha), (0, 1, 2)) + + def hwba(self, h: number | angle, w: number | percentage = number(0), + b: number | percentage = number(0), + alpha: number | percentage = number(1.0)): + return self._hwb((h, w, b, alpha), (0, 1, 2)) + + def gray(self, g: number | percentage, + alpha: number | percentage = number(1.0)): + try: + g = g.to_byte() + except ValueError as e: + raise _InvalidArgumentValueError(0, str(e)) + + try: + alpha = alpha.to_factor() + except ValueError as e: + raise _InvalidArgumentValueError(1, str(e)) + + return _Reference.color(_Color(_Color.Type.RGB, g, g, g, alpha)) + + def lab(self, l: number, a: number, b: number, + alpha: percentage = number(1.0)): + # TODO: lab + raise NotImplementedError + + def lch(self, l: number, c: number, h: number | angle, + alpha: percentage = number(1.0)): + # TODO: lch + raise NotImplementedError + +# End of file. |