File tree Expand file tree Collapse file tree 7 files changed +178
-0
lines changed
src/prompt_toolkit/formatted_text Expand file tree Collapse file tree 7 files changed +178
-0
lines changed Original file line number Diff line number Diff line change
1
+ #!/usr/bin/env python
2
+ from rich .markdown import Markdown
3
+ from rich .text import Text
4
+
5
+ from prompt_toolkit import choice
6
+ from prompt_toolkit .formatted_text .rich import Rich
7
+
8
+ # For the header, we wrap the `Markdown` object from `rich` in a `Rich` object
9
+ # from `prompt_toolkit`, so that we can explicitly set a width.
10
+ header = Rich (
11
+ Markdown (
12
+ """
13
+ # Please select a dish
14
+
15
+ Choose *one* item please.
16
+
17
+ ```python
18
+ def some_example_function() -> None: "test"
19
+ ```
20
+ """ .strip ()
21
+ ),
22
+ width = 50 ,
23
+ style = "black on blue" ,
24
+ )
25
+
26
+
27
+ def main ():
28
+ answer = choice (
29
+ message = header ,
30
+ options = [
31
+ ("pizza" , "Pizza with mushrooms" ),
32
+ (
33
+ "salad" ,
34
+ Text .from_markup (
35
+ ":warning: [green]Salad[/green] with [red]tomatoes[/red]"
36
+ ),
37
+ ),
38
+ ("sushi" , "Sushi" ),
39
+ ],
40
+ show_frame = True ,
41
+ )
42
+ print (f"You said: { answer } " )
43
+
44
+
45
+ if __name__ == "__main__" :
46
+ main ()
Original file line number Diff line number Diff line change
1
+ #!/usr/bin/env python
2
+ """
3
+ Example of an input box dialog.
4
+ """
5
+
6
+ from rich .text import Text
7
+
8
+ from prompt_toolkit .shortcuts import input_dialog
9
+
10
+
11
+ def main ():
12
+ result = input_dialog (
13
+ title = Text .from_markup ("[red]Input[/red] dialog [b]example[b]" ),
14
+ text = Text .from_markup ("Please type your [green]name[/green]:" ),
15
+ ).run ()
16
+
17
+ print (f"Result = { result } " )
18
+
19
+
20
+ if __name__ == "__main__" :
21
+ main ()
Original file line number Diff line number Diff line change
1
+ #!/usr/bin/env python
2
+ from rich .markdown import Markdown
3
+
4
+ from prompt_toolkit import prompt
5
+ from prompt_toolkit .formatted_text import merge_formatted_text
6
+ from prompt_toolkit .formatted_text .rich import Rich
7
+
8
+ # For the header, we wrap the `Markdown` object from `rich` in a `Rich` object
9
+ # from `prompt_toolkit`, so that we can explicitly set a width.
10
+ header = Rich (
11
+ Markdown (
12
+ """
13
+ # Type the name of the following function:
14
+
15
+ ```python
16
+ def fibonacci(number: int) -> int:
17
+ "compute Fibonacci number"
18
+ ```
19
+
20
+ """
21
+ ),
22
+ width = 50 ,
23
+ )
24
+
25
+
26
+ def main ():
27
+ answer = prompt (merge_formatted_text ([header , "> " ]))
28
+ print (f"You said: { answer } " )
29
+
30
+
31
+ if __name__ == "__main__" :
32
+ main ()
Original file line number Diff line number Diff line change
1
+ #!/usr/bin/env python
2
+ from rich .text import Text
3
+
4
+ from prompt_toolkit import prompt
5
+
6
+
7
+ def main ():
8
+ answer = prompt (Text .from_markup ("[green]Say[/green] [b]something[/b] > " ))
9
+ print (f"You said: { answer } " )
10
+
11
+
12
+ if __name__ == "__main__" :
13
+ main ()
Original file line number Diff line number Diff line change 26
26
)
27
27
from .html import HTML
28
28
from .pygments import PygmentsTokens
29
+ from .rich import Rich
29
30
from .utils import (
30
31
fragment_list_len ,
31
32
fragment_list_to_text ,
50
51
"ANSI" ,
51
52
# Pygments.
52
53
"PygmentsTokens" ,
54
+ # Rich.
55
+ "Rich" ,
53
56
# Utils.
54
57
"fragment_list_len" ,
55
58
"fragment_list_width" ,
Original file line number Diff line number Diff line change @@ -40,10 +40,19 @@ class MagicFormattedText(Protocol):
40
40
41
41
def __pt_formatted_text__ (self ) -> StyleAndTextTuples : ...
42
42
43
+ class RichFormattedText (Protocol ):
44
+ """
45
+ Any rich text object from the rich library that implements
46
+ ``__rich_console__``.
47
+ """
48
+
49
+ def __rich_console__ (self , console : Any = ..., options : Any = ...) -> Any : ...
50
+
43
51
44
52
AnyFormattedText = Union [
45
53
str ,
46
54
"MagicFormattedText" ,
55
+ "RichFormattedText" ,
47
56
StyleAndTextTuples ,
48
57
# Callable[[], 'AnyFormattedText'] # Recursive definition not supported by mypy.
49
58
Callable [[], Any ],
@@ -78,6 +87,10 @@ def to_formatted_text(
78
87
result = value # StyleAndTextTuples
79
88
elif hasattr (value , "__pt_formatted_text__" ):
80
89
result = cast ("MagicFormattedText" , value ).__pt_formatted_text__ ()
90
+ elif hasattr (value , "__rich_console__" ):
91
+ from .rich import Rich
92
+
93
+ result = Rich (value ).__pt_formatted_text__ ()
81
94
elif callable (value ):
82
95
return to_formatted_text (value (), style = style )
83
96
elif auto_convert :
Original file line number Diff line number Diff line change
1
+ from __future__ import annotations
2
+
3
+ from io import StringIO
4
+ from typing import TYPE_CHECKING , Any
5
+
6
+ from .ansi import ANSI
7
+ from .base import StyleAndTextTuples
8
+
9
+ if TYPE_CHECKING :
10
+ from rich .style import StyleType
11
+
12
+ __all__ = [
13
+ "Rich" ,
14
+ ]
15
+
16
+
17
+ class Rich :
18
+ """
19
+ Turn any rich text object from the `rich` library into prompt_toolkit
20
+ formatted text, so that it can be used in a prompt or anywhere else.
21
+
22
+ Note that `to_formatted_text` automatically recognizes objects that have a
23
+ `__rich_console__` attribute and will wrap them in a `Rich` instance.
24
+ """
25
+
26
+ def __init__ (
27
+ self ,
28
+ rich_object : Any ,
29
+ width : int = None ,
30
+ style : StyleType | None = None ,
31
+ ) -> None :
32
+ self .rich_object = rich_object
33
+ self .width = width
34
+ self .style = style
35
+
36
+ def __pt_formatted_text__ (self ) -> StyleAndTextTuples :
37
+ from rich .console import Console
38
+
39
+ file = StringIO ()
40
+
41
+ console = Console (
42
+ file = file ,
43
+ force_terminal = True ,
44
+ color_system = "truecolor" ,
45
+ width = self .width ,
46
+ style = self .style ,
47
+ )
48
+ console .print (self .rich_object , end = "" )
49
+ ansi = file .getvalue ()
50
+ return ANSI (ansi ).__pt_formatted_text__ ()
You can’t perform that action at this time.
0 commit comments