golden hour
/opt/cloudlinux/venv/lib/python3.11/site-packages/pip/_vendor/rich
⬆️ Go Up
Upload
File/Folder
Size
Actions
LICENSE
1.03 KB
Del
OK
__init__.py
5.95 KB
Del
OK
__main__.py
7.71 KB
Del
OK
__pycache__
-
Del
OK
_cell_widths.py
9.97 KB
Del
OK
_emoji_codes.py
136.95 KB
Del
OK
_emoji_replace.py
1.04 KB
Del
OK
_export_format.py
2.08 KB
Del
OK
_extension.py
265 B
Del
OK
_fileno.py
799 B
Del
OK
_inspect.py
9.43 KB
Del
OK
_log_render.py
3.15 KB
Del
OK
_loop.py
1.21 KB
Del
OK
_null_file.py
1.36 KB
Del
OK
_palettes.py
6.9 KB
Del
OK
_pick.py
423 B
Del
OK
_ratio.py
5.2 KB
Del
OK
_spinners.py
19.45 KB
Del
OK
_stack.py
351 B
Del
OK
_timer.py
417 B
Del
OK
_win32_console.py
22.22 KB
Del
OK
_windows.py
1.88 KB
Del
OK
_windows_renderer.py
2.72 KB
Del
OK
_wrap.py
3.32 KB
Del
OK
abc.py
890 B
Del
OK
align.py
10.08 KB
Del
OK
ansi.py
6.76 KB
Del
OK
bar.py
3.19 KB
Del
OK
box.py
10.44 KB
Del
OK
cells.py
5.01 KB
Del
OK
color.py
17.78 KB
Del
OK
color_triplet.py
1.03 KB
Del
OK
columns.py
6.96 KB
Del
OK
console.py
98.49 KB
Del
OK
constrain.py
1.26 KB
Del
OK
containers.py
5.37 KB
Del
OK
control.py
6.33 KB
Del
OK
default_styles.py
8.06 KB
Del
OK
diagnose.py
1 KB
Del
OK
emoji.py
2.31 KB
Del
OK
errors.py
642 B
Del
OK
file_proxy.py
1.64 KB
Del
OK
filesize.py
2.43 KB
Del
OK
highlighter.py
9.36 KB
Del
OK
json.py
4.91 KB
Del
OK
jupyter.py
3.18 KB
Del
OK
layout.py
13.68 KB
Del
OK
live.py
14.82 KB
Del
OK
live_render.py
3.44 KB
Del
OK
logging.py
12.18 KB
Del
OK
markup.py
8.25 KB
Del
OK
measure.py
5.18 KB
Del
OK
padding.py
4.79 KB
Del
OK
pager.py
828 B
Del
OK
palette.py
3.32 KB
Del
OK
panel.py
10.9 KB
Del
OK
pretty.py
35.54 KB
Del
OK
progress.py
58.99 KB
Del
OK
progress_bar.py
7.97 KB
Del
OK
prompt.py
12.16 KB
Del
OK
protocol.py
1.36 KB
Del
OK
py.typed
0 B
Del
OK
region.py
166 B
Del
OK
repr.py
4.33 KB
Del
OK
rule.py
4.49 KB
Del
OK
scope.py
2.78 KB
Del
OK
screen.py
1.55 KB
Del
OK
segment.py
24.16 KB
Del
OK
spinner.py
4.12 KB
Del
OK
status.py
4.32 KB
Del
OK
style.py
26.36 KB
Del
OK
styled.py
1.23 KB
Del
OK
syntax.py
35.52 KB
Del
OK
table.py
39.11 KB
Del
OK
terminal_theme.py
3.29 KB
Del
OK
text.py
46.44 KB
Del
OK
theme.py
3.68 KB
Del
OK
themes.py
102 B
Del
OK
traceback.py
35.02 KB
Del
OK
tree.py
9.23 KB
Del
OK
Edit: cells.py
from __future__ import annotations from functools import lru_cache from typing import Callable from ._cell_widths import CELL_WIDTHS # Ranges of unicode ordinals that produce a 1-cell wide character # This is non-exhaustive, but covers most common Western characters _SINGLE_CELL_UNICODE_RANGES: list[tuple[int, int]] = [ (0x20, 0x7E), # Latin (excluding non-printable) (0xA0, 0xAC), (0xAE, 0x002FF), (0x00370, 0x00482), # Greek / Cyrillic (0x02500, 0x025FC), # Box drawing, box elements, geometric shapes (0x02800, 0x028FF), # Braille ] # A set of characters that are a single cell wide _SINGLE_CELLS = frozenset( [ character for _start, _end in _SINGLE_CELL_UNICODE_RANGES for character in map(chr, range(_start, _end + 1)) ] ) # When called with a string this will return True if all # characters are single-cell, otherwise False _is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset @lru_cache(4096) def cached_cell_len(text: str) -> int: """Get the number of cells required to display text. This method always caches, which may use up a lot of memory. It is recommended to use `cell_len` over this method. Args: text (str): Text to display. Returns: int: Get the number of cells required to display text. """ if _is_single_cell_widths(text): return len(text) return sum(map(get_character_cell_size, text)) def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: """Get the number of cells required to display text. Args: text (str): Text to display. Returns: int: Get the number of cells required to display text. """ if len(text) < 512: return _cell_len(text) if _is_single_cell_widths(text): return len(text) return sum(map(get_character_cell_size, text)) @lru_cache(maxsize=4096) def get_character_cell_size(character: str) -> int: """Get the cell size of a character. Args: character (str): A single character. Returns: int: Number of cells (0, 1 or 2) occupied by that character. """ codepoint = ord(character) _table = CELL_WIDTHS lower_bound = 0 upper_bound = len(_table) - 1 index = (lower_bound + upper_bound) // 2 while True: start, end, width = _table[index] if codepoint < start: upper_bound = index - 1 elif codepoint > end: lower_bound = index + 1 else: return 0 if width == -1 else width if upper_bound < lower_bound: break index = (lower_bound + upper_bound) // 2 return 1 def set_cell_size(text: str, total: int) -> str: """Set the length of a string to fit within given number of cells.""" if _is_single_cell_widths(text): size = len(text) if size < total: return text + " " * (total - size) return text[:total] if total <= 0: return "" cell_size = cell_len(text) if cell_size == total: return text if cell_size < total: return text + " " * (total - cell_size) start = 0 end = len(text) # Binary search until we find the right size while True: pos = (start + end) // 2 before = text[: pos + 1] before_len = cell_len(before) if before_len == total + 1 and cell_len(before[-1]) == 2: return before[:-1] + " " if before_len == total: return before if before_len > total: end = pos else: start = pos def chop_cells( text: str, width: int, ) -> list[str]: """Split text into lines such that each line fits within the available (cell) width. 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: 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) for n in range(80, 1, -1): print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") print("x" * n)
Save