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 @classmethod 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) @staticmethod 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"))
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 5.95 KB | 0644 |
|
__main__.py | File | 8.28 KB | 0644 |
|
_cell_widths.py | File | 9.97 KB | 0644 |
|
_emoji_codes.py | File | 136.95 KB | 0644 |
|
_emoji_replace.py | File | 1.04 KB | 0644 |
|
_export_format.py | File | 2.08 KB | 0644 |
|
_extension.py | File | 265 B | 0644 |
|
_fileno.py | File | 799 B | 0644 |
|
_inspect.py | File | 9.47 KB | 0644 |
|
_log_render.py | File | 3.15 KB | 0644 |
|
_loop.py | File | 1.21 KB | 0644 |
|
_null_file.py | File | 1.35 KB | 0644 |
|
_palettes.py | File | 6.9 KB | 0644 |
|
_pick.py | File | 423 B | 0644 |
|
_ratio.py | File | 5.34 KB | 0644 |
|
_spinners.py | File | 19.45 KB | 0644 |
|
_stack.py | File | 351 B | 0644 |
|
_timer.py | File | 417 B | 0644 |
|
_win32_console.py | File | 22.29 KB | 0644 |
|
_windows.py | File | 1.88 KB | 0644 |
|
_windows_renderer.py | File | 2.72 KB | 0644 |
|
_wrap.py | File | 3.32 KB | 0644 |
|
abc.py | File | 890 B | 0644 |
|
align.py | File | 10.13 KB | 0644 |
|
ansi.py | File | 6.74 KB | 0644 |
|
bar.py | File | 3.19 KB | 0644 |
|
box.py | File | 10.58 KB | 0644 |
|
cells.py | File | 4.67 KB | 0644 |
|
color.py | File | 17.8 KB | 0644 |
|
color_triplet.py | File | 1.03 KB | 0644 |
|
columns.py | File | 6.96 KB | 0644 |
|
console.py | File | 96.85 KB | 0644 |
|
constrain.py | File | 1.26 KB | 0644 |
|
containers.py | File | 5.37 KB | 0644 |
|
control.py | File | 6.47 KB | 0644 |
|
default_styles.py | File | 7.89 KB | 0644 |
|
diagnose.py | File | 972 B | 0644 |
|
emoji.py | File | 2.44 KB | 0644 |
|
errors.py | File | 642 B | 0644 |
|
file_proxy.py | File | 1.64 KB | 0644 |
|
filesize.py | File | 2.45 KB | 0644 |
|
highlighter.py | File | 9.36 KB | 0644 |
|
json.py | File | 4.91 KB | 0644 |
|
jupyter.py | File | 3.18 KB | 0644 |
|
layout.py | File | 13.68 KB | 0644 |
|
live.py | File | 13.94 KB | 0644 |
|
live_render.py | File | 3.58 KB | 0644 |
|
logging.py | File | 11.62 KB | 0644 |
|
markup.py | File | 8.25 KB | 0644 |
|
measure.py | File | 5.18 KB | 0644 |
|
padding.py | File | 4.85 KB | 0644 |
|
pager.py | File | 828 B | 0644 |
|
palette.py | File | 3.32 KB | 0644 |
|
panel.py | File | 10.45 KB | 0644 |
|
pretty.py | File | 35.01 KB | 0644 |
|
progress.py | File | 58.32 KB | 0644 |
|
progress_bar.py | File | 7.97 KB | 0644 |
|
prompt.py | File | 11.04 KB | 0644 |
|
protocol.py | File | 1.36 KB | 0644 |
|
py.typed | File | 0 B | 0644 |
|
region.py | File | 166 B | 0644 |
|
repr.py | File | 4.33 KB | 0644 |
|
rule.py | File | 4.49 KB | 0644 |
|
scope.py | File | 2.78 KB | 0644 |
|
screen.py | File | 1.55 KB | 0644 |
|
segment.py | File | 23.68 KB | 0644 |
|
spinner.py | File | 4.24 KB | 0644 |
|
status.py | File | 4.32 KB | 0644 |
|
style.py | File | 26.44 KB | 0644 |
|
styled.py | File | 1.23 KB | 0644 |
|
syntax.py | File | 34.64 KB | 0644 |
|
table.py | File | 38.75 KB | 0644 |
|
terminal_theme.py | File | 3.29 KB | 0644 |
|
text.py | File | 46.2 KB | 0644 |
|
theme.py | File | 3.69 KB | 0644 |
|
themes.py | File | 102 B | 0644 |
|
traceback.py | File | 28.91 KB | 0644 |
|
tree.py | File | 8.95 KB | 0644 |
|