Source code for bibliopixel.colors.names

"""
Convert back and forth between colors and string names.
"""

import numbers
from . import tables
from . tables import COLOR_DICT


[docs]def name_to_color(name): """ :param str name: a string identifying a color. It might be a color name from the two lists of color names, juce and classic; or it might be a list of numeric r, g, b values separated by commas. :returns: a color as an RGB 3-tuple """ def to_color(name): name = name.lower() if ',' in name: if name.startswith('(') and name.endswith(')'): name = name[1:-1] if name.startswith('[') and name.endswith(']'): name = name[1:-1] r, g, b = name.split(',') return _from_number(r), _from_number(g), _from_number(b) try: n = _from_number(name) except: color = tables.get_color(name) if color: return color raise ValueError return tables.to_triplet(n) try: color = to_color(name) except: raise ValueError('Unknown color name %s' % str(name)) if not all(0 <= i <= 255 for i in color): raise ValueError('Component out of range: %s' % color) return color
[docs]def color_to_name(color, use_hex=False): """ :param tuple color: an RGB 3-tuple of integer colors :returns: a string name for this color ``name_to_color(color_to_name(c)) == c`` is guaranteed to be true (but the reverse is not true, because name_to_color is a many-to-one function). """ if isinstance(color, list): color = tuple(color) elif not isinstance(color, tuple): raise ValueError('Not a color') if use_hex: return '#%02x%02x%02x' % color return tables.get_name(color) or str(color)
[docs]def toggle(s): """ Toggle back and forth between a name and a tuple representation. :param str s: a string which is either a text name, or a tuple-string: a string with three numbers separated by commas :returns: if the string was a text name, return a tuple. If it's a tuple-string and it corresponds to a text name, return the text name, else return the original tuple-string. """ is_numeric = ',' in s or s.startswith('0x') or s.startswith('#') c = name_to_color(s) return color_to_name(c) if is_numeric else str(c)
def _from_number(s): s = s.strip() for prefix in '0x', '#': if s.startswith(prefix): return int(s[len(prefix):], 16) return int(s)
[docs]def to_color(c): """Try to coerce the argument into a color - a 3-tuple of numbers-""" if isinstance(c, numbers.Number): return c, c, c if not c: raise ValueError('Cannot create color from empty "%s"' % c) if isinstance(c, str): return name_to_color(c) if isinstance(c, list): c = tuple(c) if isinstance(c, tuple): if len(c) > 3: return c[:3] while len(c) < 3: c += (c[-1],) return c raise ValueError('Cannot create color from "%s"' % c)
from .. util import deprecated if deprecated.allowed(): from . colors import COLORS