__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
from typing import TYPE_CHECKING, Optional
from .align import AlignMethod
from .box import ROUNDED, Box
from .cells import cell_len
from .jupyter import JupyterMixin
from .measure import Measurement, measure_renderables
from .padding import Padding, PaddingDimensions
from .segment import Segment
from .style import Style, StyleType
from .text import Text, TextType
if TYPE_CHECKING:
from .console import Console, ConsoleOptions, RenderableType, RenderResult
class Panel(JupyterMixin):
"""A console renderable that draws a border around its contents.
Example:
>>> console.print(Panel("Hello, World!"))
Args:
renderable (RenderableType): A console renderable object.
box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`.
Defaults to box.ROUNDED.
safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
expand (bool, optional): If True the panel will stretch to fill the console
width, otherwise it will be sized to fit the contents. Defaults to True.
style (str, optional): The style of the panel (border and contents). Defaults to "none".
border_style (str, optional): The style of the border. Defaults to "none".
width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect.
height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect.
padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0.
highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False.
"""
def __init__(
self,
renderable: "RenderableType",
box: Box = ROUNDED,
*,
title: Optional[TextType] = None,
title_align: AlignMethod = "center",
subtitle: Optional[TextType] = None,
subtitle_align: AlignMethod = "center",
safe_box: Optional[bool] = None,
expand: bool = True,
style: StyleType = "none",
border_style: StyleType = "none",
width: Optional[int] = None,
height: Optional[int] = None,
padding: PaddingDimensions = (0, 1),
highlight: bool = False,
) -> None:
self.renderable = renderable
self.box = box
self.title = title
self.title_align: AlignMethod = title_align
self.subtitle = subtitle
self.subtitle_align = subtitle_align
self.safe_box = safe_box
self.expand = expand
self.style = style
self.border_style = border_style
self.width = width
self.height = height
self.padding = padding
self.highlight = highlight
@classmethod
def fit(
cls,
renderable: "RenderableType",
box: Box = ROUNDED,
*,
title: Optional[TextType] = None,
title_align: AlignMethod = "center",
subtitle: Optional[TextType] = None,
subtitle_align: AlignMethod = "center",
safe_box: Optional[bool] = None,
style: StyleType = "none",
border_style: StyleType = "none",
width: Optional[int] = None,
height: Optional[int] = None,
padding: PaddingDimensions = (0, 1),
highlight: bool = False,
) -> "Panel":
"""An alternative constructor that sets expand=False."""
return cls(
renderable,
box,
title=title,
title_align=title_align,
subtitle=subtitle,
subtitle_align=subtitle_align,
safe_box=safe_box,
style=style,
border_style=border_style,
width=width,
height=height,
padding=padding,
highlight=highlight,
expand=False,
)
@property
def _title(self) -> Optional[Text]:
if self.title:
title_text = (
Text.from_markup(self.title)
if isinstance(self.title, str)
else self.title.copy()
)
title_text.end = ""
title_text.plain = title_text.plain.replace("\n", " ")
title_text.no_wrap = True
title_text.expand_tabs()
title_text.pad(1)
return title_text
return None
@property
def _subtitle(self) -> Optional[Text]:
if self.subtitle:
subtitle_text = (
Text.from_markup(self.subtitle)
if isinstance(self.subtitle, str)
else self.subtitle.copy()
)
subtitle_text.end = ""
subtitle_text.plain = subtitle_text.plain.replace("\n", " ")
subtitle_text.no_wrap = True
subtitle_text.expand_tabs()
subtitle_text.pad(1)
return subtitle_text
return None
def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> "RenderResult":
_padding = Padding.unpack(self.padding)
renderable = (
Padding(self.renderable, _padding) if any(_padding) else self.renderable
)
style = console.get_style(self.style)
border_style = style + console.get_style(self.border_style)
width = (
options.max_width
if self.width is None
else min(options.max_width, self.width)
)
safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box
box = self.box.substitute(options, safe=safe_box)
def align_text(
text: Text, width: int, align: str, character: str, style: Style
) -> Text:
"""Gets new aligned text.
Args:
text (Text): Title or subtitle text.
width (int): Desired width.
align (str): Alignment.
character (str): Character for alignment.
style (Style): Border style
Returns:
Text: New text instance
"""
text = text.copy()
text.truncate(width)
excess_space = width - cell_len(text.plain)
if excess_space:
if align == "left":
return Text.assemble(
text,
(character * excess_space, style),
no_wrap=True,
end="",
)
elif align == "center":
left = excess_space // 2
return Text.assemble(
(character * left, style),
text,
(character * (excess_space - left), style),
no_wrap=True,
end="",
)
else:
return Text.assemble(
(character * excess_space, style),
text,
no_wrap=True,
end="",
)
return text
title_text = self._title
if title_text is not None:
title_text.stylize_before(border_style)
child_width = (
width - 2
if self.expand
else console.measure(
renderable, options=options.update_width(width - 2)
).maximum
)
child_height = self.height or options.height or None
if child_height:
child_height -= 2
if title_text is not None:
child_width = min(
options.max_width - 2, max(child_width, title_text.cell_len + 2)
)
width = child_width + 2
child_options = options.update(
width=child_width, height=child_height, highlight=self.highlight
)
lines = console.render_lines(renderable, child_options, style=style)
line_start = Segment(box.mid_left, border_style)
line_end = Segment(f"{box.mid_right}", border_style)
new_line = Segment.line()
if title_text is None or width <= 4:
yield Segment(box.get_top([width - 2]), border_style)
else:
title_text = align_text(
title_text,
width - 4,
self.title_align,
box.top,
border_style,
)
yield Segment(box.top_left + box.top, border_style)
yield from console.render(title_text, child_options.update_width(width - 4))
yield Segment(box.top + box.top_right, border_style)
yield new_line
for line in lines:
yield line_start
yield from line
yield line_end
yield new_line
subtitle_text = self._subtitle
if subtitle_text is not None:
subtitle_text.stylize_before(border_style)
if subtitle_text is None or width <= 4:
yield Segment(box.get_bottom([width - 2]), border_style)
else:
subtitle_text = align_text(
subtitle_text,
width - 4,
self.subtitle_align,
box.bottom,
border_style,
)
yield Segment(box.bottom_left + box.bottom, border_style)
yield from console.render(
subtitle_text, child_options.update_width(width - 4)
)
yield Segment(box.bottom + box.bottom_right, border_style)
yield new_line
def __rich_measure__(
self, console: "Console", options: "ConsoleOptions"
) -> "Measurement":
_title = self._title
_, right, _, left = Padding.unpack(self.padding)
padding = left + right
renderables = [self.renderable, _title] if _title else [self.renderable]
if self.width is None:
width = (
measure_renderables(
console,
options.update_width(options.max_width - padding - 2),
renderables,
).maximum
+ padding
+ 2
)
else:
width = self.width
return Measurement(width, width)
if __name__ == "__main__": # pragma: no cover
from .console import Console
c = Console()
from .box import DOUBLE, ROUNDED
from .padding import Padding
p = Panel(
"Hello, World!",
title="rich.Panel",
style="white on blue",
box=DOUBLE,
padding=1,
)
c.print()
c.print(p)
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| __init__.py | File | 5.92 KB | 0644 |
|
| __main__.py | File | 8.14 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 | 241 B | 0644 |
|
| _fileno.py | File | 799 B | 0644 |
|
| _inspect.py | File | 9.47 KB | 0644 |
|
| _log_render.py | File | 3.14 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.33 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.25 KB | 0644 |
|
| _windows.py | File | 1.86 KB | 0644 |
|
| _windows_renderer.py | File | 2.69 KB | 0644 |
|
| _wrap.py | File | 3.32 KB | 0644 |
|
| abc.py | File | 878 B | 0644 |
|
| align.py | File | 10.08 KB | 0644 |
|
| ansi.py | File | 6.74 KB | 0644 |
|
| bar.py | File | 3.19 KB | 0644 |
|
| box.py | File | 10.53 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.78 KB | 0644 |
|
| constrain.py | File | 1.26 KB | 0644 |
|
| containers.py | File | 5.37 KB | 0644 |
|
| control.py | File | 6.45 KB | 0644 |
|
| default_styles.py | File | 7.86 KB | 0644 |
|
| diagnose.py | File | 924 B | 0644 |
|
| emoji.py | File | 2.41 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.9 KB | 0644 |
|
| jupyter.py | File | 3.15 KB | 0644 |
|
| layout.py | File | 13.62 KB | 0644 |
|
| live.py | File | 13.94 KB | 0644 |
|
| live_render.py | File | 3.57 KB | 0644 |
|
| logging.py | File | 11.61 KB | 0644 |
|
| markdown.py | File | 25.55 KB | 0644 |
|
| markup.py | File | 8.23 KB | 0644 |
|
| measure.py | File | 5.18 KB | 0644 |
|
| padding.py | File | 4.84 KB | 0644 |
|
| pager.py | File | 828 B | 0644 |
|
| palette.py | File | 3.21 KB | 0644 |
|
| panel.py | File | 10.45 KB | 0644 |
|
| pretty.py | File | 34.97 KB | 0644 |
|
| progress.py | File | 58.3 KB | 0644 |
|
| progress_bar.py | File | 7.97 KB | 0644 |
|
| prompt.py | File | 11.03 KB | 0644 |
|
| protocol.py | File | 1.33 KB | 0644 |
|
| py.typed | File | 0 B | 0644 |
|
| region.py | File | 166 B | 0644 |
|
| repr.py | File | 4.32 KB | 0644 |
|
| rule.py | File | 4.48 KB | 0644 |
|
| scope.py | File | 2.76 KB | 0644 |
|
| screen.py | File | 1.54 KB | 0644 |
|
| segment.py | File | 23.64 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.21 KB | 0644 |
|
| syntax.py | File | 34.54 KB | 0644 |
|
| table.py | File | 38.71 KB | 0644 |
|
| terminal_theme.py | File | 3.29 KB | 0644 |
|
| text.py | File | 46.19 KB | 0644 |
|
| theme.py | File | 3.69 KB | 0644 |
|
| themes.py | File | 102 B | 0644 |
|
| traceback.py | File | 28.84 KB | 0644 |
|
| tree.py | File | 8.89 KB | 0644 |
|