|
1 | | -from typing import Iterable, List, TYPE_CHECKING |
| 1 | +from typing import Iterable, List |
2 | 2 |
|
3 | 3 | from . import get_console |
4 | 4 | from .segment import Segment |
5 | 5 | from .terminal_theme import DEFAULT_TERMINAL_THEME |
6 | 6 |
|
7 | | -if TYPE_CHECKING: |
8 | | - from .console import RenderableType |
9 | 7 |
|
10 | 8 | JUPYTER_HTML_FORMAT = """\ |
11 | 9 | <pre style="white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace">{code}</pre> |
|
15 | 13 | class JupyterRenderable: |
16 | 14 | """A shim to write html to Jupyter notebook.""" |
17 | 15 |
|
18 | | - def __init__(self, html: str) -> None: |
| 16 | + def __init__(self, html: str, text: str) -> None: |
19 | 17 | self.html = html |
| 18 | + self.text = text |
20 | 19 |
|
21 | | - @classmethod |
22 | | - def render(cls, rich_renderable: "RenderableType") -> str: |
23 | | - console = get_console() |
24 | | - segments = console.render(rich_renderable, console.options) |
25 | | - html = _render_segments(segments) |
26 | | - return html |
27 | | - |
28 | | - def _repr_html_(self) -> str: |
29 | | - return self.html |
| 20 | + def _repr_mimebundle_(self, include, exclude, **kwargs): |
| 21 | + data = {"text/plain": self.text, "text/html": self.html} |
| 22 | + if include: |
| 23 | + data = {k: v for (k, v) in data.items() if k in include} |
| 24 | + if exclude: |
| 25 | + data = {k: v for (k, v) in data.items() if k not in exclude} |
| 26 | + return data |
30 | 27 |
|
31 | 28 |
|
32 | 29 | class JupyterMixin: |
33 | 30 | """Add to an Rich renderable to make it render in Jupyter notebook.""" |
34 | 31 |
|
35 | | - def _repr_html_(self) -> str: |
| 32 | + def _repr_mimebundle_(self, include, exclude, **kwargs): |
36 | 33 | console = get_console() |
37 | 34 | segments = list(console.render(self, console.options)) # type: ignore |
38 | 35 | html = _render_segments(segments) |
39 | | - return html |
| 36 | + text = console._render_buffer(segments) |
| 37 | + data = {"text/plain": text, "text/html": html} |
| 38 | + if include: |
| 39 | + data = {k: v for (k, v) in data.items() if k in include} |
| 40 | + if exclude: |
| 41 | + data = {k: v for (k, v) in data.items() if k not in exclude} |
| 42 | + return data |
40 | 43 |
|
41 | 44 |
|
42 | 45 | def _render_segments(segments: Iterable[Segment]) -> str: |
@@ -64,12 +67,12 @@ def escape(text: str) -> str: |
64 | 67 | return html |
65 | 68 |
|
66 | 69 |
|
67 | | -def display(segments: Iterable[Segment]) -> None: |
| 70 | +def display(segments: Iterable[Segment], text: str) -> None: |
68 | 71 | """Render segments to Jupyter.""" |
69 | 72 | from IPython.display import display as ipython_display |
70 | 73 |
|
71 | 74 | html = _render_segments(segments) |
72 | | - jupyter_renderable = JupyterRenderable(html) |
| 75 | + jupyter_renderable = JupyterRenderable(html, text) |
73 | 76 | ipython_display(jupyter_renderable) |
74 | 77 |
|
75 | 78 |
|
|
0 commit comments