Spaces:
Runtime error
Runtime error
from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union | |
if TYPE_CHECKING: | |
from .console import ( | |
Console, | |
ConsoleOptions, | |
RenderableType, | |
RenderResult, | |
) | |
from .jupyter import JupyterMixin | |
from .measure import Measurement | |
from .style import Style | |
from .segment import Segment | |
PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]] | |
class Padding(JupyterMixin): | |
"""Draw space around content. | |
Example: | |
>>> print(Padding("Hello", (2, 4), style="on blue")) | |
Args: | |
renderable (RenderableType): String or other renderable. | |
pad (Union[int, Tuple[int]]): Padding for top, right, bottom, and left borders. | |
May be specified with 1, 2, or 4 integers (CSS style). | |
style (Union[str, Style], optional): Style for padding characters. Defaults to "none". | |
expand (bool, optional): Expand padding to fit available width. Defaults to True. | |
""" | |
def __init__( | |
self, | |
renderable: "RenderableType", | |
pad: "PaddingDimensions" = (0, 0, 0, 0), | |
*, | |
style: Union[str, Style] = "none", | |
expand: bool = True, | |
): | |
self.renderable = renderable | |
self.top, self.right, self.bottom, self.left = self.unpack(pad) | |
self.style = style | |
self.expand = expand | |
def indent(cls, renderable: "RenderableType", level: int) -> "Padding": | |
"""Make padding instance to render an indent. | |
Args: | |
renderable (RenderableType): String or other renderable. | |
level (int): Number of characters to indent. | |
Returns: | |
Padding: A Padding instance. | |
""" | |
return Padding(renderable, pad=(0, 0, 0, level), expand=False) | |
def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]: | |
"""Unpack padding specified in CSS style.""" | |
if isinstance(pad, int): | |
return (pad, pad, pad, pad) | |
if len(pad) == 1: | |
_pad = pad[0] | |
return (_pad, _pad, _pad, _pad) | |
if len(pad) == 2: | |
pad_top, pad_right = cast(Tuple[int, int], pad) | |
return (pad_top, pad_right, pad_top, pad_right) | |
if len(pad) == 4: | |
top, right, bottom, left = cast(Tuple[int, int, int, int], pad) | |
return (top, right, bottom, left) | |
raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given") | |
def __repr__(self) -> str: | |
return f"Padding({self.renderable!r}, ({self.top},{self.right},{self.bottom},{self.left}))" | |
def __rich_console__( | |
self, console: "Console", options: "ConsoleOptions" | |
) -> "RenderResult": | |
style = console.get_style(self.style) | |
if self.expand: | |
width = options.max_width | |
else: | |
width = min( | |
Measurement.get(console, options, self.renderable).maximum | |
+ self.left | |
+ self.right, | |
options.max_width, | |
) | |
render_options = options.update_width(width - self.left - self.right) | |
if render_options.height is not None: | |
render_options = render_options.update_height( | |
height=render_options.height - self.top - self.bottom | |
) | |
lines = console.render_lines( | |
self.renderable, render_options, style=style, pad=True | |
) | |
_Segment = Segment | |
left = _Segment(" " * self.left, style) if self.left else None | |
right = ( | |
[_Segment(f'{" " * self.right}', style), _Segment.line()] | |
if self.right | |
else [_Segment.line()] | |
) | |
blank_line: Optional[List[Segment]] = None | |
if self.top: | |
blank_line = [_Segment(f'{" " * width}\n', style)] | |
yield from blank_line * self.top | |
if left: | |
for line in lines: | |
yield left | |
yield from line | |
yield from right | |
else: | |
for line in lines: | |
yield from line | |
yield from right | |
if self.bottom: | |
blank_line = blank_line or [_Segment(f'{" " * width}\n', style)] | |
yield from blank_line * self.bottom | |
def __rich_measure__( | |
self, console: "Console", options: "ConsoleOptions" | |
) -> "Measurement": | |
max_width = options.max_width | |
extra_width = self.left + self.right | |
if max_width - extra_width < 1: | |
return Measurement(max_width, max_width) | |
measure_min, measure_max = Measurement.get(console, options, self.renderable) | |
measurement = Measurement(measure_min + extra_width, measure_max + extra_width) | |
measurement = measurement.with_maximum(max_width) | |
return measurement | |
if __name__ == "__main__": # pragma: no cover | |
from pip._vendor.rich import print | |
print(Padding("Hello, World", (2, 4), style="on blue")) | |