X7ROOT File Manager
Current Path:
/opt/alt/python312/lib/python3.12/site-packages/pip/_vendor/rich
opt
/
alt
/
python312
/
lib
/
python3.12
/
site-packages
/
pip
/
_vendor
/
rich
/
??
..
??
__init__.py
(5.95 KB)
??
__main__.py
(8.28 KB)
??
__pycache__
??
_cell_widths.py
(9.86 KB)
??
_emoji_codes.py
(136.95 KB)
??
_emoji_replace.py
(1.04 KB)
??
_export_format.py
(2.05 KB)
??
_extension.py
(265 B)
??
_fileno.py
(799 B)
??
_inspect.py
(9.47 KB)
??
_log_render.py
(3.15 KB)
??
_loop.py
(1.21 KB)
??
_null_file.py
(1.35 KB)
??
_palettes.py
(6.9 KB)
??
_pick.py
(423 B)
??
_ratio.py
(5.34 KB)
??
_spinners.py
(19.45 KB)
??
_stack.py
(351 B)
??
_timer.py
(417 B)
??
_win32_console.py
(22.29 KB)
??
_windows.py
(1.88 KB)
??
_windows_renderer.py
(2.72 KB)
??
_wrap.py
(1.8 KB)
??
abc.py
(890 B)
??
align.py
(10.13 KB)
??
ansi.py
(6.74 KB)
??
bar.py
(3.19 KB)
??
box.py
(9.61 KB)
??
cells.py
(4.4 KB)
??
color.py
(17.8 KB)
??
color_triplet.py
(1.03 KB)
??
columns.py
(6.96 KB)
??
console.py
(96.89 KB)
??
constrain.py
(1.26 KB)
??
containers.py
(5.37 KB)
??
control.py
(6.47 KB)
??
default_styles.py
(7.89 KB)
??
diagnose.py
(972 B)
??
emoji.py
(2.44 KB)
??
errors.py
(642 B)
??
file_proxy.py
(1.64 KB)
??
filesize.py
(2.45 KB)
??
highlighter.py
(9.36 KB)
??
json.py
(4.91 KB)
??
jupyter.py
(3.18 KB)
??
layout.py
(13.68 KB)
??
live.py
(13.94 KB)
??
live_render.py
(3.58 KB)
??
logging.py
(11.62 KB)
??
markup.py
(8.01 KB)
??
measure.py
(5.18 KB)
??
padding.py
(4.85 KB)
??
pager.py
(828 B)
??
palette.py
(3.32 KB)
??
panel.py
(10.33 KB)
??
pretty.py
(35.01 KB)
??
progress.py
(58.31 KB)
??
progress_bar.py
(7.97 KB)
??
prompt.py
(11.04 KB)
??
protocol.py
(1.36 KB)
??
py.typed
(0 B)
??
region.py
(166 B)
??
repr.py
(4.33 KB)
??
rule.py
(4.49 KB)
??
scope.py
(2.78 KB)
??
screen.py
(1.55 KB)
??
segment.py
(23.68 KB)
??
spinner.py
(4.24 KB)
??
status.py
(4.32 KB)
??
style.py
(26.44 KB)
??
styled.py
(1.23 KB)
??
syntax.py
(34.35 KB)
??
table.py
(38.75 KB)
??
terminal_theme.py
(3.29 KB)
??
text.py
(44.46 KB)
??
theme.py
(3.69 KB)
??
themes.py
(102 B)
??
traceback.py
(28.91 KB)
??
tree.py
(8.95 KB)
Editing: cells.py
import re from functools import lru_cache from typing import Callable, List from ._cell_widths import CELL_WIDTHS # Regex to match sequence of the most common character ranges _is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match @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. """ _get_size = get_character_cell_size total_size = sum(_get_size(character) for character in text) return total_size 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) _get_size = get_character_cell_size total_size = sum(_get_size(character) for character in text) return total_size @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. """ return _get_codepoint_cell_size(ord(character)) @lru_cache(maxsize=4096) def _get_codepoint_cell_size(codepoint: int) -> int: """Get the cell size of a character. Args: codepoint (int): Codepoint of a character. Returns: int: Number of cells (0, 1 or 2) occupied by that 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 # 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 for character, size in reversed(characters): if total_size + size > max_size: lines.append([character]) append = lines[-1].append total_size = size else: total_size += size append(character) 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)
Upload File
Create Folder