| | """ |
| | 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", |
| | ] |
| |
|
| |
|
| | |
| | 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 |
| | """ |
| |
|
| | |
| | DEFAULT_ATTRS = Attrs( |
| | color="", |
| | bgcolor="", |
| | bold=False, |
| | underline=False, |
| | strike=False, |
| | italic=False, |
| | blink=False, |
| | reverse=False, |
| | hidden=False, |
| | ) |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | ANSI_COLOR_NAMES = [ |
| | "ansidefault", |
| | |
| | "ansiblack", |
| | "ansired", |
| | "ansigreen", |
| | "ansiyellow", |
| | "ansiblue", |
| | "ansimagenta", |
| | "ansicyan", |
| | "ansigray", |
| | |
| | "ansibrightblack", |
| | "ansibrightred", |
| | "ansibrightgreen", |
| | "ansibrightyellow", |
| | "ansibrightblue", |
| | "ansibrightmagenta", |
| | "ansibrightcyan", |
| | "ansiwhite", |
| | ] |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | |
| | 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. |
| | """ |
| |
|
| | @abstractmethod |
| | 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. |
| | """ |
| |
|
| | @abstractproperty |
| | 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 [] |
| |
|
| | @abstractmethod |
| | 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 |
| |
|
| | @property |
| | 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() |
| |
|
| | @property |
| | def style_rules(self) -> list[tuple[str, str]]: |
| | return (self.get_style() or self._dummy).style_rules |
| |
|