This commit is contained in:
ton
2024-10-07 10:13:40 +07:00
parent aa1631742f
commit 3a7d696db6
9729 changed files with 1832837 additions and 161742 deletions

View File

@@ -207,7 +207,6 @@ Supports much of the *markdown* __syntax__!
if __name__ == "__main__": # pragma: no cover
console = Console(
file=io.StringIO(),
force_terminal=True,

View File

@@ -4,6 +4,7 @@ CELL_WIDTHS = [
(0, 0, 0),
(1, 31, -1),
(127, 159, -1),
(173, 173, 0),
(768, 879, 0),
(1155, 1161, 0),
(1425, 1469, 0),
@@ -11,13 +12,16 @@ CELL_WIDTHS = [
(1473, 1474, 0),
(1476, 1477, 0),
(1479, 1479, 0),
(1536, 1541, 0),
(1552, 1562, 0),
(1564, 1564, 0),
(1611, 1631, 0),
(1648, 1648, 0),
(1750, 1756, 0),
(1750, 1757, 0),
(1759, 1764, 0),
(1767, 1768, 0),
(1770, 1773, 0),
(1807, 1807, 0),
(1809, 1809, 0),
(1840, 1866, 0),
(1958, 1968, 0),
@@ -28,149 +32,137 @@ CELL_WIDTHS = [
(2085, 2087, 0),
(2089, 2093, 0),
(2137, 2139, 0),
(2259, 2273, 0),
(2275, 2306, 0),
(2362, 2362, 0),
(2364, 2364, 0),
(2369, 2376, 0),
(2381, 2381, 0),
(2192, 2193, 0),
(2200, 2207, 0),
(2250, 2307, 0),
(2362, 2364, 0),
(2366, 2383, 0),
(2385, 2391, 0),
(2402, 2403, 0),
(2433, 2433, 0),
(2433, 2435, 0),
(2492, 2492, 0),
(2497, 2500, 0),
(2509, 2509, 0),
(2494, 2500, 0),
(2503, 2504, 0),
(2507, 2509, 0),
(2519, 2519, 0),
(2530, 2531, 0),
(2558, 2558, 0),
(2561, 2562, 0),
(2561, 2563, 0),
(2620, 2620, 0),
(2625, 2626, 0),
(2622, 2626, 0),
(2631, 2632, 0),
(2635, 2637, 0),
(2641, 2641, 0),
(2672, 2673, 0),
(2677, 2677, 0),
(2689, 2690, 0),
(2689, 2691, 0),
(2748, 2748, 0),
(2753, 2757, 0),
(2759, 2760, 0),
(2765, 2765, 0),
(2750, 2757, 0),
(2759, 2761, 0),
(2763, 2765, 0),
(2786, 2787, 0),
(2810, 2815, 0),
(2817, 2817, 0),
(2817, 2819, 0),
(2876, 2876, 0),
(2879, 2879, 0),
(2881, 2884, 0),
(2893, 2893, 0),
(2901, 2902, 0),
(2878, 2884, 0),
(2887, 2888, 0),
(2891, 2893, 0),
(2901, 2903, 0),
(2914, 2915, 0),
(2946, 2946, 0),
(3008, 3008, 0),
(3021, 3021, 0),
(3072, 3072, 0),
(3076, 3076, 0),
(3134, 3136, 0),
(3006, 3010, 0),
(3014, 3016, 0),
(3018, 3021, 0),
(3031, 3031, 0),
(3072, 3076, 0),
(3132, 3132, 0),
(3134, 3140, 0),
(3142, 3144, 0),
(3146, 3149, 0),
(3157, 3158, 0),
(3170, 3171, 0),
(3201, 3201, 0),
(3201, 3203, 0),
(3260, 3260, 0),
(3263, 3263, 0),
(3270, 3270, 0),
(3276, 3277, 0),
(3262, 3268, 0),
(3270, 3272, 0),
(3274, 3277, 0),
(3285, 3286, 0),
(3298, 3299, 0),
(3328, 3329, 0),
(3315, 3315, 0),
(3328, 3331, 0),
(3387, 3388, 0),
(3393, 3396, 0),
(3405, 3405, 0),
(3390, 3396, 0),
(3398, 3400, 0),
(3402, 3405, 0),
(3415, 3415, 0),
(3426, 3427, 0),
(3457, 3457, 0),
(3457, 3459, 0),
(3530, 3530, 0),
(3538, 3540, 0),
(3535, 3540, 0),
(3542, 3542, 0),
(3544, 3551, 0),
(3570, 3571, 0),
(3633, 3633, 0),
(3636, 3642, 0),
(3655, 3662, 0),
(3761, 3761, 0),
(3764, 3772, 0),
(3784, 3789, 0),
(3784, 3790, 0),
(3864, 3865, 0),
(3893, 3893, 0),
(3895, 3895, 0),
(3897, 3897, 0),
(3953, 3966, 0),
(3968, 3972, 0),
(3902, 3903, 0),
(3953, 3972, 0),
(3974, 3975, 0),
(3981, 3991, 0),
(3993, 4028, 0),
(4038, 4038, 0),
(4141, 4144, 0),
(4146, 4151, 0),
(4153, 4154, 0),
(4157, 4158, 0),
(4184, 4185, 0),
(4139, 4158, 0),
(4182, 4185, 0),
(4190, 4192, 0),
(4194, 4196, 0),
(4199, 4205, 0),
(4209, 4212, 0),
(4226, 4226, 0),
(4229, 4230, 0),
(4237, 4237, 0),
(4253, 4253, 0),
(4226, 4237, 0),
(4239, 4239, 0),
(4250, 4253, 0),
(4352, 4447, 2),
(4448, 4607, 0),
(4957, 4959, 0),
(5906, 5908, 0),
(5906, 5909, 0),
(5938, 5940, 0),
(5970, 5971, 0),
(6002, 6003, 0),
(6068, 6069, 0),
(6071, 6077, 0),
(6086, 6086, 0),
(6089, 6099, 0),
(6068, 6099, 0),
(6109, 6109, 0),
(6155, 6157, 0),
(6155, 6159, 0),
(6277, 6278, 0),
(6313, 6313, 0),
(6432, 6434, 0),
(6439, 6440, 0),
(6450, 6450, 0),
(6457, 6459, 0),
(6679, 6680, 0),
(6683, 6683, 0),
(6742, 6742, 0),
(6744, 6750, 0),
(6752, 6752, 0),
(6754, 6754, 0),
(6757, 6764, 0),
(6771, 6780, 0),
(6432, 6443, 0),
(6448, 6459, 0),
(6679, 6683, 0),
(6741, 6750, 0),
(6752, 6780, 0),
(6783, 6783, 0),
(6832, 6848, 0),
(6912, 6915, 0),
(6964, 6964, 0),
(6966, 6970, 0),
(6972, 6972, 0),
(6978, 6978, 0),
(6832, 6862, 0),
(6912, 6916, 0),
(6964, 6980, 0),
(7019, 7027, 0),
(7040, 7041, 0),
(7074, 7077, 0),
(7080, 7081, 0),
(7083, 7085, 0),
(7142, 7142, 0),
(7144, 7145, 0),
(7149, 7149, 0),
(7151, 7153, 0),
(7212, 7219, 0),
(7222, 7223, 0),
(7040, 7042, 0),
(7073, 7085, 0),
(7142, 7155, 0),
(7204, 7223, 0),
(7376, 7378, 0),
(7380, 7392, 0),
(7394, 7400, 0),
(7380, 7400, 0),
(7405, 7405, 0),
(7412, 7412, 0),
(7416, 7417, 0),
(7616, 7673, 0),
(7675, 7679, 0),
(7415, 7417, 0),
(7616, 7679, 0),
(8203, 8207, 0),
(8232, 8238, 0),
(8288, 8291, 0),
(8288, 8292, 0),
(8294, 8303, 0),
(8400, 8432, 0),
(8986, 8987, 2),
(9001, 9002, 2),
@@ -212,17 +204,16 @@ CELL_WIDTHS = [
(11904, 11929, 2),
(11931, 12019, 2),
(12032, 12245, 2),
(12272, 12283, 2),
(12288, 12329, 2),
(12330, 12333, 0),
(12334, 12350, 2),
(12272, 12329, 2),
(12330, 12335, 0),
(12336, 12350, 2),
(12353, 12438, 2),
(12441, 12442, 0),
(12443, 12543, 2),
(12549, 12591, 2),
(12593, 12686, 2),
(12688, 12771, 2),
(12784, 12830, 2),
(12783, 12830, 2),
(12832, 12871, 2),
(12880, 19903, 2),
(19968, 42124, 2),
@@ -234,36 +225,33 @@ CELL_WIDTHS = [
(43010, 43010, 0),
(43014, 43014, 0),
(43019, 43019, 0),
(43045, 43046, 0),
(43043, 43047, 0),
(43052, 43052, 0),
(43204, 43205, 0),
(43136, 43137, 0),
(43188, 43205, 0),
(43232, 43249, 0),
(43263, 43263, 0),
(43302, 43309, 0),
(43335, 43345, 0),
(43335, 43347, 0),
(43360, 43388, 2),
(43392, 43394, 0),
(43443, 43443, 0),
(43446, 43449, 0),
(43452, 43453, 0),
(43392, 43395, 0),
(43443, 43456, 0),
(43493, 43493, 0),
(43561, 43566, 0),
(43569, 43570, 0),
(43573, 43574, 0),
(43561, 43574, 0),
(43587, 43587, 0),
(43596, 43596, 0),
(43644, 43644, 0),
(43596, 43597, 0),
(43643, 43645, 0),
(43696, 43696, 0),
(43698, 43700, 0),
(43703, 43704, 0),
(43710, 43711, 0),
(43713, 43713, 0),
(43756, 43757, 0),
(43766, 43766, 0),
(44005, 44005, 0),
(44008, 44008, 0),
(44013, 44013, 0),
(43755, 43759, 0),
(43765, 43766, 0),
(44003, 44010, 0),
(44012, 44013, 0),
(44032, 55203, 2),
(55216, 55295, 0),
(63744, 64255, 2),
(64286, 64286, 0),
(65024, 65039, 0),
@@ -272,8 +260,10 @@ CELL_WIDTHS = [
(65072, 65106, 2),
(65108, 65126, 2),
(65128, 65131, 2),
(65279, 65279, 0),
(65281, 65376, 2),
(65504, 65510, 2),
(65529, 65531, 0),
(66045, 66045, 0),
(66272, 66272, 0),
(66422, 66426, 0),
@@ -285,102 +275,108 @@ CELL_WIDTHS = [
(68325, 68326, 0),
(68900, 68903, 0),
(69291, 69292, 0),
(69373, 69375, 0),
(69446, 69456, 0),
(69633, 69633, 0),
(69506, 69509, 0),
(69632, 69634, 0),
(69688, 69702, 0),
(69759, 69761, 0),
(69811, 69814, 0),
(69817, 69818, 0),
(69744, 69744, 0),
(69747, 69748, 0),
(69759, 69762, 0),
(69808, 69818, 0),
(69821, 69821, 0),
(69826, 69826, 0),
(69837, 69837, 0),
(69888, 69890, 0),
(69927, 69931, 0),
(69933, 69940, 0),
(69927, 69940, 0),
(69957, 69958, 0),
(70003, 70003, 0),
(70016, 70017, 0),
(70070, 70078, 0),
(70016, 70018, 0),
(70067, 70080, 0),
(70089, 70092, 0),
(70095, 70095, 0),
(70191, 70193, 0),
(70196, 70196, 0),
(70198, 70199, 0),
(70094, 70095, 0),
(70188, 70199, 0),
(70206, 70206, 0),
(70367, 70367, 0),
(70371, 70378, 0),
(70400, 70401, 0),
(70209, 70209, 0),
(70367, 70378, 0),
(70400, 70403, 0),
(70459, 70460, 0),
(70464, 70464, 0),
(70462, 70468, 0),
(70471, 70472, 0),
(70475, 70477, 0),
(70487, 70487, 0),
(70498, 70499, 0),
(70502, 70508, 0),
(70512, 70516, 0),
(70712, 70719, 0),
(70722, 70724, 0),
(70726, 70726, 0),
(70709, 70726, 0),
(70750, 70750, 0),
(70835, 70840, 0),
(70842, 70842, 0),
(70847, 70848, 0),
(70850, 70851, 0),
(71090, 71093, 0),
(71100, 71101, 0),
(71103, 71104, 0),
(70832, 70851, 0),
(71087, 71093, 0),
(71096, 71104, 0),
(71132, 71133, 0),
(71219, 71226, 0),
(71229, 71229, 0),
(71231, 71232, 0),
(71339, 71339, 0),
(71341, 71341, 0),
(71344, 71349, 0),
(71351, 71351, 0),
(71453, 71455, 0),
(71458, 71461, 0),
(71463, 71467, 0),
(71727, 71735, 0),
(71737, 71738, 0),
(71995, 71996, 0),
(71998, 71998, 0),
(72003, 72003, 0),
(72148, 72151, 0),
(72154, 72155, 0),
(72160, 72160, 0),
(71216, 71232, 0),
(71339, 71351, 0),
(71453, 71467, 0),
(71724, 71738, 0),
(71984, 71989, 0),
(71991, 71992, 0),
(71995, 71998, 0),
(72000, 72000, 0),
(72002, 72003, 0),
(72145, 72151, 0),
(72154, 72160, 0),
(72164, 72164, 0),
(72193, 72202, 0),
(72243, 72248, 0),
(72243, 72249, 0),
(72251, 72254, 0),
(72263, 72263, 0),
(72273, 72278, 0),
(72281, 72283, 0),
(72330, 72342, 0),
(72344, 72345, 0),
(72752, 72758, 0),
(72760, 72765, 0),
(72767, 72767, 0),
(72273, 72283, 0),
(72330, 72345, 0),
(72751, 72758, 0),
(72760, 72767, 0),
(72850, 72871, 0),
(72874, 72880, 0),
(72882, 72883, 0),
(72885, 72886, 0),
(72873, 72886, 0),
(73009, 73014, 0),
(73018, 73018, 0),
(73020, 73021, 0),
(73023, 73029, 0),
(73031, 73031, 0),
(73098, 73102, 0),
(73104, 73105, 0),
(73109, 73109, 0),
(73111, 73111, 0),
(73459, 73460, 0),
(73107, 73111, 0),
(73459, 73462, 0),
(73472, 73473, 0),
(73475, 73475, 0),
(73524, 73530, 0),
(73534, 73538, 0),
(78896, 78912, 0),
(78919, 78933, 0),
(92912, 92916, 0),
(92976, 92982, 0),
(94031, 94031, 0),
(94033, 94087, 0),
(94095, 94098, 0),
(94176, 94179, 2),
(94180, 94180, 0),
(94192, 94193, 2),
(94192, 94193, 0),
(94208, 100343, 2),
(100352, 101589, 2),
(101632, 101640, 2),
(110592, 110878, 2),
(110576, 110579, 2),
(110581, 110587, 2),
(110589, 110590, 2),
(110592, 110882, 2),
(110898, 110898, 2),
(110928, 110930, 2),
(110933, 110933, 2),
(110948, 110951, 2),
(110960, 111355, 2),
(113821, 113822, 0),
(119143, 119145, 0),
(119163, 119170, 0),
(113824, 113827, 0),
(118528, 118573, 0),
(118576, 118598, 0),
(119141, 119145, 0),
(119149, 119170, 0),
(119173, 119179, 0),
(119210, 119213, 0),
(119362, 119364, 0),
@@ -395,8 +391,11 @@ CELL_WIDTHS = [
(122907, 122913, 0),
(122915, 122916, 0),
(122918, 122922, 0),
(123023, 123023, 0),
(123184, 123190, 0),
(123566, 123566, 0),
(123628, 123631, 0),
(124140, 124143, 0),
(125136, 125142, 0),
(125252, 125258, 0),
(126980, 126980, 2),
@@ -416,7 +415,9 @@ CELL_WIDTHS = [
(127951, 127955, 2),
(127968, 127984, 2),
(127988, 127988, 2),
(127992, 128062, 2),
(127992, 127994, 2),
(127995, 127999, 0),
(128000, 128062, 2),
(128064, 128064, 2),
(128066, 128252, 2),
(128255, 128317, 2),
@@ -430,22 +431,24 @@ CELL_WIDTHS = [
(128716, 128716, 2),
(128720, 128722, 2),
(128725, 128727, 2),
(128732, 128735, 2),
(128747, 128748, 2),
(128756, 128764, 2),
(128992, 129003, 2),
(129008, 129008, 2),
(129292, 129338, 2),
(129340, 129349, 2),
(129351, 129400, 2),
(129402, 129483, 2),
(129485, 129535, 2),
(129648, 129652, 2),
(129656, 129658, 2),
(129664, 129670, 2),
(129680, 129704, 2),
(129712, 129718, 2),
(129728, 129730, 2),
(129744, 129750, 2),
(129351, 129535, 2),
(129648, 129660, 2),
(129664, 129672, 2),
(129680, 129725, 2),
(129727, 129733, 2),
(129742, 129755, 2),
(129760, 129768, 2),
(129776, 129784, 2),
(131072, 196605, 2),
(196608, 262141, 2),
(917505, 917505, 0),
(917536, 917631, 0),
(917760, 917999, 0),
]

View File

@@ -1,5 +1,6 @@
CONSOLE_HTML_FORMAT = """\
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
@@ -10,9 +11,8 @@ body {{
}}
</style>
</head>
<html>
<body>
<pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code>{code}</code></pre>
<pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code style="font-family:inherit">{code}</code></pre>
</body>
</html>
"""

View File

@@ -151,7 +151,6 @@ if __name__ == "__main__":
@dataclass
class E:
size: Optional[int] = None
ratio: int = 1
minimum_size: int = 1

View File

@@ -30,7 +30,6 @@ try:
)
except (AttributeError, ImportError, ValueError):
# Fallback if we can't load the Windows DLL
def get_windows_console_features() -> WindowsConsoleFeatures:
features = WindowsConsoleFeatures()

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
import re
from typing import Iterable, List, Tuple
from typing import Iterable
from ._loop import loop_last
from .cells import cell_len, chop_cells
@@ -7,7 +9,11 @@ from .cells import cell_len, chop_cells
re_word = re.compile(r"\s*\S+\s*")
def words(text: str) -> Iterable[Tuple[int, int, str]]:
def words(text: str) -> Iterable[tuple[int, int, str]]:
"""Yields each word from the text as a tuple
containing (start_index, end_index, word). A "word" in this context may
include the actual word and any whitespace to the right.
"""
position = 0
word_match = re_word.match(text, position)
while word_match is not None:
@@ -17,35 +23,59 @@ def words(text: str) -> Iterable[Tuple[int, int, str]]:
word_match = re_word.match(text, end)
def divide_line(text: str, width: int, fold: bool = True) -> List[int]:
divides: List[int] = []
append = divides.append
line_position = 0
def divide_line(text: str, width: int, fold: bool = True) -> list[int]:
"""Given a string of text, and a width (measured in cells), return a list
of cell offsets which the string should be split at in order for it to fit
within the given width.
Args:
text: The text to examine.
width: The available cell width.
fold: If True, words longer than `width` will be folded onto a new line.
Returns:
A list of indices to break the line at.
"""
break_positions: list[int] = [] # offsets to insert the breaks at
append = break_positions.append
cell_offset = 0
_cell_len = cell_len
for start, _end, word in words(text):
word_length = _cell_len(word.rstrip())
if line_position + word_length > width:
remaining_space = width - cell_offset
word_fits_remaining_space = remaining_space >= word_length
if word_fits_remaining_space:
# Simplest case - the word fits within the remaining width for this line.
cell_offset += _cell_len(word)
else:
# Not enough space remaining for this word on the current line.
if word_length > width:
# The word doesn't fit on any line, so we can't simply
# place it on the next line...
if fold:
chopped_words = chop_cells(word, max_size=width, position=0)
for last, line in loop_last(chopped_words):
# Fold the word across multiple lines.
folded_word = chop_cells(word, width=width)
for last, line in loop_last(folded_word):
if start:
append(start)
if last:
line_position = _cell_len(line)
cell_offset = _cell_len(line)
else:
start += len(line)
else:
# Folding isn't allowed, so crop the word.
if start:
append(start)
line_position = _cell_len(word)
elif line_position and start:
cell_offset = _cell_len(word)
elif cell_offset and start:
# The word doesn't fit within the remaining space on the current
# line, but it *can* fit on to the next (empty) line.
append(start)
line_position = _cell_len(word)
else:
line_position += _cell_len(word)
return divides
cell_offset = _cell_len(word)
return break_positions
if __name__ == "__main__": # pragma: no cover
@@ -53,4 +83,11 @@ if __name__ == "__main__": # pragma: no cover
console = Console(width=10)
console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345")
print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2))
print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10))
console = Console(width=20)
console.rule()
console.print("TextualはPythonの高速アプリケーション開発フレームワークです")
console.rule()
console.print("アプリケーションは1670万色を使用でき")

View File

@@ -27,7 +27,7 @@ class Align(JupyterMixin):
renderable (RenderableType): A console renderable.
align (AlignMethod): One of "left", "center", or "right""
style (StyleType, optional): An optional style to apply to the background.
vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None.
pad (bool, optional): Pad the right with spaces. Defaults to True.
width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None.
height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None.

View File

@@ -48,7 +48,6 @@ class Bar(JupyterMixin):
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
width = min(
self.width if self.width is not None else options.max_width,
options.max_width,

View File

@@ -188,260 +188,224 @@ class Box:
return "".join(parts)
# fmt: off
ASCII: Box = Box(
"""\
+--+
| ||
|-+|
| ||
|-+|
|-+|
| ||
+--+
""",
"+--+\n"
"| ||\n"
"|-+|\n"
"| ||\n"
"|-+|\n"
"|-+|\n"
"| ||\n"
"+--+\n",
ascii=True,
)
ASCII2: Box = Box(
"""\
+-++
| ||
+-++
| ||
+-++
+-++
| ||
+-++
""",
"+-++\n"
"| ||\n"
"+-++\n"
"| ||\n"
"+-++\n"
"+-++\n"
"| ||\n"
"+-++\n",
ascii=True,
)
ASCII_DOUBLE_HEAD: Box = Box(
"""\
+-++
| ||
+=++
| ||
+-++
+-++
| ||
+-++
""",
"+-++\n"
"| ||\n"
"+=++\n"
"| ||\n"
"+-++\n"
"+-++\n"
"| ||\n"
"+-++\n",
ascii=True,
)
SQUARE: Box = Box(
"""\
┌─┬┐
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
"┌─┬┐\n"
"│ ││\n"
"├─┼┤\n"
"│ ││\n"
"├─┼┤\n"
"├─┼┤\n"
"│ ││\n"
"└─┴┘\n"
)
SQUARE_DOUBLE_HEAD: Box = Box(
"""\
┌─┬┐
│ ││
╞═╪╡
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
"┌─┬┐\n"
"│ ││\n"
"╞═╪╡\n"
"│ ││\n"
"├─┼┤\n"
"├─┼┤\n"
"│ ││\n"
"└─┴┘\n"
)
MINIMAL: Box = Box(
"""\
╶─┼╴
╶─┼╴
╶─┼╴
"""
"\n"
" \n"
"╶─┼╴\n"
"\n"
"╶─┼╴\n"
"╶─┼╴\n"
"\n"
" \n"
)
MINIMAL_HEAVY_HEAD: Box = Box(
"""\
╺━┿╸
╶─┼╴
╶─┼╴
"""
"\n"
" \n"
"╺━┿╸\n"
"\n"
"╶─┼╴\n"
"╶─┼╴\n"
"\n"
" \n"
)
MINIMAL_DOUBLE_HEAD: Box = Box(
"""\
═╪
─┼
─┼
"""
"\n"
" \n"
" ═╪ \n"
" \n"
" ─┼ \n"
" ─┼ \n"
" \n"
" \n"
)
SIMPLE: Box = Box(
"""\
──
──
"""
" \n"
" \n"
" ── \n"
" \n"
" \n"
" ── \n"
" \n"
" \n"
)
SIMPLE_HEAD: Box = Box(
"""\
──
"""
" \n"
" \n"
" ── \n"
" \n"
" \n"
" \n"
" \n"
" \n"
)
SIMPLE_HEAVY: Box = Box(
"""\
━━
━━
"""
" \n"
" \n"
" ━━ \n"
" \n"
" \n"
" ━━ \n"
" \n"
" \n"
)
HORIZONTALS: Box = Box(
"""\
──
──
──
──
──
"""
" ── \n"
" \n"
" ── \n"
" \n"
" ── \n"
" ── \n"
" \n"
" ── \n"
)
ROUNDED: Box = Box(
"""\
╭─┬╮
│ ││
├─┼┤
│ ││
├─┼┤
├─┼┤
│ ││
╰─┴╯
"""
"╭─┬╮\n"
"│ ││\n"
"├─┼┤\n"
"│ ││\n"
"├─┼┤\n"
"├─┼┤\n"
"│ ││\n"
"╰─┴╯\n"
)
HEAVY: Box = Box(
"""\
┏━┳┓
┃ ┃┃
┣━╋┫
┃ ┃┃
┣━╋┫
┣━╋┫
┃ ┃┃
┗━┻┛
"""
"┏━┳┓\n"
"┃ ┃┃\n"
"┣━╋┫\n"
"┃ ┃┃\n"
"┣━╋┫\n"
"┣━╋┫\n"
"┃ ┃┃\n"
"┗━┻┛\n"
)
HEAVY_EDGE: Box = Box(
"""\
┏━┯┓
┃ │┃
┠─┼┨
┃ │┃
┠─┼┨
┠─┼┨
┃ │┃
┗━┷┛
"""
"┏━┯┓\n"
"┃ │┃\n"
"┠─┼┨\n"
"┃ │┃\n"
"┠─┼┨\n"
"┠─┼┨\n"
"┃ │┃\n"
"┗━┷┛\n"
)
HEAVY_HEAD: Box = Box(
"""\
┏━┳┓
┃ ┃┃
┡━╇┩
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
"""
"┏━┳┓\n"
"┃ ┃┃\n"
"┡━╇┩\n"
"│ ││\n"
"├─┼┤\n"
"├─┼┤\n"
"│ ││\n"
"└─┴┘\n"
)
DOUBLE: Box = Box(
"""\
╔═╦╗
║ ║║
╠═╬╣
║ ║║
╠═╬╣
╠═╬╣
║ ║║
╚═╩╝
"""
"╔═╦╗\n"
"║ ║║\n"
"╠═╬╣\n"
"║ ║║\n"
"╠═╬╣\n"
"╠═╬╣\n"
"║ ║║\n"
"╚═╩╝\n"
)
DOUBLE_EDGE: Box = Box(
"""\
╔═╤╗
║ │║
╟─┼╢
║ │║
╟─┼╢
╟─┼╢
║ │║
╚═╧╝
"""
"╔═╤╗\n"
"║ │║\n"
"╟─┼╢\n"
"║ │║\n"
"╟─┼╢\n"
"╟─┼╢\n"
"║ │║\n"
"╚═╧╝\n"
)
MARKDOWN: Box = Box(
"""\
| ||
|-||
| ||
|-||
|-||
| ||
""",
" \n"
"| ||\n"
"|-||\n"
"| ||\n"
"|-||\n"
"|-||\n"
"| ||\n"
" \n",
ascii=True,
)
# fmt: on
# Map Boxes that don't render with raster fonts on to equivalent that do
LEGACY_WINDOWS_SUBSTITUTIONS = {
@@ -464,7 +428,6 @@ PLAIN_HEADED_SUBSTITUTIONS = {
if __name__ == "__main__": # pragma: no cover
from pip._vendor.rich.columns import Columns
from pip._vendor.rich.panel import Panel

View File

@@ -1,6 +1,8 @@
from __future__ import annotations
import re
from functools import lru_cache
from typing import Callable, List
from typing import Callable
from ._cell_widths import CELL_WIDTHS
@@ -119,33 +121,44 @@ def set_cell_size(text: str, total: int) -> str:
start = pos
# TODO: This is inefficient
# TODO: This might not work with CWJ type characters
def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]:
"""Break text in to equal (cell) length strings, returning the characters in reverse
order"""
_get_character_cell_size = get_character_cell_size
characters = [
(character, _get_character_cell_size(character)) for character in text
]
total_size = position
lines: List[List[str]] = [[]]
append = lines[-1].append
def chop_cells(
text: str,
width: int,
) -> list[str]:
"""Split text into lines such that each line fits within the available (cell) width.
for character, size in reversed(characters):
if total_size + size > max_size:
lines.append([character])
append = lines[-1].append
total_size = size
Args:
text: The text to fold such that it fits in the given width.
width: The width available (number of cells).
Returns:
A list of strings such that each string in the list has cell width
less than or equal to the available width.
"""
_get_character_cell_size = get_character_cell_size
lines: list[list[str]] = [[]]
append_new_line = lines.append
append_to_last_line = lines[-1].append
total_width = 0
for character in text:
cell_width = _get_character_cell_size(character)
char_doesnt_fit = total_width + cell_width > width
if char_doesnt_fit:
append_new_line([character])
append_to_last_line = lines[-1].append
total_width = cell_width
else:
total_size += size
append(character)
append_to_last_line(character)
total_width += cell_width
return ["".join(line) for line in lines]
if __name__ == "__main__": # pragma: no cover
print(get_character_cell_size("😽"))
for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8):
print(line)

View File

@@ -592,7 +592,6 @@ def blend_rgb(
if __name__ == "__main__": # pragma: no cover
from .console import Console
from .table import Table
from .text import Text

View File

@@ -278,6 +278,7 @@ class ConsoleRenderable(Protocol):
# A type that may be rendered by Console.
RenderableType = Union[ConsoleRenderable, RichCast, str]
"""A string or any object that may be rendered by Rich."""
# The result of calling a __rich_console__ method.
RenderResult = Iterable[Union[RenderableType, Segment]]
@@ -1925,7 +1926,6 @@ class Console:
end (str, optional): String to write at end of print data. Defaults to "\\\\n".
style (Union[str, Style], optional): A style to apply to output. Defaults to None.
justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``.
overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None.
emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None.
markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None.
highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None.

View File

@@ -1,13 +1,13 @@
from itertools import zip_longest
from typing import (
Iterator,
TYPE_CHECKING,
Iterable,
Iterator,
List,
Optional,
TypeVar,
Union,
overload,
TypeVar,
TYPE_CHECKING,
)
if TYPE_CHECKING:
@@ -119,7 +119,7 @@ class Lines:
Args:
console (Console): Console instance.
width (int): Number of characters per line.
width (int): Number of cells available per line.
justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left".
overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold".

View File

@@ -98,7 +98,7 @@ class ReprHighlighter(RegexHighlighter):
r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)",
r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?",
r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")",
r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)",
r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~]*)",
),
]

View File

@@ -103,7 +103,6 @@ class JSON:
if __name__ == "__main__":
import argparse
import sys

View File

@@ -227,7 +227,6 @@ class Layout:
from pip._vendor.rich.tree import Tree
def summary(layout: "Layout") -> Table:
icon = layout.splitter.get_tree_icon()
table = Table.grid(padding=(0, 1, 0, 0))
@@ -403,7 +402,7 @@ class Layout:
self._render_map = render_map
layout_lines: List[List[Segment]] = [[] for _ in range(height)]
_islice = islice
for (region, lines) in render_map.values():
for region, lines in render_map.values():
_x, y, _layout_width, layout_height = region
for row, line in zip(
_islice(layout_lines, y, y + layout_height), lines

View File

@@ -362,7 +362,7 @@ if __name__ == "__main__": # pragma: no cover
table.add_column("Destination Currency")
table.add_column("Exchange Rate")
for ((source, dest), exchange_rate) in exchange_rate_dict.items():
for (source, dest), exchange_rate in exchange_rate_dict.items():
table.add_row(
source,
dest,

View File

@@ -82,7 +82,6 @@ class LiveRender:
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
renderable = self.renderable
style = console.get_style(self.style)
lines = console.render_lines(renderable, options, style=style, pad=False)

View File

@@ -64,6 +64,9 @@ def escape(
return f"{backslashes}{backslashes}\\{text}"
markup = _escape(escape_backslashes, markup)
if markup.endswith("\\") and not markup.endswith("\\\\"):
return markup + "\\"
return markup
@@ -110,7 +113,10 @@ def render(
Args:
markup (str): A string containing console markup.
style: (Union[str, Style]): The style to use.
emoji (bool, optional): Also render emoji code. Defaults to True.
emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None.
Raises:
MarkupError: If there is a syntax error in the markup.
@@ -226,7 +232,6 @@ def render(
if __name__ == "__main__": # pragma: no cover
MARKUP = [
"[red]Hello World[/red]",
"[magenta]Hello [b]World[/b]",

View File

@@ -82,7 +82,9 @@ class Panel(JupyterMixin):
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(
@@ -96,7 +98,9 @@ class Panel(JupyterMixin):
style=style,
border_style=border_style,
width=width,
height=height,
padding=padding,
highlight=highlight,
expand=False,
)

View File

@@ -211,8 +211,11 @@ def install(
)
builtins._ = value # type: ignore[attr-defined]
if "get_ipython" in globals():
try:
ip = get_ipython() # type: ignore[name-defined]
except NameError:
sys.displayhook = display_hook
else:
from IPython.core.formatters import BaseFormatter
class RichFormatter(BaseFormatter): # type: ignore[misc]
@@ -236,8 +239,6 @@ def install(
# replace plain text formatter with rich formatter
rich_formatter = RichFormatter()
ip.display_formatter.formatters["text/plain"] = rich_formatter
else:
sys.displayhook = display_hook
class Pretty(JupyterMixin):
@@ -708,9 +709,9 @@ def traverse(
last=root,
)
def iter_attrs() -> Iterable[
Tuple[str, Any, Optional[Callable[[Any], str]]]
]:
def iter_attrs() -> (
Iterable[Tuple[str, Any, Optional[Callable[[Any], str]]]]
):
"""Iterate over attr fields and values."""
for attr in attr_fields:
if attr.repr:
@@ -985,7 +986,7 @@ if __name__ == "__main__": # pragma: no cover
from pip._vendor.rich import print
# print(Pretty(data, indent_guides=True, max_string=20))
print(Pretty(data, indent_guides=True, max_string=20))
class Thing:
def __repr__(self) -> str:

View File

@@ -681,7 +681,7 @@ class TimeElapsedColumn(ProgressColumn):
elapsed = task.finished_time if task.finished else task.elapsed
if elapsed is None:
return Text("-:--:--", style="progress.elapsed")
delta = timedelta(seconds=int(elapsed))
delta = timedelta(seconds=max(0, int(elapsed)))
return Text(str(delta), style="progress.elapsed")
@@ -710,7 +710,6 @@ class TaskProgressColumn(TextColumn):
table_column: Optional[Column] = None,
show_speed: bool = False,
) -> None:
self.text_format_no_percentage = text_format_no_percentage
self.show_speed = show_speed
super().__init__(
@@ -1114,7 +1113,7 @@ class Progress(JupyterMixin):
progress = Progress(
SpinnerColumn(),
*Progress.default_columns(),
*Progress.get_default_columns(),
"Elapsed:",
TimeElapsedColumn(),
)
@@ -1636,7 +1635,6 @@ class Progress(JupyterMixin):
if __name__ == "__main__": # pragma: no coverage
import random
import time
@@ -1689,7 +1687,6 @@ if __name__ == "__main__": # pragma: no coverage
console=console,
transient=False,
) as progress:
task1 = progress.add_task("[red]Downloading", total=1000)
task2 = progress.add_task("[green]Processing", total=1000)
task3 = progress.add_task("[yellow]Thinking", total=None)

View File

@@ -156,7 +156,6 @@ class ProgressBar(JupyterMixin):
def __rich_console__(
self, console: Console, options: ConsoleOptions
) -> RenderResult:
width = min(self.width or options.max_width, options.max_width)
ascii = options.legacy_windows or options.ascii_only
should_pulse = self.pulse or self.total is None

Some files were not shown because too many files have changed in this diff Show More