__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
import sys
from typing import TYPE_CHECKING, Iterable, List
if sys.version_info >= (3, 8):
from typing import Literal
else:
from pip._vendor.typing_extensions import Literal # pragma: no cover
from ._loop import loop_last
if TYPE_CHECKING:
from pip._vendor.rich.console import ConsoleOptions
class Box:
"""Defines characters to render boxes.
┌─┬┐ top
│ ││ head
├─┼┤ head_row
│ ││ mid
├─┼┤ row
├─┼┤ foot_row
│ ││ foot
└─┴┘ bottom
Args:
box (str): Characters making up box.
ascii (bool, optional): True if this box uses ascii characters only. Default is False.
"""
def __init__(self, box: str, *, ascii: bool = False) -> None:
self._box = box
self.ascii = ascii
line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines()
# top
self.top_left, self.top, self.top_divider, self.top_right = iter(line1)
# head
self.head_left, _, self.head_vertical, self.head_right = iter(line2)
# head_row
(
self.head_row_left,
self.head_row_horizontal,
self.head_row_cross,
self.head_row_right,
) = iter(line3)
# mid
self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)
# row
self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5)
# foot_row
(
self.foot_row_left,
self.foot_row_horizontal,
self.foot_row_cross,
self.foot_row_right,
) = iter(line6)
# foot
self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7)
# bottom
self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter(
line8
)
def __repr__(self) -> str:
return "Box(...)"
def __str__(self) -> str:
return self._box
def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box":
"""Substitute this box for another if it won't render due to platform issues.
Args:
options (ConsoleOptions): Console options used in rendering.
safe (bool, optional): Substitute this for another Box if there are known problems
displaying on the platform (currently only relevant on Windows). Default is True.
Returns:
Box: A different Box or the same Box.
"""
box = self
if options.legacy_windows and safe:
box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box)
if options.ascii_only and not box.ascii:
box = ASCII
return box
def get_top(self, widths: Iterable[int]) -> str:
"""Get the top of a simple box.
Args:
widths (List[int]): Widths of columns.
Returns:
str: A string of box characters.
"""
parts: List[str] = []
append = parts.append
append(self.top_left)
for last, width in loop_last(widths):
append(self.top * width)
if not last:
append(self.top_divider)
append(self.top_right)
return "".join(parts)
def get_row(
self,
widths: Iterable[int],
level: Literal["head", "row", "foot", "mid"] = "row",
edge: bool = True,
) -> str:
"""Get the top of a simple box.
Args:
width (List[int]): Widths of columns.
Returns:
str: A string of box characters.
"""
if level == "head":
left = self.head_row_left
horizontal = self.head_row_horizontal
cross = self.head_row_cross
right = self.head_row_right
elif level == "row":
left = self.row_left
horizontal = self.row_horizontal
cross = self.row_cross
right = self.row_right
elif level == "mid":
left = self.mid_left
horizontal = " "
cross = self.mid_vertical
right = self.mid_right
elif level == "foot":
left = self.foot_row_left
horizontal = self.foot_row_horizontal
cross = self.foot_row_cross
right = self.foot_row_right
else:
raise ValueError("level must be 'head', 'row' or 'foot'")
parts: List[str] = []
append = parts.append
if edge:
append(left)
for last, width in loop_last(widths):
append(horizontal * width)
if not last:
append(cross)
if edge:
append(right)
return "".join(parts)
def get_bottom(self, widths: Iterable[int]) -> str:
"""Get the bottom of a simple box.
Args:
widths (List[int]): Widths of columns.
Returns:
str: A string of box characters.
"""
parts: List[str] = []
append = parts.append
append(self.bottom_left)
for last, width in loop_last(widths):
append(self.bottom * width)
if not last:
append(self.bottom_divider)
append(self.bottom_right)
return "".join(parts)
ASCII: Box = Box(
"""\
+--+
| ||
|-+|
| ||
|-+|
|-+|
| ||
+--+
""",
ascii=True,
)
ASCII2: Box = Box(
"""\
+-++
| ||
+-++
| ||
+-++
+-++
| ||
+-++
""",
ascii=True,
)
ASCII_DOUBLE_HEAD: Box = Box(
"""\
+-++
| ||
+=++
| ||
+-++
+-++
| ||
+-++
""",
ascii=True,
)
SQUARE: Box = Box(
"""\
┌─┬┐
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
)
SQUARE_DOUBLE_HEAD: Box = Box(
"""\
┌─┬┐
│ ││
╞═╪╡
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
)
MINIMAL: Box = Box(
"""\
╷
│
╶─┼╴
│
╶─┼╴
╶─┼╴
│
╵
"""
)
MINIMAL_HEAVY_HEAD: Box = Box(
"""\
╷
│
╺━┿╸
│
╶─┼╴
╶─┼╴
│
╵
"""
)
MINIMAL_DOUBLE_HEAD: Box = Box(
"""\
╷
│
═╪
│
─┼
─┼
│
╵
"""
)
SIMPLE: Box = Box(
"""\
──
──
"""
)
SIMPLE_HEAD: Box = Box(
"""\
──
"""
)
SIMPLE_HEAVY: Box = Box(
"""\
━━
━━
"""
)
HORIZONTALS: Box = Box(
"""\
──
──
──
──
──
"""
)
ROUNDED: Box = Box(
"""\
╭─┬╮
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
╰─┴╯
"""
)
HEAVY: Box = Box(
"""\
┏━┳┓
┃ ┃┃
┣━╋┫
┃ ┃┃
┣━╋┫
┣━╋┫
┃ ┃┃
┗━┻┛
"""
)
HEAVY_EDGE: Box = Box(
"""\
┏━┯┓
┃ │┃
┠─┼┨
┃ │┃
┠─┼┨
┠─┼┨
┃ │┃
┗━┷┛
"""
)
HEAVY_HEAD: Box = Box(
"""\
┏━┳┓
┃ ┃┃
┡━╇┩
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
)
DOUBLE: Box = Box(
"""\
╔═╦╗
║ ║║
╠═╬╣
║ ║║
╠═╬╣
╠═╬╣
║ ║║
╚═╩╝
"""
)
DOUBLE_EDGE: Box = Box(
"""\
╔═╤╗
║ │║
╟─┼╢
║ │║
╟─┼╢
╟─┼╢
║ │║
╚═╧╝
"""
)
# Map Boxes that don't render with raster fonts on to equivalent that do
LEGACY_WINDOWS_SUBSTITUTIONS = {
ROUNDED: SQUARE,
MINIMAL_HEAVY_HEAD: MINIMAL,
SIMPLE_HEAVY: SIMPLE,
HEAVY: SQUARE,
HEAVY_EDGE: SQUARE,
HEAVY_HEAD: SQUARE,
}
if __name__ == "__main__": # pragma: no cover
from pip._vendor.rich.columns import Columns
from pip._vendor.rich.panel import Panel
from . import box as box
from .console import Console
from .table import Table
from .text import Text
console = Console(record=True)
BOXES = [
"ASCII",
"ASCII2",
"ASCII_DOUBLE_HEAD",
"SQUARE",
"SQUARE_DOUBLE_HEAD",
"MINIMAL",
"MINIMAL_HEAVY_HEAD",
"MINIMAL_DOUBLE_HEAD",
"SIMPLE",
"SIMPLE_HEAD",
"SIMPLE_HEAVY",
"HORIZONTALS",
"ROUNDED",
"HEAVY",
"HEAVY_EDGE",
"HEAVY_HEAD",
"DOUBLE",
"DOUBLE_EDGE",
]
console.print(Panel("[bold green]Box Constants", style="green"), justify="center")
console.print()
columns = Columns(expand=True, padding=2)
for box_name in sorted(BOXES):
table = Table(
show_footer=True, style="dim", border_style="not dim", expand=True
)
table.add_column("Header 1", "Footer 1")
table.add_column("Header 2", "Footer 2")
table.add_row("Cell", "Cell")
table.add_row("Cell", "Cell")
table.box = getattr(box, box_name)
table.title = Text(f"box.{box_name}", style="magenta")
columns.add_renderable(table)
console.print(columns)
# console.save_html("box.html", inline_styles=True)
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __init__.py | File | 5.67 KB | 0644 |
|
| __main__.py | File | 8.6 KB | 0644 |
|
| _cell_widths.py | File | 9.86 KB | 0644 |
|
| _emoji_codes.py | File | 136.95 KB | 0644 |
|
| _emoji_replace.py | File | 1.04 KB | 0644 |
|
| _extension.py | File | 265 B | 0644 |
|
| _inspect.py | File | 7.27 KB | 0644 |
|
| _log_render.py | File | 3.15 KB | 0644 |
|
| _loop.py | File | 1.21 KB | 0644 |
|
| _lru_cache.py | File | 1.22 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 | 25.9 KB | 0644 |
|
| _stack.py | File | 351 B | 0644 |
|
| _timer.py | File | 417 B | 0644 |
|
| _windows.py | File | 2.02 KB | 0644 |
|
| _wrap.py | File | 1.76 KB | 0644 |
|
| abc.py | File | 890 B | 0644 |
|
| align.py | File | 10.18 KB | 0644 |
|
| ansi.py | File | 6.52 KB | 0644 |
|
| bar.py | File | 3.19 KB | 0644 |
|
| box.py | File | 8.86 KB | 0644 |
|
| cells.py | File | 4.18 KB | 0644 |
|
| color.py | File | 16.88 KB | 0644 |
|
| color_triplet.py | File | 1.03 KB | 0644 |
|
| columns.py | File | 6.96 KB | 0644 |
|
| console.py | File | 79.33 KB | 0644 |
|
| constrain.py | File | 1.26 KB | 0644 |
|
| containers.py | File | 5.37 KB | 0644 |
|
| control.py | File | 5.17 KB | 0644 |
|
| default_styles.py | File | 7.44 KB | 0644 |
|
| diagnose.py | File | 183 B | 0644 |
|
| emoji.py | File | 2.44 KB | 0644 |
|
| errors.py | File | 642 B | 0644 |
|
| file_proxy.py | File | 1.58 KB | 0644 |
|
| filesize.py | File | 2.45 KB | 0644 |
|
| highlighter.py | File | 4.78 KB | 0644 |
|
| json.py | File | 4.93 KB | 0644 |
|
| jupyter.py | File | 2.95 KB | 0644 |
|
| layout.py | File | 13.72 KB | 0644 |
|
| live.py | File | 13.39 KB | 0644 |
|
| live_render.py | File | 3.58 KB | 0644 |
|
| logging.py | File | 10.61 KB | 0644 |
|
| markup.py | File | 7.87 KB | 0644 |
|
| measure.py | File | 5.13 KB | 0644 |
|
| padding.py | File | 4.85 KB | 0644 |
|
| pager.py | File | 838 B | 0644 |
|
| palette.py | File | 3.32 KB | 0644 |
|
| panel.py | File | 8.43 KB | 0644 |
|
| pretty.py | File | 31.81 KB | 0644 |
|
| progress.py | File | 35.08 KB | 0644 |
|
| progress_bar.py | File | 7.58 KB | 0644 |
|
| prompt.py | File | 11.04 KB | 0644 |
|
| protocol.py | File | 1.37 KB | 0644 |
|
| region.py | File | 166 B | 0644 |
|
| repr.py | File | 4.21 KB | 0644 |
|
| rule.py | File | 4.1 KB | 0644 |
|
| scope.py | File | 2.78 KB | 0644 |
|
| screen.py | File | 1.55 KB | 0644 |
|
| segment.py | File | 23.36 KB | 0644 |
|
| spinner.py | File | 4.21 KB | 0644 |
|
| status.py | File | 4.32 KB | 0644 |
|
| style.py | File | 25.85 KB | 0644 |
|
| styled.py | File | 1.23 KB | 0644 |
|
| syntax.py | File | 26.36 KB | 0644 |
|
| table.py | File | 35.9 KB | 0644 |
|
| tabulate.py | File | 1.66 KB | 0644 |
|
| terminal_theme.py | File | 1.42 KB | 0644 |
|
| text.py | File | 43.38 KB | 0644 |
|
| theme.py | File | 3.54 KB | 0644 |
|
| themes.py | File | 102 B | 0644 |
|
| traceback.py | File | 25.33 KB | 0644 |
|
| tree.py | File | 8.91 KB | 0644 |
|