rich
179 строк · 11.0 Кб
1PYTHON_SNIPPET = '''
2def layout_resolve(total: int, edges: Sequence[EdgeProtocol]) -> List[int]:
3"""Divide total space to satisfy size, fraction, and min_size, constraints.
4
5The returned list of integers should add up to total in most cases, unless it is
6impossible to satisfy all the constraints. For instance, if there are two edges
7with a minimum size of 20 each and `total` is 30 then the returned list will be
8greater than total. In practice, this would mean that a Layout object would
9clip the rows that would overflow the screen height.
10
11Args:
12total (int): Total number of characters.
13edges (Sequence[Edge]): Edges within total space.
14
15Returns:
16list[int]: Number of characters for each edge.
17"""
18# Size of edge or None for yet to be determined
19sizes = [(edge.size or None) for edge in edges]
20
21if None not in sizes:
22# No flexible edges
23return cast("list[int]", sizes)
24
25# Get flexible edges and index to map these back on to sizes list
26flexible_edges = [
27(index, edge)
28for index, (size, edge) in enumerate(zip(sizes, edges))
29if size is None
30]
31# Remaining space in total
32remaining = total - sum([size or 0 for size in sizes])
33if remaining <= 0:
34# No room for flexible edges
35return [
36((edge.min_size or 1) if size is None else size)
37for size, edge in zip(sizes, edges)
38]
39
40# Get the total fraction value for all flexible edges
41total_flexible = sum([(edge.fraction or 1) for _, edge in flexible_edges])
42while flexible_edges:
43# Calculate number of characters in a ratio portion
44portion = Fraction(remaining, total_flexible)
45
46# If any edges will be less than their minimum, replace size with the minimum
47for flexible_index, (index, edge) in enumerate(flexible_edges):
48if portion * edge.fraction < edge.min_size:
49# This flexible edge will be smaller than its minimum size
50# We need to fix the size and redistribute the outstanding space
51sizes[index] = edge.min_size
52remaining -= edge.min_size
53total_flexible -= edge.fraction or 1
54del flexible_edges[flexible_index]
55# New fixed size will invalidate calculations, so we need to repeat the process
56break
57else:
58# Distribute flexible space and compensate for rounding error
59# Since edge sizes can only be integers we need to add the remainder
60# to the following line
61remainder = Fraction(0)
62for index, edge in flexible_edges:
63sizes[index], remainder = divmod(portion * edge.fraction + remainder, 1)
64break
65
66# Sizes now contains integers only
67return cast("list[int]", sizes)
68'''
69
70PYTHON_DICT = {
71"glossary": {
72"title": "example glossary",
73"GlossDiv": {
74"title": "S",
75"GlossList": {
76"GlossEntry": {
77"ID": "SGML",
78"SortAs": "SGML",
79"GlossTerm": "Standard Generalized Markup Language",
80"Acronym": "SGML",
81"Abbrev": "ISO 8879:1986",
82"GlossDef": {
83"para": "A meta-markup language, used to create markup languages such as DocBook.",
84"GlossSeeAlso": ["GML", "XML"],
85},
86"GlossSee": "markup",
87}
88},
89},
90}
91}
92
93LOREM_IPSUM = """
94Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Laoreet id donec ultrices tincidunt arcu. Eu facilisis sed odio morbi quis commodo odio aenean sed. Amet cursus sit amet dictum. Gravida rutrum quisque non tellus. Semper auctor neque vitae tempus quam pellentesque nec nam. Mauris sit amet massa vitae tortor condimentum lacinia quis. Adipiscing elit ut aliquam purus sit amet luctus venenatis lectus. Consectetur adipiscing elit ut aliquam purus sit amet. Sit amet mauris commodo quis imperdiet massa tincidunt nunc pulvinar. Dui faucibus in ornare quam viverra. Et netus et malesuada fames ac turpis. A lacus vestibulum sed arcu non odio euismod. In massa tempor nec feugiat nisl pretium fusce.
95
96Tellus in hac habitasse platea dictumst vestibulum. Feugiat nibh sed pulvinar proin. In cursus turpis massa tincidunt dui ut. Fermentum posuere urna nec tincidunt praesent semper feugiat. Interdum consectetur libero id faucibus. Habitant morbi tristique senectus et netus et malesuada fames ac. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Aliquam faucibus purus in massa tempor. Tellus pellentesque eu tincidunt tortor aliquam nulla. Sem et tortor consequat id porta nibh. Massa id neque aliquam vestibulum morbi blandit cursus risus. Ut placerat orci nulla pellentesque dignissim enim. Nibh tellus molestie nunc non blandit massa enim nec dui. Ipsum a arcu cursus vitae congue mauris rhoncus aenean vel. Egestas congue quisque egestas diam in.
97
98Pulvinar mattis nunc sed blandit libero volutpat sed. Accumsan in nisl nisi scelerisque eu. Eget aliquet nibh praesent tristique. Ipsum suspendisse ultrices gravida dictum fusce ut. Non sodales neque sodales ut etiam sit amet. Velit egestas dui id ornare. Massa ultricies mi quis hendrerit dolor magna. Id volutpat lacus laoreet non curabitur gravida arcu. Nulla facilisi cras fermentum odio eu feugiat pretium. Sed vulputate odio ut enim blandit volutpat. Amet massa vitae tortor condimentum lacinia. Tellus integer feugiat scelerisque varius. Quam nulla porttitor massa id. Facilisi cras fermentum odio eu feugiat pretium nibh ipsum. Eget nunc scelerisque viverra mauris in aliquam sem fringilla. Amet nulla facilisi morbi tempus iaculis urna id volutpat lacus. Facilisi etiam dignissim diam quis enim lobortis.
99
100Nullam vehicula ipsum a arcu cursus vitae congue mauris rhoncus. Ullamcorper a lacus vestibulum sed arcu non. Suscipit adipiscing bibendum est ultricies integer quis auctor elit. Integer feugiat scelerisque varius morbi enim. Posuere urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Lobortis feugiat vivamus at augue eget. Rhoncus dolor purus non enim praesent. Mi in nulla posuere sollicitudin aliquam ultrices sagittis orci. Mollis aliquam ut porttitor leo. Id cursus metus aliquam eleifend mi in nulla. Integer eget aliquet nibh praesent tristique magna sit amet. Egestas maecenas pharetra convallis posuere morbi.
101
102Blandit massa enim nec dui. Suscipit tellus mauris a diam maecenas. Sed id semper risus in. Purus faucibus ornare suspendisse sed nisi lacus. At in tellus integer feugiat. Egestas diam in arcu cursus euismod quis viverra nibh cras. Enim tortor at auctor urna nunc id. Tristique nulla aliquet enim tortor at auctor urna nunc id. Purus gravida quis blandit turpis cursus in hac habitasse platea. Ac turpis egestas integer eget. Tortor at auctor urna nunc. Neque aliquam vestibulum morbi blandit cursus. Massa tempor nec feugiat nisl pretium fusce id velit. Interdum consectetur libero id faucibus nisl tincidunt. Adipiscing diam donec adipiscing tristique risus nec feugiat in. Egestas integer eget aliquet nibh praesent tristique magna sit.
103"""
104
105UNICODE_HEAVY_TEXT = """
106Richは、 _リッチ_ なテキストや美しい書式設定をターミナルで行うためのPythonライブラリです。
107
108[Rich API](https://rich.readthedocs.io/en/latest/)を使用すると、ターミナルの出力に色やスタイルを簡単に追加することができます。 Richはきれいなテーブル、プログレスバー、マークダウン、シンタックスハイライトされたソースコード、トレースバックなどをすぐに生成・表示することもできます。
109
110![機能](https://github.com/textualize/rich/raw/master/imgs/features.png)
111
112Richの紹介動画はこちらをご覧ください。 [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88).
113
114[Richについての人々の感想を見る。](https://www.willmcgugan.com/blog/pages/post/rich-tweets/)
115
116## 互換性
117
118RichはLinux、OSX、Windowsに対応しています。True colorと絵文字は新しい Windows ターミナルで動作しますが、古いターミナルでは8色に制限されています。Richを使用するにはPythonのバージョンは3.6.3以降が必要です。
119
120Richは追加の設定を行わずとも、[Jupyter notebooks](https://jupyter.org/)で動作します。
121
122## インストール
123
124`pip` や、あなたのお気に入りのPyPIパッケージマネージャを使ってインストールしてください。
125
126```sh
127python -m pip install rich
128```
129
130以下のコマンドを実行して、ターミナルでリッチの出力をテストできます:
131
132```sh
133python -m rich
134```
135
136## Richのprint関数
137
138簡単にリッチな出力をアプリケーションに追加するには、Pythonの組み込み関数と同じ名前を持つ [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) メソッドをインポートすることで実現できます。こちらを試してみてください:
139
140```python
141from rich import print
142
143print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
144```
145
146![Hello World](https://github.com/textualize/rich/raw/master/imgs/print.png)
147
148## Rich REPL
149
150RichはPythonのREPLでインストールすることができ、データ構造がきれいに表示され、ハイライトされます。
151
152```python
153>>> from rich import pretty
154>>> pretty.install()
155```
156
157![REPL](https://github.com/textualize/rich/raw/master/imgs/repl.png)
158
159## Rich Inspect
160
161RichにはPythonオブジェクトやクラス、インスタンス、組み込み関数などに関するレポートを作成することができる、[inspect関数](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect)があります。
162
163の使い方
164
165リッチなターミナルコンテンツをより制御していくには、[Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) オブジェクトをインポートして構築していきます。
166
167Console オブジェクトには `print` メソッドがあり、これは組み込み関数の `print` と意図的に似たインターフェイスを持っています。
168以下に使用例を示します:
169
170あなたが予想した通り、これは `"Hello World!"` をターミナルに表示します。組み込み関数の `print` とは異なり、Rich はターミナルの幅に合わせてテキストをワードラップすることに注意してください。
171
172出力結果に色やスタイルを追加する方法はいくつかあります。キーワード引数に `style` を追加することで、出力結果全体のスタイルを設定することができます。以下に例を示します:
173"""
174
175
176MARKUP = "\n".join(
177"""[bold]Hello [i]World[/i] [bold magenta]foo [i]bar[/i] baz[/] [blue u]https://textualize.io[/]"""
178for _ in range(20)
179)
180