""" The base classes for the styling. """ from __future__ import unicode_literals from abc import ABCMeta, abstractmethod from collections import namedtuple from six import with_metaclass __all__ = ( 'Attrs', 'DEFAULT_ATTRS', 'ANSI_COLOR_NAMES', 'Style', 'DynamicStyle', ) #: Style attributes. Attrs = namedtuple('Attrs', 'color bgcolor bold underline italic blink reverse') """ :param color: Hexadecimal string. E.g. '000000' or Ansi color name: e.g. 'ansiblue' :param bgcolor: Hexadecimal string. E.g. 'ffffff' or Ansi color name: e.g. 'ansired' :param bold: Boolean :param underline: Boolean :param italic: Boolean :param blink: Boolean :param reverse: Boolean """ #: The default `Attrs`. DEFAULT_ATTRS = Attrs(color=None, bgcolor=None, bold=False, underline=False, italic=False, blink=False, reverse=False) #: ``Attrs.bgcolor/fgcolor`` can be in either 'ffffff' format, or can be any of #: the following in case we want to take colors from the 8/16 color palette. #: Usually, in that case, the terminal application allows to configure the RGB #: values for these names. ANSI_COLOR_NAMES = [ 'ansiblack', 'ansiwhite', 'ansidefault', # Low intensity. 'ansired', 'ansigreen', 'ansiyellow', 'ansiblue', 'ansifuchsia', 'ansiturquoise', 'ansilightgray', # High intensity. (Not supported everywhere.) 'ansidarkgray', 'ansidarkred', 'ansidarkgreen', 'ansibrown', 'ansidarkblue', 'ansipurple', 'ansiteal', ] class Style(with_metaclass(ABCMeta, object)): """ Abstract base class for prompt_toolkit styles. """ @abstractmethod def get_attrs_for_token(self, token): """ Return :class:`.Attrs` for the given token. """ @abstractmethod def invalidation_hash(self): """ Invalidation hash for the style. When this changes over time, the renderer knows that something in the style changed, and that everything has to be redrawn. """ class DynamicStyle(Style): """ Style class that can dynamically returns an other Style. :param get_style: Callable that returns a :class:`.Style` instance. """ def __init__(self, get_style): self.get_style = get_style def get_attrs_for_token(self, token): style = self.get_style() assert isinstance(style, Style) return style.get_attrs_for_token(token) def invalidation_hash(self): return self.get_style().invalidation_hash()