1"""
2Adaptor for building prompt_toolkit styles, starting from a Pygments style.
3
4Usage::
5
6 from pygments.styles.tango import TangoStyle
7 style = style_from_pygments_cls(pygments_style_cls=TangoStyle)
8"""
9
10from __future__ import annotations
11
12from typing import TYPE_CHECKING
13
14from .style import Style
15
16if TYPE_CHECKING:
17 from pygments.style import Style as PygmentsStyle
18 from pygments.token import Token
19
20
21__all__ = [
22 "style_from_pygments_cls",
23 "style_from_pygments_dict",
24 "pygments_token_to_classname",
25]
26
27
28def style_from_pygments_cls(pygments_style_cls: type[PygmentsStyle]) -> Style:
29 """
30 Shortcut to create a :class:`.Style` instance from a Pygments style class
31 and a style dictionary.
32
33 Example::
34
35 from prompt_toolkit.styles.from_pygments import style_from_pygments_cls
36 from pygments.styles import get_style_by_name
37 style = style_from_pygments_cls(get_style_by_name('monokai'))
38
39 :param pygments_style_cls: Pygments style class to start from.
40 """
41 # Import inline.
42 from pygments.style import Style as PygmentsStyle
43
44 assert issubclass(pygments_style_cls, PygmentsStyle)
45
46 return style_from_pygments_dict(pygments_style_cls.styles)
47
48
49def style_from_pygments_dict(pygments_dict: dict[Token, str]) -> Style:
50 """
51 Create a :class:`.Style` instance from a Pygments style dictionary.
52 (One that maps Token objects to style strings.)
53 """
54 pygments_style = []
55
56 for token, style in pygments_dict.items():
57 pygments_style.append((pygments_token_to_classname(token), style))
58
59 return Style(pygments_style)
60
61
62def pygments_token_to_classname(token: Token) -> str:
63 """
64 Turn e.g. `Token.Name.Exception` into `'pygments.name.exception'`.
65
66 (Our Pygments lexer will also turn the tokens that pygments produces in a
67 prompt_toolkit list of fragments that match these styling rules.)
68 """
69 parts = ("pygments",) + token
70 return ".".join(parts).lower()