diff options
Diffstat (limited to 'thcolor/builtin/_css.py')
-rwxr-xr-x | thcolor/builtin/_css.py | 497 |
1 files changed, 201 insertions, 296 deletions
diff --git a/thcolor/builtin/_css.py b/thcolor/builtin/_css.py index ac9e434..457d560 100755 --- a/thcolor/builtin/_css.py +++ b/thcolor/builtin/_css.py @@ -1,18 +1,22 @@ #!/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. +#************************************************************************** +""" 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 +from ..syntax import (number as _number, percentage as _percentage, + angle as _angle, color as _color, alias as _alias) __all__ = ["CSS1Reference", "CSS2Reference", "CSS3Reference", "CSS4Reference"] + def _rgb(raw): r = int(raw[1:3], 16) g = int(raw[3:5], 16) @@ -20,373 +24,271 @@ def _rgb(raw): 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) + 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') + + transparent = _RGBColor(0, 0, 0, 0) # --- - # Utilities. + # Functions. # --- - def _rgb(self, rgba, rgb_indexes): - r, g, b, alpha = rgba - ri, gi, bi = rgb_indexes - + def rgb(self, + r: _number | _percentage = _number(0), + g: _number | _percentage = _number(0), + b: _number | _percentage = _number(0)): try: r = r.to_byte() except ValueError as e: - raise _InvalidArgumentValueError(ri, str(e)) + raise _InvalidArgumentValueError(0, str(e)) try: g = g.to_byte() except ValueError as e: - raise _InvalidArgumentValueError(gi, str(e)) + raise _InvalidArgumentValueError(1, 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. - # --- + raise _InvalidArgumentValueError(2, str(e)) - 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)) + return _Reference.color(_RGBColor(r / 255, g / 255, b / 255, 1.0)) 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) + orange = _rgb('#ffa500') 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) + 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') # --- - # 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. + # Functions. # --- - def _hsl(self, hsla, hsl_indexes): - h, s, l, alpha = hsla - hi, si, li = hsl_indexes + def hsl(self, + h: _number | _angle, + s: _number | _percentage, + l: _number | _percentage, + alpha: _number | _percentage = _number(1.0)): try: h = h.to_hue() except ValueError as e: - raise _InvalidArgumentValueError(hi, str(e)) + raise _InvalidArgumentValueError(0, str(e)) try: s = s.to_factor() except ValueError as e: - raise _InvalidArgumentValueError(si, str(e)) + raise _InvalidArgumentValueError(1, str(e)) try: l = l.to_factor() except ValueError as e: - raise _InvalidArgumentValueError(li, str(e)) + raise _InvalidArgumentValueError(2, 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)) + return _Reference.color(_HSLColor(h, s, l, alpha)) - # --- - # Functions. - # --- - - @_Reference.alias('rgba') - 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)) - - @_Reference.alias('hsla') - 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)) + rgba = _alias('rgb') + hsla = _alias('hsla') 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 + rebeccapurple = _rgb('#663399') # --- - # Named colors. - # --- - - __colors = { - 'rebeccapurple': _rgb('#663399')} - - def _color(self, name): - try: - return self.__colors[name] - except: - return super()._color(name) - - # --- - # Utilities. + # Functions. # --- - def _hwb(self, hwba, hwb_indexes): - h, w, b, alpha = hwba - hi, wi, bi = hwb_indexes + def hwb(self, h: _number | _angle, + w: _number | _percentage = _number(0), + b: _number | _percentage = _number(0), + alpha: _number | _percentage = _number(1.0)): try: h = h.to_hue() except ValueError as e: - raise _InvalidArgumentValueError(hi, str(e)) + raise _InvalidArgumentValueError(0, str(e)) try: w = w.to_factor() except ValueError as e: - raise _InvalidArgumentValueError(wi, str(e)) + raise _InvalidArgumentValueError(1, str(e)) try: b = b.to_factor() except ValueError as e: - raise _InvalidArgumentValueError(bi, str(e)) + raise _InvalidArgumentValueError(2, 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)) + return _Reference.color(_HWBColor(h, w, b, alpha)) - # --- - # Functions. - # --- - - @_Reference.alias('hwba') - 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 gray(self, g: _number | _percentage, + alpha: _number | _percentage = _number(1.0)): - def gray(self, g: number | percentage, - alpha: number | percentage = number(1.0)): try: g = g.to_byte() except ValueError as e: @@ -397,10 +299,11 @@ class CSS4Reference(CSS3Reference): except ValueError as e: raise _InvalidArgumentValueError(1, str(e)) - return _Reference.color(_Color(_Color.Type.RGB, g, g, g, alpha)) + g /= 255 + return _Reference.color(_RGBColor(g, g, g, alpha)) - def lab(self, l: number, a: number, b: number, - alpha: number | percentage = number(1.0)): + def lab(self, l: _number, a: _number, b: _number, + alpha: _number | _percentage = _number(1.0)): try: l = l.value @@ -418,10 +321,10 @@ class CSS4Reference(CSS3Reference): except ValueError as e: raise _InvalidArgumentValueError(3, str(e)) - return _Reference.color(_Color(_Color.Type.LAB, l, a, b, alpha)) + return _Reference.color(_LABColor(l, a, b, alpha)) - def lch(self, l: number, c: number, h: number | angle, - alpha: number | percentage = number(1.0)): + def lch(self, l: _number, c: _number, h: _number | _angle, + alpha: _number | _percentage = _number(1.0)): try: l = l.value @@ -445,6 +348,8 @@ class CSS4Reference(CSS3Reference): except ValueError as e: raise _InvalidArgumentValueError(3, str(e)) - return _Reference.color(_Color(_Color.Type.LCH, l, c, h, alpha)) + return _Reference.color(_LCHColor(l, c, h, alpha)) + + hwba = _alias('hwb') # End of file. |