diff --git a/lib/ansi_vt100.py b/lib/ansi_vt100.py new file mode 100755 index 0000000..011dbb7 --- /dev/null +++ b/lib/ansi_vt100.py @@ -0,0 +1,93 @@ +""" +ANSI/VT100 color escape sequences for 4 bit colors. + +A simple escape sequence to hex map of colors. +Assumes "default background" to be black and "foreground" white. +Colors taken from Terminal.app defaults. + +https://en.m.wikipedia.org/wiki/ANSI_escape_code#Colors +""" +code2hex_map = { + '39': '#ffffff', # default foreground + '49': '#000000', # default background + + '30': '#000000', # black + '40': '#000000', + + '31': '#990000', # red + '41': '#990000', + + '32': '#00a600', # green + '42': '#00a600', + + '33': '#999900', # yellow + '43': '#999900', + + '34': '#0000b2', # blue + '44': '#0000b2', + + '35': '#b200b2', # magenta + '45': '#b200b2', + + '36': '#00a6b2', # cyan + '46': '#00a6b2', + + '37': '#ffffff', # white + '47': '#ffffff', + + '90': '#666666', # bright black + '100': '#666666', + '1;30': '#666666', # bold + black + '1;40': '#666666', + + '91': '#e50000', # bright red + '101': '#e50000', + '1;31': '#e50000', # bold + red + '1;41': '#e50000', + + '92': '#00d900', # bright green + '102': '#00d900', + '1;32': '#00d900', # bold + green + '1;42': '#00d900', + + '93': '#e5e500', # bright yellow + '103': '#e5e500', + '1;33': '#e5e500', # bold + yellow + '1;43': '#e5e500', + + '94': '#0000ff', # bright blue + '104': '#0000ff', + '1;34': '#0000ff', # bold + blue + '1;44': '#0000ff', + + '95': '#e500e5', # bright magenta + '105': '#e500e5', + '1;35': '#e500e5', # bold + magenta + '1;45': '#e500e5', + + '96': '#00e5e5', # bright cyan + '106': '#00e5e5', + '1;36': '#00e5e5', # bold + cyan + '1;46': '#00e5e5', + + '97': '#e5e5e5', # bright white + '107': '#e5e5e5', + '1;37': '#e5e5e5', # bold + white + '1;47': '#e5e5e5', +} + +hex2code_map = dict([(v, k) for k, v in code2hex_map.items()]) + + +def hex2code(value): + """Convert CSS hex to webcolor name.""" + + return hex2code_map.get(value.lower(), None) + + +def code2hex(name): + """Convert webcolor name to CSS hex.""" + + print(name.split(';')) + + return code2hex_map.get(name.lower(), None) diff --git a/lib/util.py b/lib/util.py index f5f3139..8d99e4e 100644 --- a/lib/util.py +++ b/lib/util.py @@ -6,10 +6,11 @@ """ import re import decimal -from . import csscolors, pantone, ral +from . import csscolors, pantone, ral, ansi_vt100 from .rgba import RGBA, round_int, clamp -FLOAT_TRIM_RE = re.compile(r'^(?P\d+)(?P\.0+|(?P\.\d*[1-9])0+)$') +FLOAT_TRIM_RE = re.compile( + r'^(?P\d+)(?P\.0+|(?P\.\d*[1-9])0+)$') COLOR_PARTS = { "percent": r"[+\-]?(?:(?:\d*\.\d+)|\d+)%", @@ -21,9 +22,13 @@ (?P(\#|0x)(?P[\dA-Fa-f]{6}))\b | (?P(\#|0x)(?P[\dA-Fa-f]{4}))\b | (?P(\#|0x)(?P[\dA-Fa-f]{3}))\b | - \b(?Prgb\(\s*(?P(?:%(float)s\s*,\s*){2}%(float)s | (?:%(percent)s\s*,\s*){2}%(percent)s)\s*\)) | + \b(?Prgb\(\s*(?P + (?:%(float)s\s*,\s*){2}%(float)s | + (?:%(percent)s\s*,\s*){2}%(percent)s + )\s*\)) | \b(?Prgba\(\s*(?P - (?:%(float)s\s*,\s*){3}(?:%(percent)s|%(float)s) | (?:%(percent)s\s*,\s*){3}(?:%(percent)s|%(float)s) + (?:%(float)s\s*,\s*){3}(?:%(percent)s|%(float)s) | + (?:%(percent)s\s*,\s*){3}(?:%(percent)s|%(float)s) )\s*\)) | \b(?Phsl\(\s*(?P%(float)s\s*,\s*%(percent)s\s*,\s*%(percent)s)\s*\)) | \b(?Phsla\(\s*(?P%(float)s\s*,\s*(?:%(percent)s\s*,\s*){2}(?:%(percent)s|%(float)s))\s*\)) | @@ -32,7 +37,8 @@ \b(?Pgray\(\s*(?P%(float)s|%(percent)s)\s*\)) | \b(?Pgray\(\s*(?P(?:%(float)s|%(percent)s)\s*,\s*(?:%(percent)s|%(float)s))\s*\)) | \b(?P((\d{2}-)?\d{3,5}\s|(black|blue|bright red|cool gray|dark blue|green|magenta|medium purple|orange|pink|process blue|purple|red|reflex blue|rhodamine red|rose gold|silver|violet|warm gray|warm red|yellow)\s(\d{1,5}\s)?|p\s\d{1,3}-\d{1,2}\s)[a-z]{1,3})\b | - \b(?PRAL\s\d{4})\b + \b(?PRAL\s\d{4})\b | + \\(e|033|x1B)\[(?P(1;)?(3|4|10)[0-9])(;[0-9]+)*)m ''' % COLOR_PARTS COLOR_NAMES = r'\b(?P%s)\b(?!\()' % '|'.join([name for name in csscolors.name2hex_map.keys()]) @@ -325,4 +331,13 @@ def translate_color(m, use_hex_argb=False, decode=False): color = ral.code2hex(m.group('ral_code')).lower() except Exception: pass + elif m.group('ansi_vt100'): + try: + print('ansi rulez') + if decode: + color = ansi_vt100.code2hex(m.group('ansi_vt100').decode('utf-8')).lower() + else: + color = ansi_vt100.code2hex(m.group('ansi_vt100')).lower() + except Exception: + pass return color, alpha, alpha_dec