Spaces:
Sleeping
Sleeping
""" | |
The base classes for the styling. | |
""" | |
from __future__ import annotations | |
from abc import ABCMeta, abstractmethod, abstractproperty | |
from typing import Callable, Hashable, NamedTuple | |
__all__ = [ | |
"Attrs", | |
"DEFAULT_ATTRS", | |
"ANSI_COLOR_NAMES", | |
"ANSI_COLOR_NAMES_ALIASES", | |
"BaseStyle", | |
"DummyStyle", | |
"DynamicStyle", | |
] | |
#: Style attributes. | |
class Attrs(NamedTuple): | |
color: str | None | |
bgcolor: str | None | |
bold: bool | None | |
underline: bool | None | |
strike: bool | None | |
italic: bool | None | |
blink: bool | None | |
reverse: bool | None | |
hidden: bool | None | |
""" | |
: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 strike: Boolean | |
:param italic: Boolean | |
:param blink: Boolean | |
:param reverse: Boolean | |
:param hidden: Boolean | |
""" | |
#: The default `Attrs`. | |
DEFAULT_ATTRS = Attrs( | |
color="", | |
bgcolor="", | |
bold=False, | |
underline=False, | |
strike=False, | |
italic=False, | |
blink=False, | |
reverse=False, | |
hidden=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. | |
#: ISO 6429 colors | |
ANSI_COLOR_NAMES = [ | |
"ansidefault", | |
# Low intensity, dark. (One or two components 0x80, the other 0x00.) | |
"ansiblack", | |
"ansired", | |
"ansigreen", | |
"ansiyellow", | |
"ansiblue", | |
"ansimagenta", | |
"ansicyan", | |
"ansigray", | |
# High intensity, bright. (One or two components 0xff, the other 0x00. Not supported everywhere.) | |
"ansibrightblack", | |
"ansibrightred", | |
"ansibrightgreen", | |
"ansibrightyellow", | |
"ansibrightblue", | |
"ansibrightmagenta", | |
"ansibrightcyan", | |
"ansiwhite", | |
] | |
# People don't use the same ANSI color names everywhere. In prompt_toolkit 1.0 | |
# we used some unconventional names (which were contributed like that to | |
# Pygments). This is fixed now, but we still support the old names. | |
# The table below maps the old aliases to the current names. | |
ANSI_COLOR_NAMES_ALIASES: dict[str, str] = { | |
"ansidarkgray": "ansibrightblack", | |
"ansiteal": "ansicyan", | |
"ansiturquoise": "ansibrightcyan", | |
"ansibrown": "ansiyellow", | |
"ansipurple": "ansimagenta", | |
"ansifuchsia": "ansibrightmagenta", | |
"ansilightgray": "ansigray", | |
"ansidarkred": "ansired", | |
"ansidarkgreen": "ansigreen", | |
"ansidarkblue": "ansiblue", | |
} | |
assert set(ANSI_COLOR_NAMES_ALIASES.values()).issubset(set(ANSI_COLOR_NAMES)) | |
assert not (set(ANSI_COLOR_NAMES_ALIASES.keys()) & set(ANSI_COLOR_NAMES)) | |
class BaseStyle(metaclass=ABCMeta): | |
""" | |
Abstract base class for prompt_toolkit styles. | |
""" | |
def get_attrs_for_style_str( | |
self, style_str: str, default: Attrs = DEFAULT_ATTRS | |
) -> Attrs: | |
""" | |
Return :class:`.Attrs` for the given style string. | |
:param style_str: The style string. This can contain inline styling as | |
well as classnames (e.g. "class:title"). | |
:param default: `Attrs` to be used if no styling was defined. | |
""" | |
def style_rules(self) -> list[tuple[str, str]]: | |
""" | |
The list of style rules, used to create this style. | |
(Required for `DynamicStyle` and `_MergedStyle` to work.) | |
""" | |
return [] | |
def invalidation_hash(self) -> Hashable: | |
""" | |
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 DummyStyle(BaseStyle): | |
""" | |
A style that doesn't style anything. | |
""" | |
def get_attrs_for_style_str( | |
self, style_str: str, default: Attrs = DEFAULT_ATTRS | |
) -> Attrs: | |
return default | |
def invalidation_hash(self) -> Hashable: | |
return 1 # Always the same value. | |
def style_rules(self) -> list[tuple[str, str]]: | |
return [] | |
class DynamicStyle(BaseStyle): | |
""" | |
Style class that can dynamically returns an other Style. | |
:param get_style: Callable that returns a :class:`.Style` instance. | |
""" | |
def __init__(self, get_style: Callable[[], BaseStyle | None]): | |
self.get_style = get_style | |
self._dummy = DummyStyle() | |
def get_attrs_for_style_str( | |
self, style_str: str, default: Attrs = DEFAULT_ATTRS | |
) -> Attrs: | |
style = self.get_style() or self._dummy | |
return style.get_attrs_for_style_str(style_str, default) | |
def invalidation_hash(self) -> Hashable: | |
return (self.get_style() or self._dummy).invalidation_hash() | |
def style_rules(self) -> list[tuple[str, str]]: | |
return (self.get_style() or self._dummy).style_rules | |