Skip to content

Commit

Permalink
add first very naive vt100 escape sequence match
Browse files Browse the repository at this point in the history
  • Loading branch information
braver committed Aug 3, 2019
1 parent f062255 commit 274a315
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 5 deletions.
93 changes: 93 additions & 0 deletions lib/ansi_vt100.py
Original file line number Diff line number Diff line change
@@ -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)
25 changes: 20 additions & 5 deletions lib/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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<keep>\d+)(?P<trash>\.0+|(?P<keep2>\.\d*[1-9])0+)$')
FLOAT_TRIM_RE = re.compile(
r'^(?P<keep>\d+)(?P<trash>\.0+|(?P<keep2>\.\d*[1-9])0+)$')

COLOR_PARTS = {
"percent": r"[+\-]?(?:(?:\d*\.\d+)|\d+)%",
Expand All @@ -21,9 +22,13 @@
(?P<hex>(\#|0x)(?P<hex_content>[\dA-Fa-f]{6}))\b |
(?P<hexa_compressed>(\#|0x)(?P<hexa_compressed_content>[\dA-Fa-f]{4}))\b |
(?P<hex_compressed>(\#|0x)(?P<hex_compressed_content>[\dA-Fa-f]{3}))\b |
\b(?P<rgb>rgb\(\s*(?P<rgb_content>(?:%(float)s\s*,\s*){2}%(float)s | (?:%(percent)s\s*,\s*){2}%(percent)s)\s*\)) |
\b(?P<rgb>rgb\(\s*(?P<rgb_content>
(?:%(float)s\s*,\s*){2}%(float)s |
(?:%(percent)s\s*,\s*){2}%(percent)s
)\s*\)) |
\b(?P<rgba>rgba\(\s*(?P<rgba_content>
(?:%(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(?P<hsl>hsl\(\s*(?P<hsl_content>%(float)s\s*,\s*%(percent)s\s*,\s*%(percent)s)\s*\)) |
\b(?P<hsla>hsla\(\s*(?P<hsla_content>%(float)s\s*,\s*(?:%(percent)s\s*,\s*){2}(?:%(percent)s|%(float)s))\s*\)) |
Expand All @@ -32,7 +37,8 @@
\b(?P<gray>gray\(\s*(?P<gray_content>%(float)s|%(percent)s)\s*\)) |
\b(?P<graya>gray\(\s*(?P<graya_content>(?:%(float)s|%(percent)s)\s*,\s*(?:%(percent)s|%(float)s))\s*\)) |
\b(?P<pantone_code>((\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(?P<ral_code>RAL\s\d{4})\b
\b(?P<ral_code>RAL\s\d{4})\b |
\\(e|033|x1B)\[(?P<ansi_vt100>(1;)?(3|4|10)[0-9])(;[0-9]+)*)m
''' % COLOR_PARTS

COLOR_NAMES = r'\b(?P<webcolors>%s)\b(?!\()' % '|'.join([name for name in csscolors.name2hex_map.keys()])
Expand Down Expand Up @@ -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

0 comments on commit 274a315

Please sign in to comment.