diff options
Diffstat (limited to 'pygments')
| -rw-r--r-- | pygments/formatters/html.py | 21 | ||||
| -rw-r--r-- | pygments/formatters/terminal256.py | 22 | ||||
| -rw-r--r-- | pygments/style.py | 50 |
3 files changed, 65 insertions, 28 deletions
diff --git a/pygments/formatters/html.py b/pygments/formatters/html.py index 38e49f15..b03a4bd5 100644 --- a/pygments/formatters/html.py +++ b/pygments/formatters/html.py @@ -20,23 +20,6 @@ from pygments.token import Token, Text, STANDARD_TYPES from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \ StringIO, string_types, iteritems - -_deansify_map = { - '#darkyellow':'#brown', - '#darkteal': '#turquoise', - '#fusia': '#fushia' -} - - - -def _deansify(color): - if color.startswith('#ansi'): - color = color[5:] - else: - color = '#%s'% color - - return _deansify_map.get(color, color) - try: import ctags except ImportError: @@ -461,7 +444,7 @@ class HtmlFormatter(Formatter): name = self._get_css_class(ttype) style = '' if ndef['color']: - style += 'color: %s; ' % _deansify(ndef['color']) + style += 'color: #%s; ' % ndef['color'] if ndef['bold']: style += 'font-weight: bold; ' if ndef['italic']: @@ -469,7 +452,7 @@ class HtmlFormatter(Formatter): if ndef['underline']: style += 'text-decoration: underline; ' if ndef['bgcolor']: - style += 'background-color: %s; ' % _deansify(ndef['bgcolor']) + style += 'background-color: #%s; ' % ndef['bgcolor'] if ndef['border']: style += 'border: 1px solid #%s; ' % ndef['border'] if style: diff --git a/pygments/formatters/terminal256.py b/pygments/formatters/terminal256.py index 913536c4..1aa19f25 100644 --- a/pygments/formatters/terminal256.py +++ b/pygments/formatters/terminal256.py @@ -50,11 +50,20 @@ class EscapeSequence: attrs = [] if self.fg is not None: if self.fg in ansilist: - attrs.append(codes[self.fg[5:]][2:-1]) + esc = codes[self.fg[5:]] + if ';01m' in esc: + self.bold = True + # extract fg color code. + attrs.append(esc[2:4]) else : attrs.extend(("38", "5", "%i" % self.fg)) if self.bg is not None: - attrs.extend(("48", "5", "%i" % self.bg)) + if self.bg in ansilist: + esc = codes[self.bg[5:]] + # extract fg color code, add 10 for bg. + attrs.append(str(int(esc[2:4])+10)) + else : + attrs.extend(("48", "5", "%i" % self.bg)) if self.bold: attrs.append("01") if self.underline: @@ -201,9 +210,14 @@ class Terminal256Formatter(Formatter): def _setup_styles(self): for ttype, ndef in self.style: escape = EscapeSequence() - if ndef['color']: + # get foreground from ansicolor if set + if ndef['ansicolor']: + escape.fg = self._color_index(ndef['ansicolor']) + elif ndef['color']: escape.fg = self._color_index(ndef['color']) - if ndef['bgcolor']: + if ndef['bgansicolor']: + escape.bg = self._color_index(ndef['bgansicolor']) + elif ndef['bgcolor']: escape.bg = self._color_index(ndef['bgcolor']) if self.usebold and ndef['bold']: escape.bold = True diff --git a/pygments/style.py b/pygments/style.py index 7a272b53..bc318354 100644 --- a/pygments/style.py +++ b/pygments/style.py @@ -11,11 +11,31 @@ from pygments.token import Token, STANDARD_TYPES from pygments.util import add_metaclass -from pygments.console import codes -ansilist = ['#ansi'+x for x in codes.keys() if x] +_ansimap = { + ## + '#ansiblack': '000000', + '#ansidarkred': '7f0000', + '#ansidarkgreen': '007f00', + '#ansibrown': '7f7fe0', + '#ansidarkblue': '00007f', + '#ansipurple': '7f007f', + '#ansiteal': '007f7f', + '#ansilightgray': 'e5e5e5', + ### normal + '#ansidarkgray': '555555', + '#ansired': 'ff0000', + '#ansigreen': '00ff00', + '#ansiyellow': 'ffff00', + '#ansiblue': '0000ff', + '#ansifuchsia': 'ff00ff', + '#ansiturquoise': '00ffff', + '#ansiwhite': 'ffffff', + } +ansilist = list(_ansimap.keys()) + class StyleMeta(type): def __new__(mcs, name, bases, dct): @@ -35,7 +55,13 @@ class StyleMeta(type): return col[0]*2 + col[1]*2 + col[2]*2 elif text == '': return '' - assert False, "wrong color format %r" % text + didyoumean = '' + if 'ansi' in text: + import difflib + possibility = difflib.get_close_matches(text, ansilist, 1) + if possibility: + didyoumean = '. Did you mean {} ?'.format(possibility[0]) + assert False, "wrong color format %r%s" % (text, didyoumean) _styles = obj._styles = {} @@ -84,16 +110,30 @@ class StyleMeta(type): def style_for_token(cls, token): t = cls._styles[token] + ansicolor = None + color = t[0] + if color.startswith('#ansi'): + ansicolor = color + color = _ansimap[color] + bgansicolor = None + bgcolor = t[4] + if bgcolor.startswith('#ansi'): + bgansicolor = bgcolor + bgcolor = _ansimap[bgcolor] + return { - 'color': t[0] or None, + 'color': color or None, 'bold': bool(t[1]), 'italic': bool(t[2]), 'underline': bool(t[3]), - 'bgcolor': t[4] or None, + 'bgcolor': bgcolor or None, 'border': t[5] or None, 'roman': bool(t[6]) or None, 'sans': bool(t[7]) or None, 'mono': bool(t[8]) or None, + 'ansicolor': ansicolor, + 'bgansicolor': bgansicolor, + } def list_styles(cls): |
