123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- """
- pygments.style
- ~~~~~~~~~~~~~~
- Basic style object.
- :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.token import Token, STANDARD_TYPES
- # Default mapping of ansixxx to RGB colors.
- _ansimap = {
- # dark
- 'ansiblack': '000000',
- 'ansired': '7f0000',
- 'ansigreen': '007f00',
- 'ansiyellow': '7f7fe0',
- 'ansiblue': '00007f',
- 'ansimagenta': '7f007f',
- 'ansicyan': '007f7f',
- 'ansigray': 'e5e5e5',
- # normal
- 'ansibrightblack': '555555',
- 'ansibrightred': 'ff0000',
- 'ansibrightgreen': '00ff00',
- 'ansibrightyellow': 'ffff00',
- 'ansibrightblue': '0000ff',
- 'ansibrightmagenta': 'ff00ff',
- 'ansibrightcyan': '00ffff',
- 'ansiwhite': 'ffffff',
- }
- # mapping of deprecated #ansixxx colors to new color names
- _deprecated_ansicolors = {
- # dark
- '#ansiblack': 'ansiblack',
- '#ansidarkred': 'ansired',
- '#ansidarkgreen': 'ansigreen',
- '#ansibrown': 'ansiyellow',
- '#ansidarkblue': 'ansiblue',
- '#ansipurple': 'ansimagenta',
- '#ansiteal': 'ansicyan',
- '#ansilightgray': 'ansigray',
- # normal
- '#ansidarkgray': 'ansibrightblack',
- '#ansired': 'ansibrightred',
- '#ansigreen': 'ansibrightgreen',
- '#ansiyellow': 'ansibrightyellow',
- '#ansiblue': 'ansibrightblue',
- '#ansifuchsia': 'ansibrightmagenta',
- '#ansiturquoise': 'ansibrightcyan',
- '#ansiwhite': 'ansiwhite',
- }
- ansicolors = set(_ansimap)
- class StyleMeta(type):
- def __new__(mcs, name, bases, dct):
- obj = type.__new__(mcs, name, bases, dct)
- for token in STANDARD_TYPES:
- if token not in obj.styles:
- obj.styles[token] = ''
- def colorformat(text):
- if text in ansicolors:
- return text
- if text[0:1] == '#':
- col = text[1:]
- if len(col) == 6:
- return col
- elif len(col) == 3:
- return col[0] * 2 + col[1] * 2 + col[2] * 2
- elif text == '':
- return ''
- elif text.startswith('var') or text.startswith('calc'):
- return text
- assert False, f"wrong color format {text!r}"
- _styles = obj._styles = {}
- for ttype in obj.styles:
- for token in ttype.split():
- if token in _styles:
- continue
- ndef = _styles.get(token.parent, None)
- styledefs = obj.styles.get(token, '').split()
- if not ndef or token is None:
- ndef = ['', 0, 0, 0, '', '', 0, 0, 0]
- elif 'noinherit' in styledefs and token is not Token:
- ndef = _styles[Token][:]
- else:
- ndef = ndef[:]
- _styles[token] = ndef
- for styledef in obj.styles.get(token, '').split():
- if styledef == 'noinherit':
- pass
- elif styledef == 'bold':
- ndef[1] = 1
- elif styledef == 'nobold':
- ndef[1] = 0
- elif styledef == 'italic':
- ndef[2] = 1
- elif styledef == 'noitalic':
- ndef[2] = 0
- elif styledef == 'underline':
- ndef[3] = 1
- elif styledef == 'nounderline':
- ndef[3] = 0
- elif styledef[:3] == 'bg:':
- ndef[4] = colorformat(styledef[3:])
- elif styledef[:7] == 'border:':
- ndef[5] = colorformat(styledef[7:])
- elif styledef == 'roman':
- ndef[6] = 1
- elif styledef == 'sans':
- ndef[7] = 1
- elif styledef == 'mono':
- ndef[8] = 1
- else:
- ndef[0] = colorformat(styledef)
- return obj
- def style_for_token(cls, token):
- t = cls._styles[token]
- ansicolor = bgansicolor = None
- color = t[0]
- if color in _deprecated_ansicolors:
- color = _deprecated_ansicolors[color]
- if color in ansicolors:
- ansicolor = color
- color = _ansimap[color]
- bgcolor = t[4]
- if bgcolor in _deprecated_ansicolors:
- bgcolor = _deprecated_ansicolors[bgcolor]
- if bgcolor in ansicolors:
- bgansicolor = bgcolor
- bgcolor = _ansimap[bgcolor]
- return {
- 'color': color or None,
- 'bold': bool(t[1]),
- 'italic': bool(t[2]),
- 'underline': bool(t[3]),
- '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):
- return list(cls)
- def styles_token(cls, ttype):
- return ttype in cls._styles
- def __iter__(cls):
- for token in cls._styles:
- yield token, cls.style_for_token(token)
- def __len__(cls):
- return len(cls._styles)
- class Style(metaclass=StyleMeta):
- #: overall background color (``None`` means transparent)
- background_color = '#ffffff'
- #: highlight background color
- highlight_color = '#ffffcc'
- #: line number font color
- line_number_color = 'inherit'
- #: line number background color
- line_number_background_color = 'transparent'
- #: special line number font color
- line_number_special_color = '#000000'
- #: special line number background color
- line_number_special_background_color = '#ffffc0'
- #: Style definitions for individual token types.
- styles = {}
- #: user-friendly style name (used when selecting the style, so this
- # should be all-lowercase, no spaces, hyphens)
- name = 'unnamed'
- aliases = []
- # Attribute for lexers defined within Pygments. If set
- # to True, the style is not shown in the style gallery
- # on the website. This is intended for language-specific
- # styles.
- web_style_gallery_exclude = False
|