71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
"""
|
|
Adaptor for building prompt_toolkit styles, starting from a Pygments style.
|
|
|
|
Usage::
|
|
|
|
from pygments.styles.tango import TangoStyle
|
|
style = style_from_pygments_cls(pygments_style_cls=TangoStyle)
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from .style import Style
|
|
|
|
if TYPE_CHECKING:
|
|
from pygments.style import Style as PygmentsStyle
|
|
from pygments.token import Token
|
|
|
|
|
|
__all__ = [
|
|
"style_from_pygments_cls",
|
|
"style_from_pygments_dict",
|
|
"pygments_token_to_classname",
|
|
]
|
|
|
|
|
|
def style_from_pygments_cls(pygments_style_cls: type[PygmentsStyle]) -> Style:
|
|
"""
|
|
Shortcut to create a :class:`.Style` instance from a Pygments style class
|
|
and a style dictionary.
|
|
|
|
Example::
|
|
|
|
from prompt_toolkit.styles.from_pygments import style_from_pygments_cls
|
|
from pygments.styles import get_style_by_name
|
|
style = style_from_pygments_cls(get_style_by_name('monokai'))
|
|
|
|
:param pygments_style_cls: Pygments style class to start from.
|
|
"""
|
|
# Import inline.
|
|
from pygments.style import Style as PygmentsStyle
|
|
|
|
assert issubclass(pygments_style_cls, PygmentsStyle)
|
|
|
|
return style_from_pygments_dict(pygments_style_cls.styles)
|
|
|
|
|
|
def style_from_pygments_dict(pygments_dict: dict[Token, str]) -> Style:
|
|
"""
|
|
Create a :class:`.Style` instance from a Pygments style dictionary.
|
|
(One that maps Token objects to style strings.)
|
|
"""
|
|
pygments_style = []
|
|
|
|
for token, style in pygments_dict.items():
|
|
pygments_style.append((pygments_token_to_classname(token), style))
|
|
|
|
return Style(pygments_style)
|
|
|
|
|
|
def pygments_token_to_classname(token: Token) -> str:
|
|
"""
|
|
Turn e.g. `Token.Name.Exception` into `'pygments.name.exception'`.
|
|
|
|
(Our Pygments lexer will also turn the tokens that pygments produces in a
|
|
prompt_toolkit list of fragments that match these styling rules.)
|
|
"""
|
|
parts = ("pygments",) + token
|
|
return ".".join(parts).lower()
|