123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- import colorsys
- import io
- from time import process_time
- from rich import box
- from rich.color import Color
- from rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult
- from rich.markdown import Markdown
- from rich.measure import Measurement
- from rich.pretty import Pretty
- from rich.segment import Segment
- from rich.style import Style
- from rich.syntax import Syntax
- from rich.table import Table
- from rich.text import Text
- class ColorBox:
- def __rich_console__(
- self, console: Console, options: ConsoleOptions
- ) -> RenderResult:
- for y in range(0, 5):
- for x in range(options.max_width):
- h = x / options.max_width
- l = 0.1 + ((y / 5) * 0.7)
- r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0)
- r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0)
- bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255)
- color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255)
- yield Segment("▄", Style(color=color, bgcolor=bgcolor))
- yield Segment.line()
- def __rich_measure__(
- self, console: "Console", options: ConsoleOptions
- ) -> Measurement:
- return Measurement(1, options.max_width)
- def make_test_card() -> Table:
- """Get a renderable that demonstrates a number of features."""
- table = Table.grid(padding=1, pad_edge=True)
- table.title = "Rich features"
- table.add_column("Feature", no_wrap=True, justify="center", style="bold red")
- table.add_column("Demonstration")
- color_table = Table(
- box=None,
- expand=False,
- show_header=False,
- show_edge=False,
- pad_edge=False,
- )
- color_table.add_row(
- (
- "✓ [bold green]4-bit color[/]\n"
- "✓ [bold blue]8-bit color[/]\n"
- "✓ [bold magenta]Truecolor (16.7 million)[/]\n"
- "✓ [bold yellow]Dumb terminals[/]\n"
- "✓ [bold cyan]Automatic color conversion"
- ),
- ColorBox(),
- )
- table.add_row("Colors", color_table)
- table.add_row(
- "Styles",
- "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].",
- )
- lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus."
- lorem_table = Table.grid(padding=1, collapse_padding=True)
- lorem_table.pad_edge = False
- lorem_table.add_row(
- Text(lorem, justify="left", style="green"),
- Text(lorem, justify="center", style="yellow"),
- Text(lorem, justify="right", style="blue"),
- Text(lorem, justify="full", style="red"),
- )
- table.add_row(
- "Text",
- Group(
- Text.from_markup(
- """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n"""
- ),
- lorem_table,
- ),
- )
- def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table:
- table = Table(show_header=False, pad_edge=False, box=None, expand=True)
- table.add_column("1", ratio=1)
- table.add_column("2", ratio=1)
- table.add_row(renderable1, renderable2)
- return table
- table.add_row(
- "Asian\nlanguage\nsupport",
- ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다",
- )
- markup_example = (
- "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! "
- ":+1: :apple: :ant: :bear: :baguette_bread: :bus: "
- )
- table.add_row("Markup", markup_example)
- example_table = Table(
- show_edge=False,
- show_header=True,
- expand=False,
- row_styles=["none", "dim"],
- box=box.SIMPLE,
- )
- example_table.add_column("[green]Date", style="green", no_wrap=True)
- example_table.add_column("[blue]Title", style="blue")
- example_table.add_column(
- "[cyan]Production Budget",
- style="cyan",
- justify="right",
- no_wrap=True,
- )
- example_table.add_column(
- "[magenta]Box Office",
- style="magenta",
- justify="right",
- no_wrap=True,
- )
- example_table.add_row(
- "Dec 20, 2019",
- "Star Wars: The Rise of Skywalker",
- "$275,000,000",
- "$375,126,118",
- )
- example_table.add_row(
- "May 25, 2018",
- "[b]Solo[/]: A Star Wars Story",
- "$275,000,000",
- "$393,151,347",
- )
- example_table.add_row(
- "Dec 15, 2017",
- "Star Wars Ep. VIII: The Last Jedi",
- "$262,000,000",
- "[bold]$1,332,539,889[/bold]",
- )
- example_table.add_row(
- "May 19, 1999",
- "Star Wars Ep. [b]I[/b]: [i]The phantom Menace",
- "$115,000,000",
- "$1,027,044,677",
- )
- table.add_row("Tables", example_table)
- code = '''\
- def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
- """Iterate and generate a tuple with a flag for last value."""
- iter_values = iter(values)
- try:
- previous_value = next(iter_values)
- except StopIteration:
- return
- for value in iter_values:
- yield False, previous_value
- previous_value = value
- yield True, previous_value'''
- pretty_data = {
- "foo": [
- 3.1427,
- (
- "Paul Atreides",
- "Vladimir Harkonnen",
- "Thufir Hawat",
- ),
- ],
- "atomic": (False, True, None),
- }
- table.add_row(
- "Syntax\nhighlighting\n&\npretty\nprinting",
- comparison(
- Syntax(code, "python3", line_numbers=True, indent_guides=True),
- Pretty(pretty_data, indent_guides=True),
- ),
- )
- markdown_example = """\
- # Markdown
- Supports much of the *markdown* __syntax__!
- - Headers
- - Basic formatting: **bold**, *italic*, `code`
- - Block quotes
- - Lists, and more...
- """
- table.add_row(
- "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example))
- )
- table.add_row(
- "+more!",
- """Progress bars, columns, styled logging handler, tracebacks, etc...""",
- )
- return table
- if __name__ == "__main__": # pragma: no cover
- console = Console(
- file=io.StringIO(),
- force_terminal=True,
- )
- test_card = make_test_card()
- # Print once to warm cache
- start = process_time()
- console.print(test_card)
- pre_cache_taken = round((process_time() - start) * 1000.0, 1)
- console.file = io.StringIO()
- start = process_time()
- console.print(test_card)
- taken = round((process_time() - start) * 1000.0, 1)
- c = Console(record=True)
- c.print(test_card)
- print(f"rendered in {pre_cache_taken}ms (cold cache)")
- print(f"rendered in {taken}ms (warm cache)")
- from rich.panel import Panel
- console = Console()
- sponsor_message = Table.grid(padding=1)
- sponsor_message.add_column(style="green", justify="right")
- sponsor_message.add_column(no_wrap=True)
- sponsor_message.add_row(
- "Textualize",
- "[u blue link=https://github.com/textualize]https://github.com/textualize",
- )
- sponsor_message.add_row(
- "Twitter",
- "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan",
- )
- intro_message = Text.from_markup(
- """\
- We hope you enjoy using Rich!
- Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/]
- - Will McGugan"""
- )
- message = Table.grid(padding=2)
- message.add_column()
- message.add_column(no_wrap=True)
- message.add_row(intro_message, sponsor_message)
- console.print(
- Panel.fit(
- message,
- box=box.ROUNDED,
- padding=(1, 2),
- title="[b red]Thanks for trying out Rich!",
- border_style="bright_blue",
- ),
- justify="center",
- )
|