From e8b7fc1ede2c6a5ad21da52072b614bd312b501a Mon Sep 17 00:00:00 2001 From: Ryan Sharafuddin Date: Thu, 14 Aug 2025 13:54:47 -0400 Subject: [PATCH 001/100] Fix two typos --- CONTRIBUTING.md | 2 +- rich/text.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb27eb0f4..335cfcf56 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,7 +136,7 @@ and over time can reduce development overhead quite considerably. ## Creating A Pull Request -Once your happy with your change and have ensured that all steps above have been followed (and checks have passed), you can create a pull request. +Once you're happy with your change and have ensured that all steps above have been followed (and checks have passed), you can create a pull request. GitHub offers a guide on how to do this [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork). Please ensure that you include a good description of what your change does in your pull request, and link it to any relevant issues or discussions. diff --git a/rich/text.py b/rich/text.py index b57d77c27..e39fc3cd7 100644 --- a/rich/text.py +++ b/rich/text.py @@ -1007,7 +1007,7 @@ def append( return self def append_text(self, text: "Text") -> "Text": - """Append another Text instance. This method is more performant that Text.append, but + """Append another Text instance. This method is more performant than Text.append, but only works for Text. Args: From 21806ce70c67de52ddd2a9785a62dd55f554c3b3 Mon Sep 17 00:00:00 2001 From: Ryan Sharafuddin Date: Thu, 14 Aug 2025 13:59:50 -0400 Subject: [PATCH 002/100] Add name to CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..da1f15d2c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -66,6 +66,7 @@ The following people have contributed to the development of Rich: - [Paul Sanders](https://github.com/sanders41) - [Louis Sautier](https://github.com/sbraz) - [Tim Savage](https://github.com/timsavage) +- [Ryan Sharafuddin](https://github.com/RyanSharafuddin) - [Anthony Shaw](https://github.com/tonybaloney) - [Damian Shaw](https://github.com/notatallshaw) - [Nicolas Simonds](https://github.com/0xDEC0DE) From 27c2d2df7523315de4b81577d414db8c1c7312f9 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 08:45:16 +0100 Subject: [PATCH 003/100] bump for Python3.14 --- .github/workflows/pythonpackage.yml | 2 +- CHANGELOG.md | 5 +++++ pyproject.toml | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index c46f002ae..ab8745fd6 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -9,7 +9,7 @@ jobs: fail-fast: false matrix: os: [windows-latest, ubuntu-latest, macos-latest] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] exclude: - { os: windows-latest, python-version: "3.13" } defaults: diff --git a/CHANGELOG.md b/CHANGELOG.md index e7583d893..803ad41d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [14.2.0] - 2025-10-09 + +### Changed + +- Python3.14 compatibility ## [14.1.0] - 2025-06-25 diff --git a/pyproject.toml b/pyproject.toml index e4969ee96..9c9fedfd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "rich" homepage = "https://github.com/Textualize/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "14.1.0" +version = "14.2.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Typing :: Typed", ] include = ["rich/py.typed"] From 655b5210cb1403100a646d167cf027eec760dd9f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 09:35:09 +0100 Subject: [PATCH 004/100] test fixes --- CHANGELOG.md | 2 +- rich/style.py | 18 +++++++----------- tests/test_inspect.py | 10 ++++++++++ tests/test_pretty.py | 5 +++++ tests/test_text.py | 7 ++++++- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 803ad41d9..8d53b8d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Python3.14 compatibility +- Python3.14 compatibility https://github.com/Textualize/rich/pull/3861 ## [14.1.0] - 2025-06-25 diff --git a/rich/style.py b/rich/style.py index 835d06f3e..529424189 100644 --- a/rich/style.py +++ b/rich/style.py @@ -1,6 +1,7 @@ import sys from functools import lru_cache -from marshal import dumps, loads +from operator import attrgetter +from pickle import dumps, loads from random import randint from typing import Any, Dict, Iterable, List, Optional, Type, Union, cast @@ -9,6 +10,10 @@ from .repr import Result, rich_repr from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme +_hash_getter = attrgetter( + "_color", "_bgcolor", "_attributes", "_set_attributes", "_link", "_meta" +) + # Style instances and style definitions are often interchangeable StyleType = Union[str, "Style"] @@ -432,16 +437,7 @@ def __ne__(self, other: Any) -> bool: def __hash__(self) -> int: if self._hash is not None: return self._hash - self._hash = hash( - ( - self._color, - self._bgcolor, - self._attributes, - self._set_attributes, - self._link, - self._meta, - ) - ) + self._hash = hash(_hash_getter(self)) return self._hash @property diff --git a/tests/test_inspect.py b/tests/test_inspect.py index 130e8df12..3f6e5b9fe 100644 --- a/tests/test_inspect.py +++ b/tests/test_inspect.py @@ -43,6 +43,12 @@ reason="rendered differently on py3.13", ) +skip_py314 = pytest.mark.skipif( + sys.version_info.minor == 14 and sys.version_info.major == 3, + reason="rendered differently on py3.14", +) + + skip_pypy3 = pytest.mark.skipif( hasattr(sys, "pypy_version_info"), reason="rendered differently on pypy3", @@ -139,6 +145,7 @@ def test_inspect_empty_dict(): assert render({}).startswith(expected) +@skip_py314 @skip_py313 @skip_py312 @skip_py311 @@ -219,6 +226,7 @@ def test_inspect_integer_with_value(): @skip_py311 @skip_py312 @skip_py313 +@skip_py314 def test_inspect_integer_with_methods_python38_and_python39(): expected = ( "╭──────────────── ─────────────────╮\n" @@ -257,6 +265,7 @@ def test_inspect_integer_with_methods_python38_and_python39(): @skip_py311 @skip_py312 @skip_py313 +@skip_py314 def test_inspect_integer_with_methods_python310only(): expected = ( "╭──────────────── ─────────────────╮\n" @@ -299,6 +308,7 @@ def test_inspect_integer_with_methods_python310only(): @skip_py310 @skip_py312 @skip_py313 +@skip_py314 def test_inspect_integer_with_methods_python311(): # to_bytes and from_bytes methods on int had minor signature change - # they now, as of 3.11, have default values for all of their parameters diff --git a/tests/test_pretty.py b/tests/test_pretty.py index 90be42f87..29331d9d5 100644 --- a/tests/test_pretty.py +++ b/tests/test_pretty.py @@ -38,6 +38,10 @@ sys.version_info.minor == 13 and sys.version_info.major == 3, reason="rendered differently on py3.13", ) +skip_py314 = pytest.mark.skipif( + sys.version_info.minor == 14 and sys.version_info.major == 3, + reason="rendered differently on py3.14", +) def test_install() -> None: @@ -639,6 +643,7 @@ class Nada: @skip_py311 @skip_py312 @skip_py313 +@skip_py314 def test_attrs_broken() -> None: @attr.define class Foo: diff --git a/tests/test_text.py b/tests/test_text.py index fee7302f2..925803343 100644 --- a/tests/test_text.py +++ b/tests/test_text.py @@ -843,7 +843,12 @@ def test_assemble(): def test_assemble_meta(): text = Text.assemble("foo", ("bar", "bold"), meta={"foo": "bar"}) assert str(text) == "foobar" - assert text._spans == [Span(3, 6, "bold"), Span(0, 6, Style(meta={"foo": "bar"}))] + + spans = text._spans + expected = [Span(3, 6, "bold"), Span(0, 6, Style(meta={"foo": "bar"}))] + + assert spans == expected + console = Console() assert text.get_style_at_offset(console, 0).meta == {"foo": "bar"} From 041406ca9b60af8fcc00cd7fc1b2973ab51eb851 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 09:43:13 +0100 Subject: [PATCH 005/100] removed asv --- poetry.lock | 379 +++++++++++++++++++++++++++++-------------------- pyproject.toml | 1 - 2 files changed, 226 insertions(+), 154 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7cd4cb290..023451631 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "appnope" @@ -6,6 +6,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"jupyter\" and sys_platform == \"darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -17,6 +19,8 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -26,39 +30,23 @@ files = [ astroid = ["astroid (>=2,<4)"] test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "asv" -version = "0.5.1" -description = "Airspeed Velocity: A simple Python history benchmarking tool" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "asv-0.5.1.tar.gz", hash = "sha256:805fc3cc46c0bcf3e7baeaa16a12e4b92f1276c25490db4cb80fc541afa52bfc"}, -] - -[package.dependencies] -six = ">=1.4" - -[package.extras] -hg = ["python-hglib (>=1.5)"] -testing = ["feedparser", "filelock", "numpy", "pip", "pytest (>=4.4.0)", "pytest (>=4.4.0,<5.0)", "pytest-faulthandler", "pytest-faulthandler (<2.0)", "pytest-rerunfailures (>=8.0)", "pytest-rerunfailures (>=8.0,<9.0)", "pytest-timeout", "pytest-xdist", "python-hglib", "scipy", "selenium", "setuptools", "six", "virtualenv (>=1.7)", "wheel"] - [[package]] name = "attrs" version = "21.4.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dev"] files = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests-no-zope = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "backcall" @@ -66,6 +54,8 @@ version = "0.2.0" description = "Specifications for callback functions passed in to an API" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, @@ -77,6 +67,7 @@ version = "22.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, @@ -112,6 +103,7 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -123,6 +115,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -137,25 +130,26 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "extra == \"jupyter\" and sys_platform == \"win32\"", dev = "sys_platform == \"win32\" or platform_system == \"Windows\""} [[package]] name = "comm" -version = "0.2.2" +version = "0.2.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, ] -[package.dependencies] -traitlets = ">=4" - [package.extras] test = ["pytest"] @@ -165,6 +159,7 @@ version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, @@ -244,7 +239,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "decorator" @@ -252,6 +247,8 @@ version = "5.2.1" description = "Decorators for Humans" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -259,13 +256,14 @@ files = [ [[package]] name = "distlib" -version = "0.3.9" +version = "0.4.0" description = "Distribution utilities" optional = false python-versions = "*" +groups = ["dev"] files = [ - {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, - {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, + {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, + {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, ] [[package]] @@ -274,6 +272,8 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, @@ -287,17 +287,19 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.2.0" +version = "2.2.1" description = "Get the currently executing AST node of a frame, and other information" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ - {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, - {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] [[package]] name = "filelock" @@ -305,6 +307,7 @@ version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, @@ -313,7 +316,7 @@ files = [ [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] -typing = ["typing-extensions (>=4.12.2)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] [[package]] name = "identify" @@ -321,6 +324,7 @@ version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, @@ -335,6 +339,7 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -346,6 +351,8 @@ version = "8.12.3" description = "IPython: Productive Interactive Computing" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, @@ -385,6 +392,8 @@ version = "8.1.7" description = "Jupyter interactive widgets" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb"}, {file = "ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376"}, @@ -406,6 +415,8 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -425,6 +436,8 @@ version = "3.0.15" description = "Jupyter interactive widgets for JupyterLab" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "jupyterlab_widgets-3.0.15-py3-none-any.whl", hash = "sha256:d59023d7d7ef71400d51e6fee9a88867f6e65e10a4201605d2d7f3e8f012a31c"}, {file = "jupyterlab_widgets-3.0.15.tar.gz", hash = "sha256:2920888a0c2922351a9202817957a68c07d99673504d6cd37345299e971bb08b"}, @@ -436,6 +449,7 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -460,6 +474,8 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -474,6 +490,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -485,6 +502,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, @@ -544,6 +562,7 @@ version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -555,6 +574,7 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -566,6 +586,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -573,13 +594,15 @@ files = [ [[package]] name = "parso" -version = "0.8.4" +version = "0.8.5" description = "A Python Parser" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, + {file = "parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887"}, + {file = "parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a"}, ] [package.extras] @@ -592,6 +615,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -603,6 +627,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\" and sys_platform != \"win32\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -617,6 +643,8 @@ version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, @@ -628,6 +656,7 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -644,6 +673,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -659,6 +689,7 @@ version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, @@ -673,13 +704,15 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.51" +version = "3.0.52" description = "Library for building powerful interactive command lines in Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ - {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, - {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, ] [package.dependencies] @@ -691,6 +724,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\" and sys_platform != \"win32\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -702,6 +737,8 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -712,13 +749,14 @@ tests = ["pytest"] [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, - {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] [package.extras] @@ -730,6 +768,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -752,6 +791,7 @@ version = "3.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, @@ -766,75 +806,85 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "six" -version = "1.17.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] @@ -843,6 +893,8 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -858,43 +910,55 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "tomli" -version = "2.2.1" +version = "2.3.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version < \"3.11.0a7\"" files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, + {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, + {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, + {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, + {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, + {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, + {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, + {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, + {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, + {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, + {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, + {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, + {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, ] [[package]] @@ -903,6 +967,8 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -918,6 +984,7 @@ version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, @@ -925,33 +992,37 @@ files = [ [[package]] name = "virtualenv" -version = "20.31.2" +version = "20.34.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"}, - {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"}, + {file = "virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026"}, + {file = "virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" +typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] [[package]] name = "wcwidth" -version = "0.2.13" +version = "0.2.14" description = "Measures the displayed width of unicode strings in a terminal" optional = true -python-versions = "*" +python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, + {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, ] [[package]] @@ -960,6 +1031,8 @@ version = "4.0.14" description = "Jupyter interactive widgets for Jupyter Notebook" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"jupyter\"" files = [ {file = "widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575"}, {file = "widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af"}, @@ -969,6 +1042,6 @@ files = [ jupyter = ["ipywidgets"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.8.0" -content-hash = "2e87c73a127b5e6456de92c6cab8e8be8f746f2c4d792ae0563ae74e19593e4c" +content-hash = "610597849eb5fb1d82cd5e647d616dd41412674d531c2f7819380bbc9b54e8e2" diff --git a/pyproject.toml b/pyproject.toml index 9c9fedfd2..dcd16d6fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,6 @@ mypy = "^1.11" pytest-cov = "^3.0.0" attrs = "^21.4.0" pre-commit = "^2.17.0" -asv = "^0.5.1" typing-extensions = ">=4.0.0, <5.0" [build-system] From 518daaa39c17bad485c970bf229424784fbdf044 Mon Sep 17 00:00:00 2001 From: Gero Zayas Date: Thu, 9 Oct 2025 14:03:28 +0200 Subject: [PATCH 006/100] docs(es): sync README.es.md (macOS, 16 colors, Python 3.8+) --- README.es.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.es.md b/README.es.md index 6a7cbd82d..33d4ed671 100644 --- a/README.es.md +++ b/README.es.md @@ -10,7 +10,7 @@ [English readme](https://github.com/textualize/rich/blob/master/README.md) • [简体中文 readme](https://github.com/textualize/rich/blob/master/README.cn.md) • [正體中文 readme](https://github.com/textualize/rich/blob/master/README.zh-tw.md) - • [Lengua española readme](https://github.com/textualize/rich/blob/master/README.es.md) + • [Español readme](https://github.com/textualize/rich/blob/master/README.es.md) • [Deutsche readme](https://github.com/textualize/rich/blob/master/README.de.md) • [Läs på svenska](https://github.com/textualize/rich/blob/master/README.sv.md) • [日本語 readme](https://github.com/textualize/rich/blob/master/README.ja.md) @@ -37,7 +37,7 @@ Vea lo que [la gente dice sobre Rich](https://www.willmcgugan.com/blog/pages/pos ## Compatibilidad -Rich funciona con Linux, OSX y Windows. True color / emoji funciona con la nueva Terminal de Windows, la terminal clásica está limitada a 8 colores. Rich requiere Python 3.6.3 o posterior. +Rich funciona con Linux, macOS y Windows. True color / emoji funciona con la nueva Terminal de Windows; la terminal clásica está limitada a 16 colores. Rich requiere Python 3.8 o posterior. Rich funciona con [Jupyter notebooks](https://jupyter.org/) sin necesidad de configuración adicional. From 494f83c923ca54ecc943bf5e60c0004e65fbb54e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 15:10:58 +0100 Subject: [PATCH 007/100] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d53b8d0f..e53205666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2147,6 +2147,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - First official release, API still to be stabilized +[14.1.0]: https://github.com/textualize/rich/compare/v14.1.0...v14.2.0 [14.0.0]: https://github.com/textualize/rich/compare/v14.0.0...v14.1.0 [14.0.0]: https://github.com/textualize/rich/compare/v13.9.4...v14.0.0 [13.9.4]: https://github.com/textualize/rich/compare/v13.9.3...v13.9.4 From 1080fb7eef04c14c906b730372dd82d3e44c2228 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 15:40:11 +0100 Subject: [PATCH 008/100] Update pull request template for typo contributions Clarified checklist item regarding typos in PRs. --- .github/pull_request_template.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0c99f832e..74d5eee87 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,6 +13,12 @@ If there is any doubt, please open a discussion first. --> + + ## Type of changes - [ ] Bug fix @@ -24,7 +30,7 @@ If there is any doubt, please open a discussion first. ## Checklist - [ ] I've run the latest [black](https://github.com/psf/black) with default args on new code. -- [ ] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate. +- [ ] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate (see not about typos above). - [ ] I've added tests for new code. - [ ] I accept that @willmcgugan may be pedantic in the code review. From 4d6d631a3d2deddf8405522d4b8c976a6d35726c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Oct 2025 16:33:24 +0100 Subject: [PATCH 009/100] Update pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 74d5eee87..4e2833a12 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -30,7 +30,7 @@ If your PR solely consists of typos, at least one must be in the docs to warrant ## Checklist - [ ] I've run the latest [black](https://github.com/psf/black) with default args on new code. -- [ ] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate (see not about typos above). +- [ ] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate (see note about typos above). - [ ] I've added tests for new code. - [ ] I accept that @willmcgugan may be pedantic in the code review. From 931d170944b318ed2f47d64f30d22d25dc8cc1a1 Mon Sep 17 00:00:00 2001 From: AttackThwarter Date: Tue, 4 Nov 2025 02:09:19 +0100 Subject: [PATCH 010/100] DOCS: Add example to Align docstring --- CHANGELOG.md | 6 ++++++ CONTRIBUTORS.md | 1 + rich/align.py | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..955f3922d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Added a visual example to `Align` docstring. + ## [14.2.0] - 2025-10-09 ### Changed diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..15c9ed49d 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -33,6 +33,7 @@ The following people have contributed to the development of Rich: - [JP Hutchins](https://github.com/JPhutchins) - [Ionite](https://github.com/ionite34) - [Josh Karpel](https://github.com/JoshKarpel) +- [Pouya Karazmayan](https://github.com/AttackThwarter) - [Jan Katins](https://github.com/jankatins) - [Hugo van Kemenade](https://github.com/hugovk) - [Andrew Kettmann](https://github.com/akettmann) diff --git a/rich/align.py b/rich/align.py index cb5f31d63..2fa66b1ad 100644 --- a/rich/align.py +++ b/rich/align.py @@ -28,6 +28,20 @@ class Align(JupyterMixin): Raises: ValueError: if ``align`` is not one of the expected values. + + Example: + .. code-block:: python + + from rich.console import Console + from rich.align import Align + from rich.panel import Panel + + console = Console() + # Create a panel 20 characters wide + p = Panel("Hello, [b]World[/b]!", style="on green", width=20) + + # Renders the panel centered in the terminal + console.print(Align(p, align="center")) """ def __init__( From 95fe8ff59249d9ac0534a82af7c746826a5999f4 Mon Sep 17 00:00:00 2001 From: Marius Gedminas Date: Thu, 13 Nov 2025 09:06:57 +0200 Subject: [PATCH 011/100] Fix raw markup printed on prompt errors sometimes Fixes #3881. --- rich/prompt.py | 2 +- tests/test_prompt.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/rich/prompt.py b/rich/prompt.py index c7cf25bae..ae94d9bb8 100644 --- a/rich/prompt.py +++ b/rich/prompt.py @@ -262,7 +262,7 @@ def on_validate_error(self, value: str, error: InvalidResponse) -> None: value (str): String entered by user. error (InvalidResponse): Exception instance the initiated the error. """ - self.console.print(error) + self.console.print(error, markup=True) def pre_prompt(self) -> None: """Hook to display something before the prompt.""" diff --git a/tests/test_prompt.py b/tests/test_prompt.py index 11bffa71b..e254cd498 100644 --- a/tests/test_prompt.py +++ b/tests/test_prompt.py @@ -111,3 +111,16 @@ def test_prompt_confirm_default(): output = console.file.getvalue() print(repr(output)) assert output == expected + + +def test_prompt_confirm_markup(): + INPUT = "foo\nNO\ny" + console = Console(file=io.StringIO(), markup=False) + answer = Confirm.ask( + "continue", console=console, stream=io.StringIO(INPUT), default=True + ) + assert answer is True + expected = "continue [y/n] (y): Please enter Y or N\ncontinue [y/n] (y): Please enter Y or N\ncontinue [y/n] (y): " + output = console.file.getvalue() + print(repr(output)) + assert output == expected From 0c271d5bb67292806b8fea1c2e08f9c5a7e7f928 Mon Sep 17 00:00:00 2001 From: Sebastian Speitel Date: Sun, 23 Nov 2025 14:38:47 +0100 Subject: [PATCH 012/100] Handle unusual __qualname__ in inspect --- CHANGELOG.md | 4 ++++ CONTRIBUTORS.md | 1 + rich/_inspect.py | 4 ++++ tests/test_inspect.py | 13 +++++++++++++ 4 files changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..d405c77d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Python3.14 compatibility https://github.com/Textualize/rich/pull/3861 +### Fixed + +- Fixed exception when callling `inspect` on objects with unusual `__qualname__` attribute https://github.com/Textualize/rich/pull/3894 + ## [14.1.0] - 2025-06-25 ### Changed diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..f4c8010c0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -94,3 +94,4 @@ The following people have contributed to the development of Rich: - [Jonathan Helmus](https://github.com/jjhelmus) - [Brandon Capener](https://github.com/bcapener) - [Alex Zheng](https://github.com/alexzheng111) +- [Sebastian Speitel](https://github.com/SebastianSpeitel) diff --git a/rich/_inspect.py b/rich/_inspect.py index 27d65cec9..05d5eecc1 100644 --- a/rich/_inspect.py +++ b/rich/_inspect.py @@ -101,6 +101,10 @@ def _get_signature(self, name: str, obj: Any) -> Optional[Text]: signature_text = self.highlighter(_signature) qualname = name or getattr(obj, "__qualname__", name) + if not isinstance(qualname, str): + qualname = getattr(obj, "__name__", name) + if not isinstance(qualname, str): + qualname = name # If obj is a module, there may be classes (which are callable) to display if inspect.isclass(obj): diff --git a/tests/test_inspect.py b/tests/test_inspect.py index 3f6e5b9fe..d6972fb5e 100644 --- a/tests/test_inspect.py +++ b/tests/test_inspect.py @@ -404,6 +404,19 @@ class Thing: assert render(module, methods=True) == expected +def test_qualname_in_slots(): + from functools import lru_cache + + @lru_cache + class Klass: + __slots__ = ("__qualname__",) + + try: + inspect(Klass) + except Exception as e: + assert False, f"Class with __qualname__ in __slots__ shouldn't raise {e}" + + @pytest.mark.parametrize( "special_character,expected_replacement", ( From f82a399d584092f0195d0f68add0c03531e02c84 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 2 Dec 2025 10:18:00 +0000 Subject: [PATCH 013/100] Include AI usage checkbox in PR template Added a section to indicate if AI was used in the PR. --- .github/pull_request_template.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4e2833a12..03dd5531d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -27,6 +27,12 @@ If your PR solely consists of typos, at least one must be in the docs to warrant - [ ] Tests - [ ] Other +## AI? + +- [ ] AI was used to generate this PR + +AI generated PRs may be accepted, but only if @willmcgugan has responded on an issue or discussion. + ## Checklist - [ ] I've run the latest [black](https://github.com/psf/black) with default args on new code. @@ -36,4 +42,6 @@ If your PR solely consists of typos, at least one must be in the docs to warrant ## Description -Please describe your changes here. If this fixes a bug, please link to the issue, if possible. +Please describe your changes here. + +**Important:** Link to an issue or discussion regarding these changes. From 75deb2a951597c737a5a2595cbd0b0182f9ee101 Mon Sep 17 00:00:00 2001 From: Tomer Yogev Date: Wed, 3 Dec 2025 23:32:48 +0200 Subject: [PATCH 014/100] Update progress.py Don't output extraneous blank line when progress display is disabled --- rich/progress.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rich/progress.py b/rich/progress.py index ef6ad60f0..7ce80187f 100644 --- a/rich/progress.py +++ b/rich/progress.py @@ -1172,9 +1172,10 @@ def start(self) -> None: def stop(self) -> None: """Stop the progress display.""" - self.live.stop() - if not self.console.is_interactive and not self.console.is_jupyter: - self.console.print() + if not self.disable: + self.live.stop() + if not self.console.is_interactive and not self.console.is_jupyter: + self.console.print() def __enter__(self) -> Self: self.start() From 7c0a0ebdbbe37f4ebf0ee9850dc85954bd5f12e5 Mon Sep 17 00:00:00 2001 From: Tomer Yogev Date: Wed, 3 Dec 2025 23:41:44 +0200 Subject: [PATCH 015/100] Add test --- tests/test_progress.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_progress.py b/tests/test_progress.py index 0be683c3e..20f426a4c 100644 --- a/tests/test_progress.py +++ b/tests/test_progress.py @@ -565,6 +565,30 @@ def test_no_output_if_progress_is_disabled() -> None: assert result == expected +def test_no_output_if_progress_is_disabled_non_interactive() -> None: + console = Console( + file=io.StringIO(), + force_interactive=False, + width=60, + color_system="truecolor", + legacy_windows=False, + _environ={}, + ) + progress = Progress( + console=console, + disable=True, + ) + test = ["foo", "bar", "baz"] + expected_values = iter(test) + with progress: + for value in progress.track(test, description="test"): + assert value == next(expected_values) + result = console.file.getvalue() + print(repr(result)) + expected = "" + assert result == expected + + def test_open() -> None: console = Console( file=io.StringIO(), From 216563d25f7d4684e41695b967b6e9919780857f Mon Sep 17 00:00:00 2001 From: Tomer Yogev Date: Wed, 3 Dec 2025 23:52:14 +0200 Subject: [PATCH 016/100] Add to changelog --- CHANGELOG.md | 6 ++++++ CONTRIBUTORS.md | 1 + 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..971447aa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Fixed + +- Fixed extraneous blank line on non-interactive disabled `Progress` https://github.com/Textualize/rich/pull/3905 + ## [14.2.0] - 2025-10-09 ### Changed diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..090d4e5ab 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -80,6 +80,7 @@ The following people have contributed to the development of Rich: - [Motahhar Mokfi](https://github.com/motahhar) - [Tomer Shalev](https://github.com/tomers) - [Serkan UYSAL](https://github.com/uysalserkan) +- [Tomer Yogev](https://github.com/TomerYogev) - [Zhe Huang](https://github.com/onlyacat) - [Adrian Zuber](https://github.com/xadrianzetx) - [Ke Sun](https://github.com/ksun212) From e8e797d19d84fc1c580e90e84c00bf6747b6a0d7 Mon Sep 17 00:00:00 2001 From: "daniel.jaekel" Date: Thu, 4 Dec 2025 13:51:17 +0100 Subject: [PATCH 017/100] feat: Traceback - Expose more locals rendering options --- CHANGELOG.md | 6 ++++++ CONTRIBUTORS.md | 1 + rich/scope.py | 8 +++++++- rich/traceback.py | 25 +++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..cdb89c6fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Expose locals_max_depth and locals_overflow in traceback.install + ## [14.2.0] - 2025-10-09 ### Changed diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..0d022b7cf 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -32,6 +32,7 @@ The following people have contributed to the development of Rich: - [Logan Hunt](https://github.com/dosisod) - [JP Hutchins](https://github.com/JPhutchins) - [Ionite](https://github.com/ionite34) +- [Daniel Jäkel](https://github.com/kigstn) - [Josh Karpel](https://github.com/JoshKarpel) - [Jan Katins](https://github.com/jankatins) - [Hugo van Kemenade](https://github.com/hugovk) diff --git a/rich/scope.py b/rich/scope.py index 36c06241f..41d0299d5 100644 --- a/rich/scope.py +++ b/rich/scope.py @@ -8,7 +8,7 @@ from .text import Text, TextType if TYPE_CHECKING: - from .console import ConsoleRenderable + from .console import ConsoleRenderable, OverflowMethod def render_scope( @@ -19,6 +19,8 @@ def render_scope( indent_guides: bool = False, max_length: Optional[int] = None, max_string: Optional[int] = None, + max_depth: Optional[int] = None, + overflow: Optional["OverflowMethod"] = None, ) -> "ConsoleRenderable": """Render python variables in a given scope. @@ -30,6 +32,8 @@ def render_scope( max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to None. max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depths of locals before truncating, or None to disable. Defaults to None. + overflow (OverflowMethod, optional): How to handle overflowing locals, or None to disable. Defaults to None. Returns: ConsoleRenderable: A renderable object. @@ -57,6 +61,8 @@ def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: indent_guides=indent_guides, max_length=max_length, max_string=max_string, + max_depth=max_depth, + overflow=overflow, ), ) return Panel.fit( diff --git a/rich/traceback.py b/rich/traceback.py index c32baaca1..66eaecaae 100644 --- a/rich/traceback.py +++ b/rich/traceback.py @@ -33,6 +33,7 @@ Console, ConsoleOptions, ConsoleRenderable, + OverflowMethod, Group, RenderResult, group, @@ -91,8 +92,10 @@ def install( show_locals: bool = False, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_max_depth: Optional[int] = None, locals_hide_dunder: bool = True, locals_hide_sunder: Optional[bool] = None, + locals_overflow: Optional[OverflowMethod] = None, indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, @@ -114,8 +117,10 @@ def install( locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_max_depth (int, optional): Maximum depths of locals before truncating, or None to disable. Defaults to None. locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + locals_overflow (OverflowMethod, optional): How to handle overflowing locals, or None to disable. Defaults to None. indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. @@ -148,8 +153,10 @@ def excepthook( show_locals=show_locals, locals_max_length=locals_max_length, locals_max_string=locals_max_string, + locals_max_depth=locals_max_depth, locals_hide_dunder=locals_hide_dunder, locals_hide_sunder=bool(locals_hide_sunder), + locals_overflow=locals_overflow, indent_guides=indent_guides, suppress=suppress, max_frames=max_frames, @@ -268,8 +275,10 @@ class Traceback: locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_max_depth (int, optional): Maximum depths of locals before truncating, or None to disable. Defaults to None. locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + locals_overflow (OverflowMethod, optional): How to handle overflowing locals, or None to disable. Defaults to None. suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. @@ -295,8 +304,10 @@ def __init__( show_locals: bool = False, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_max_depth: Optional[int] = None, locals_hide_dunder: bool = True, locals_hide_sunder: bool = False, + locals_overlow: Optional[OverflowMethod] = None, indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, @@ -320,8 +331,10 @@ def __init__( self.indent_guides = indent_guides self.locals_max_length = locals_max_length self.locals_max_string = locals_max_string + self.locals_max_depth = locals_max_depth self.locals_hide_dunder = locals_hide_dunder self.locals_hide_sunder = locals_hide_sunder + self.locals_overflow = locals_overlow self.suppress: Sequence[str] = [] for suppress_entity in suppress: @@ -351,8 +364,10 @@ def from_exception( show_locals: bool = False, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_max_depth: Optional[int] = None, locals_hide_dunder: bool = True, locals_hide_sunder: bool = False, + locals_overflow: Optional[OverflowMethod] = None, indent_guides: bool = True, suppress: Iterable[Union[str, ModuleType]] = (), max_frames: int = 100, @@ -372,9 +387,11 @@ def from_exception( indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. + locals_max_depth (int, optional): Maximum depths of locals before truncating, or None to disable. Defaults to None. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + locals_overflow (OverflowMethod, optional): How to handle overflowing locals, or None to disable. Defaults to None. suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. @@ -388,6 +405,7 @@ def from_exception( show_locals=show_locals, locals_max_length=locals_max_length, locals_max_string=locals_max_string, + locals_max_depth=locals_max_depth, locals_hide_dunder=locals_hide_dunder, locals_hide_sunder=locals_hide_sunder, ) @@ -403,8 +421,10 @@ def from_exception( indent_guides=indent_guides, locals_max_length=locals_max_length, locals_max_string=locals_max_string, + locals_max_depth=locals_max_depth, locals_hide_dunder=locals_hide_dunder, locals_hide_sunder=locals_hide_sunder, + locals_overlow=locals_overflow, suppress=suppress, max_frames=max_frames, ) @@ -419,6 +439,7 @@ def extract( show_locals: bool = False, locals_max_length: int = LOCALS_MAX_LENGTH, locals_max_string: int = LOCALS_MAX_STRING, + locals_max_depth: Optional[int] = None, locals_hide_dunder: bool = True, locals_hide_sunder: bool = False, _visited_exceptions: Optional[Set[BaseException]] = None, @@ -433,6 +454,7 @@ def extract( locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_max_depth (int, optional): Maximum depths of locals before truncating, or None to disable. Defaults to None. locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. @@ -560,6 +582,7 @@ def get_locals( value, max_length=locals_max_length, max_string=locals_max_string, + max_depth=locals_max_depth, ) for key, value in get_locals(frame_summary.f_locals.items()) if not (inspect.isfunction(value) or inspect.isclass(value)) @@ -754,6 +777,8 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: indent_guides=self.indent_guides, max_length=self.locals_max_length, max_string=self.locals_max_string, + max_depth=self.locals_max_depth, + overflow=self.locals_overflow, ) exclude_frames: Optional[range] = None From f412ce7923fdfb8418ed7bfea6543ce37244f55a Mon Sep 17 00:00:00 2001 From: Joel Ostblom Date: Tue, 16 Dec 2025 19:03:43 +0100 Subject: [PATCH 018/100] Respect custom console instance in IPython output --- rich/pretty.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/pretty.py b/rich/pretty.py index 5c725c0c5..00abecab3 100644 --- a/rich/pretty.py +++ b/rich/pretty.py @@ -234,7 +234,7 @@ def __call__(self, value: Any) -> Any: if self.pprint: return _ipy_display_hook( value, - console=get_console(), + console=console, overflow=overflow, indent_guides=indent_guides, max_length=max_length, From 69de0b20d200bb191cfbe7d27d2fb95736339879 Mon Sep 17 00:00:00 2001 From: Joel Ostblom Date: Tue, 16 Dec 2025 19:06:31 +0100 Subject: [PATCH 019/100] Add new contributor --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4b04786b9..7d1c32ca2 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -47,6 +47,7 @@ The following people have contributed to the development of Rich: - [Antony Milne](https://github.com/AntonyMilneQB) - [Michael Milton](https://github.com/multimeric) - [Martina Oefelein](https://github.com/oefe) +- [Joel Ostblom](https://github.com/joelostblom) - [Nathan Page](https://github.com/nathanrpage97) - [Dave Pearson](https://github.com/davep/) - [Avi Perl](https://github.com/avi-perl) From b3a50f0834261043033a2e0c51cb7215cce0005f Mon Sep 17 00:00:00 2001 From: Joel Ostblom Date: Wed, 17 Dec 2025 13:42:57 +0100 Subject: [PATCH 020/100] Add changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..dc560f371 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- IPython now respects when a `Console` instance is passed to `pretty.install` https://github.com/Textualize/rich/pull/3915 + ## [14.2.0] - 2025-10-09 ### Changed From 53757bc234cf18977cade41a5b64f3abaccb0b85 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Mon, 22 Dec 2025 15:26:57 +0000 Subject: [PATCH 021/100] Add Toad project information to README Added section about Toad project with links and images. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e46a1e422..ca15efd87 100644 --- a/README.md +++ b/README.md @@ -437,3 +437,9 @@ See also [Rich CLI](https://github.com/textualize/rich-cli) for a command line a See also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal. ![textual-splash](https://github.com/user-attachments/assets/4caeb77e-48c0-4cf7-b14d-c53ded855ffd) + +# Toad + +[Toad](https://github.com/batrachianai/toad) is a unified interface for agentic coding. Built with Rich and Textual. + +![toad](https://github.com/user-attachments/assets/6678b707-1aeb-420f-99ad-abfcd4356771) From 896d2daaf4239b42d800e15355feb4956469a29c Mon Sep 17 00:00:00 2001 From: Konstantin Date: Wed, 31 Dec 2025 20:26:51 +0400 Subject: [PATCH 022/100] Improve introduction wording for clarity --- docs/source/introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/introduction.rst b/docs/source/introduction.rst index f76de8208..465f6fd77 100644 --- a/docs/source/introduction.rst +++ b/docs/source/introduction.rst @@ -33,7 +33,7 @@ If you intend to use Rich with Jupyter then there are some additional dependenci Demo ---- -To check if Rich was installed correctly, and to see a little of what Rich can do, run the following from the command line:: +To verify that Rich is installed correctly and to see a quick demonstration of its features, run the following command in your terminal:: python -m rich From 0ffe7962f95d1b23d22e45b11fef9c1317fa62e1 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 17 Jan 2026 17:08:48 +0000 Subject: [PATCH 023/100] cell string class --- rich/cell_string.py | 210 +++++++++++++++++++++++++++++++++++++ tools/make_width_tables.py | 27 +++++ 2 files changed, 237 insertions(+) create mode 100644 rich/cell_string.py create mode 100644 tools/make_width_tables.py diff --git a/rich/cell_string.py b/rich/cell_string.py new file mode 100644 index 000000000..38fb9962b --- /dev/null +++ b/rich/cell_string.py @@ -0,0 +1,210 @@ +from typing import Callable, Generator, Iterator, NamedTuple, Sequence + +# 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 + + +def _bisearch(codepoint: int, table: Sequence[tuple[int, int, int]]) -> int: + """Binary search a codepoint table. + + Args: + codepoint: The codepoint of a character. + table: A codepoint table. + + """ + lbound = 0 + ubound = len(table) - 1 + + if codepoint < table[0][0] or codepoint > table[ubound][1]: + return 0 + while ubound >= lbound: + mid = (lbound + ubound) // 2 + if codepoint > table[mid][1]: + lbound = mid + 1 + elif codepoint < table[mid][0]: + ubound = mid - 1 + else: + return 1 + + return 0 + + +def _binary_search(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 + + +class Span(NamedTuple): + """Defines a range of a single grapheme.""" + + start: int + end: int + cell_length: int + + +class CellString: + """A string-like object that takes graphemes into account.""" + + def __init__( + self, + text: str, + *, + cell_length: int | None = None, + spans: list[Span] | None = None, + ): + """ + + Args: + text: The plain text. + cell_length: The cell length (as it appears in the terminal), if known. + spans: List of spans which divide the text in to atomic units (single glyphs). + """ + self._text = text + self._singles: bool = _is_single_cell_widths(text) + if cell_length is None: + self._cell_length = len(text) if self._singles else None + else: + self._cell_length = cell_length + self._spans: list[Span] | None = spans + + @property + def text(self) -> str: + """The raw text.""" + return self._text + + @property + def spans(self) -> list[Span]: + if self._spans is not None: + if self._singles: + self._spans = [ + Span(index, index + 1, 1) for index in range(len(self._text)) + ] + else: + # TODO: + self._spans = [] + + return self._spans + + @property + def cell_length(self) -> int: + if self._cell_length is None: + self._cell_length = sum([cell_length for _, _, cell_length in self.spans]) + return self._cell_length + + def __bool__(self) -> bool: + return bool(self._text) + + def __hash__(self) -> int: + return hash(self._text) + + def __eq__(self, other: object) -> bool: + if isinstance(other, CellString): + return self._text == other._text + return NotImplemented + + def __add__(self, other: "CellString") -> "CellString": + if self._singles and other._singles: + return CellString(self._text + other._text) + spans: list[Span] | None + if self._spans is not None and other._spans is not None: + self_length = len(self._text) + spans = [ + *self._spans, + *[ + Span(start + self_length, end + self_length, cell_length) + for start, end, cell_length in other.spans + ], + ] + else: + spans = None + return CellString(self._text + other._text, spans=spans) + + def __iter__(self) -> Iterator[str]: + if self._singles: + return iter(self._text) + + def iterate_text(text: str, spans: list[Span]) -> Generator[str]: + """Generator for the""" + for start, end, _ in spans: + yield text[start:end] + + return iter(iterate_text(self._text, self.spans)) + + def __reversed__(self) -> Iterator[str]: + if self._singles: + return reversed(self._text) + + def iterate_text(text: str, spans: list[Span]): + for start, end, _ in reversed(spans): + yield text[start:end] + + return iter(iterate_text(self._text, self.spans)) + + def __getitem__(self, index: int | slice) -> str: + if self._singles: + # Trivial case of single cell character strings + return self._text[index] + if isinstance(index, int): + # Single span is easy + start, end, _cell_length = self.spans[index] + return self._text[start:end] + + start, stop, stride = index.indices(len(self.spans)) + if stride == 1: + # Fast path for a stride of 1 + start_offset = self.spans[start] + stop_offset = self.spans[stop] + return self._text[start_offset:stop_offset] + else: + # More involved case of a stride > 1 + span_offset = start + output: list[str] = [] + while span_offset <= stop: + start_offset, end_offset, _ = self.spans[span_offset] + output.append(self._text[start_offset:end_offset]) + span_offset += stride + return "".join(output) diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py new file mode 100644 index 000000000..c8788f976 --- /dev/null +++ b/tools/make_width_tables.py @@ -0,0 +1,27 @@ +import subprocess + +from wcwidth import list_versions +from wcwidth.table_wide import WIDE_EASTASIAN +from wcwidth.table_zero import ZERO_WIDTH + +UNICODE_VERSIONS: list[str] = list_versions() + +for version in UNICODE_VERSIONS: + table: list[tuple[int, int, int]] = [] + wide_east_asian: list[tuple[int, int]] = WIDE_EASTASIAN.get(version, []) + for start, end in wide_east_asian: + table.append((start, end, 2)) + zero_wide: list[tuple[int, int]] = ZERO_WIDTH.get(version, []) + for start, end in zero_wide: + table.append((start, end, 0)) + + table_file = f"""# Auto generated by tools/make_width_tables.py + +CELL_WIDTHS = {table!r} + +""" + path = f"../rich/unicode{version}.py" + with open(path, "wt") as file_out: + file_out.write(table_file) + + subprocess.run("black {path}", shell=True) From 1dde8ba671456765bddb283a20e5bf5682eea581 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 18 Jan 2026 14:08:11 +0000 Subject: [PATCH 024/100] cell tables --- rich/cell_string.py | 39 ++++++++++++++++++++++++++++++++++++++ tools/make_width_tables.py | 29 +++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/rich/cell_string.py b/rich/cell_string.py index 38fb9962b..e15d840f6 100644 --- a/rich/cell_string.py +++ b/rich/cell_string.py @@ -25,6 +25,45 @@ _is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset +class CellTable(NamedTuple): + """Contains unicode data required to measure the cell widths of glyphs.""" + + unicode_version: str + widths: Sequence[tuple[int, int, int]] + narrow_to_wide: frozenset[int] + + def get_cell_size(self, character: str) -> None: + pass + + +def get_character_cell_size(character: str, cell_table: CellTable | None) -> 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 _bisearch(codepoint: int, table: Sequence[tuple[int, int, int]]) -> int: """Binary search a codepoint table. diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py index c8788f976..d49a4d7e2 100644 --- a/tools/make_width_tables.py +++ b/tools/make_width_tables.py @@ -1,11 +1,29 @@ import subprocess +from pathlib import Path from wcwidth import list_versions +from wcwidth.table_vs16 import VS16_NARROW_TO_WIDE from wcwidth.table_wide import WIDE_EASTASIAN from wcwidth.table_zero import ZERO_WIDTH +from rich.cell_string import CellTable + UNICODE_VERSIONS: list[str] = list_versions() + +path = Path("../rich/_unicode_data/_versions.py").resolve().absolute() +init = f"""\ +VERSIONS = {UNICODE_VERSIONS!r} +""" + +with open(path, "wt") as init_file: + init_file.write(init) + + +narrow_to_wide: set[int] = set() +for start, end in VS16_NARROW_TO_WIDE["9.0.0"]: + narrow_to_wide.update(range(start, end)) + for version in UNICODE_VERSIONS: table: list[tuple[int, int, int]] = [] wide_east_asian: list[tuple[int, int]] = WIDE_EASTASIAN.get(version, []) @@ -14,14 +32,19 @@ zero_wide: list[tuple[int, int]] = ZERO_WIDTH.get(version, []) for start, end in zero_wide: table.append((start, end, 0)) + table.sort() + + cell_table = CellTable(version, table, frozenset(narrow_to_wide)) table_file = f"""# Auto generated by tools/make_width_tables.py -CELL_WIDTHS = {table!r} +from rich.cell_string import CellTable +cell_table = {cell_table!r} """ - path = f"../rich/unicode{version}.py" + version_path = version.replace(".", "-") + path = Path(f"../rich/_unicode_data/unicode{version_path}.py").resolve().absolute() with open(path, "wt") as file_out: file_out.write(table_file) - subprocess.run("black {path}", shell=True) + subprocess.run(f"black {path}", shell=True) From 72b0a9e964a32a9d65a9cf895f7758bb85e0c631 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 18 Jan 2026 14:10:24 +0000 Subject: [PATCH 025/100] f string path --- rich/_unicode_data/__init__.py | 78 ++++ rich/_unicode_data/_versions.py | 23 ++ rich/_unicode_data/unicode10-0-0.py | 499 ++++++++++++++++++++++++ rich/_unicode_data/unicode11-0-0.py | 514 ++++++++++++++++++++++++ rich/_unicode_data/unicode12-0-0.py | 526 +++++++++++++++++++++++++ rich/_unicode_data/unicode12-1-0.py | 525 +++++++++++++++++++++++++ rich/_unicode_data/unicode13-0-0.py | 537 +++++++++++++++++++++++++ rich/_unicode_data/unicode14-0-0.py | 551 ++++++++++++++++++++++++++ rich/_unicode_data/unicode15-0-0.py | 561 +++++++++++++++++++++++++++ rich/_unicode_data/unicode15-1-0.py | 560 +++++++++++++++++++++++++++ rich/_unicode_data/unicode16-0-0.py | 573 +++++++++++++++++++++++++++ rich/_unicode_data/unicode17-0-0.py | 581 ++++++++++++++++++++++++++++ rich/_unicode_data/unicode4-1-0.py | 291 ++++++++++++++ rich/_unicode_data/unicode5-0-0.py | 296 ++++++++++++++ rich/_unicode_data/unicode5-1-0.py | 319 +++++++++++++++ rich/_unicode_data/unicode5-2-0.py | 347 +++++++++++++++++ rich/_unicode_data/unicode6-0-0.py | 355 +++++++++++++++++ rich/_unicode_data/unicode6-1-0.py | 366 ++++++++++++++++++ rich/_unicode_data/unicode6-2-0.py | 366 ++++++++++++++++++ rich/_unicode_data/unicode6-3-0.py | 367 ++++++++++++++++++ rich/_unicode_data/unicode7-0-0.py | 393 +++++++++++++++++++ rich/_unicode_data/unicode8-0-0.py | 401 +++++++++++++++++++ rich/_unicode_data/unicode9-0-0.py | 486 +++++++++++++++++++++++ 23 files changed, 9515 insertions(+) create mode 100644 rich/_unicode_data/__init__.py create mode 100644 rich/_unicode_data/_versions.py create mode 100644 rich/_unicode_data/unicode10-0-0.py create mode 100644 rich/_unicode_data/unicode11-0-0.py create mode 100644 rich/_unicode_data/unicode12-0-0.py create mode 100644 rich/_unicode_data/unicode12-1-0.py create mode 100644 rich/_unicode_data/unicode13-0-0.py create mode 100644 rich/_unicode_data/unicode14-0-0.py create mode 100644 rich/_unicode_data/unicode15-0-0.py create mode 100644 rich/_unicode_data/unicode15-1-0.py create mode 100644 rich/_unicode_data/unicode16-0-0.py create mode 100644 rich/_unicode_data/unicode17-0-0.py create mode 100644 rich/_unicode_data/unicode4-1-0.py create mode 100644 rich/_unicode_data/unicode5-0-0.py create mode 100644 rich/_unicode_data/unicode5-1-0.py create mode 100644 rich/_unicode_data/unicode5-2-0.py create mode 100644 rich/_unicode_data/unicode6-0-0.py create mode 100644 rich/_unicode_data/unicode6-1-0.py create mode 100644 rich/_unicode_data/unicode6-2-0.py create mode 100644 rich/_unicode_data/unicode6-3-0.py create mode 100644 rich/_unicode_data/unicode7-0-0.py create mode 100644 rich/_unicode_data/unicode8-0-0.py create mode 100644 rich/_unicode_data/unicode9-0-0.py diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py new file mode 100644 index 000000000..bba493723 --- /dev/null +++ b/rich/_unicode_data/__init__.py @@ -0,0 +1,78 @@ +import bisect +import os +from functools import cache +from importlib import import_module + +from rich._unicode_data._versions import VERSIONS +from rich.cell_string import CellTable + +VERSION_ORDER = sorted( + [ + tuple( + map(int, version.split(".")), + ) + for version in VERSIONS + ] +) +VERSION_SET = frozenset(VERSION_ORDER) + + +def _parse_version(version: str) -> tuple[int, int, int]: + """Parse a version string into a tuple of 3 integers. + + Args: + version: A version string. + + Raises: + ValueError: If the version string is invalid. + + Returns: + A tuple of 3 integers. + """ + try: + version_integers = tuple( + map(int, version.split(".")), + ) + except ValueError: + raise ValueError( + f"unicode version string {version!r} is badly formatted" + ) from None + while len(version_integers) < 3: + version_integers = (version_integers, 0) + triple = version_integers[:3] + return triple + + +@cache +def load(unicode_version: str | None) -> CellTable: + """Load a cell table for the given unicode version. + + Args: + unicode_version: Unicode version, or `None` to auto-detect. + + """ + if unicode_version is None: + unicode_version = os.environ.get("UNICODE_VERSION", "latest") + try: + _parse_version(unicode_version) + except ValueError: + # The environment variable is invalid + # Fallback to using the latest version seems s + unicode_version = "latest" + + if unicode_version == "latest": + version = VERSIONS[-1] + else: + if unicode_version in VERSION_SET: + version = unicode_version + else: + unicode_version_integers = _parse_version(unicode_version) + insert_position = bisect.bisect_left( + VERSION_ORDER, unicode_version_integers + ) + version = VERSIONS[max(0, insert_position - 1)] + + version_path_component = version.replace(".", "-") + module_name = f".unicode{version_path_component}" + module = import_module(module_name, "rich._unicode_data") + return module.cell_table diff --git a/rich/_unicode_data/_versions.py b/rich/_unicode_data/_versions.py new file mode 100644 index 000000000..be98418d1 --- /dev/null +++ b/rich/_unicode_data/_versions.py @@ -0,0 +1,23 @@ +VERSIONS = ( + "4.1.0", + "5.0.0", + "5.1.0", + "5.2.0", + "6.0.0", + "6.1.0", + "6.2.0", + "6.3.0", + "7.0.0", + "8.0.0", + "9.0.0", + "10.0.0", + "11.0.0", + "12.0.0", + "12.1.0", + "13.0.0", + "14.0.0", + "15.0.0", + "15.1.0", + "16.0.0", + "17.0.0", +) diff --git a/rich/_unicode_data/unicode10-0-0.py b/rich/_unicode_data/unicode10-0-0.py new file mode 100644 index 000000000..c50b92e3d --- /dev/null +++ b/rich/_unicode_data/unicode10-0-0.py @@ -0,0 +1,499 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="10.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2260, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7415, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12590, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70090, 70092, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70460, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (72193, 72202, 0), + (72243, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 0), + (72873, 72886, 0), + (73009, 73014, 0), + (73018, 73018, 0), + (73020, 73021, 0), + (73023, 73029, 0), + (73031, 73031, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (94176, 94177, 2), + (94208, 100332, 2), + (100352, 101106, 2), + (110592, 110878, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128747, 128748, 2), + (128756, 128760, 2), + (129296, 129342, 2), + (129344, 129356, 2), + (129360, 129387, 2), + (129408, 129431, 2), + (129472, 129472, 2), + (129488, 129510, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode11-0-0.py b/rich/_unicode_data/unicode11-0-0.py new file mode 100644 index 000000000..9089a85aa --- /dev/null +++ b/rich/_unicode_data/unicode11-0-0.py @@ -0,0 +1,514 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="11.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7415, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69446, 69456, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69837, 69837, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (71724, 71738, 0), + (72193, 72202, 0), + (72243, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (94176, 94177, 2), + (94208, 100337, 2), + (100352, 101106, 2), + (110592, 110878, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128747, 128748, 2), + (128756, 128761, 2), + (129296, 129342, 2), + (129344, 129392, 2), + (129395, 129398, 2), + (129402, 129402, 2), + (129404, 129442, 2), + (129456, 129465, 2), + (129472, 129474, 2), + (129488, 129535, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode12-0-0.py b/rich/_unicode_data/unicode12-0-0.py new file mode 100644 index 000000000..7f073adc8 --- /dev/null +++ b/rich/_unicode_data/unicode12-0-0.py @@ -0,0 +1,526 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="12.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69446, 69456, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69837, 69837, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (71724, 71738, 0), + (72145, 72151, 0), + (72154, 72160, 0), + (72164, 72164, 0), + (72193, 72202, 0), + (72243, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (78896, 78904, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94208, 100343, 2), + (100352, 101106, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128725, 2), + (128747, 128748, 2), + (128756, 128762, 2), + (128992, 129003, 2), + (129293, 129393, 2), + (129395, 129398, 2), + (129402, 129442, 2), + (129445, 129450, 2), + (129454, 129482, 2), + (129485, 129535, 2), + (129648, 129651, 2), + (129656, 129658, 2), + (129664, 129666, 2), + (129680, 129685, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode12-1-0.py b/rich/_unicode_data/unicode12-1-0.py new file mode 100644 index 000000000..e3996cf9f --- /dev/null +++ b/rich/_unicode_data/unicode12-1-0.py @@ -0,0 +1,525 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="12.1.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69446, 69456, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69837, 69837, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (71724, 71738, 0), + (72145, 72151, 0), + (72154, 72160, 0), + (72164, 72164, 0), + (72193, 72202, 0), + (72243, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (78896, 78904, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94208, 100343, 2), + (100352, 101106, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128725, 2), + (128747, 128748, 2), + (128756, 128762, 2), + (128992, 129003, 2), + (129293, 129393, 2), + (129395, 129398, 2), + (129402, 129442, 2), + (129445, 129450, 2), + (129454, 129482, 2), + (129485, 129535, 2), + (129648, 129651, 2), + (129656, 129658, 2), + (129664, 129666, 2), + (129680, 129685, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode13-0-0.py b/rich/_unicode_data/unicode13-0-0.py new file mode 100644 index 000000000..9ea46893b --- /dev/null +++ b/rich/_unicode_data/unicode13-0-0.py @@ -0,0 +1,537 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="13.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6848, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 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), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69446, 69456, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69837, 69837, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (78896, 78904, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 0), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128727, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 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), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode14-0-0.py b/rich/_unicode_data/unicode14-0-0.py new file mode 100644 index 000000000..14860fa49 --- /dev/null +++ b/rich/_unicode_data/unicode14-0-0.py @@ -0,0 +1,551 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="14.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2192, 2193, 0), + (2200, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 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, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5909, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6159, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 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), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69446, 69456, 0), + (69506, 69509, 0), + (69632, 69634, 0), + (69688, 69702, 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, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (78896, 78904, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 0), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 2), + (110576, 110579, 2), + (110581, 110587, 2), + (110589, 110590, 2), + (110592, 110882, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 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), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123566, 123566, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128727, 2), + (128733, 128735, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 2), + (129008, 129008, 2), + (129292, 129338, 2), + (129340, 129349, 2), + (129351, 129535, 2), + (129648, 129652, 2), + (129656, 129660, 2), + (129664, 129670, 2), + (129680, 129708, 2), + (129712, 129722, 2), + (129728, 129733, 2), + (129744, 129753, 2), + (129760, 129767, 2), + (129776, 129782, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode15-0-0.py b/rich/_unicode_data/unicode15-0-0.py new file mode 100644 index 000000000..dea6b3319 --- /dev/null +++ b/rich/_unicode_data/unicode15-0-0.py @@ -0,0 +1,561 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="15.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2192, 2193, 0), + (2200, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 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, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3315, 3315, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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, 3790, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5909, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6159, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 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), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69373, 69375, 0), + (69446, 69456, 0), + (69506, 69509, 0), + (69632, 69634, 0), + (69688, 69702, 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, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (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, 0), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 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), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (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), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (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, 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), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode15-1-0.py b/rich/_unicode_data/unicode15-1-0.py new file mode 100644 index 000000000..857280002 --- /dev/null +++ b/rich/_unicode_data/unicode15-1-0.py @@ -0,0 +1,560 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="15.1.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2192, 2193, 0), + (2200, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 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, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3315, 3315, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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, 3790, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5909, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6159, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 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), + (12783, 12830, 2), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69373, 69375, 0), + (69446, 69456, 0), + (69506, 69509, 0), + (69632, 69634, 0), + (69688, 69702, 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, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (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, 0), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 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), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (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), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (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, 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), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode16-0-0.py b/rich/_unicode_data/unicode16-0-0.py new file mode 100644 index 000000000..b184d9c5a --- /dev/null +++ b/rich/_unicode_data/unicode16-0-0.py @@ -0,0 +1,573 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="16.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2192, 2193, 0), + (2199, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 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, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3315, 3315, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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, 3790, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5909, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6159, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9776, 9783, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9866, 9871, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 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, 12773, 2), + (12783, 12830, 2), + (12832, 12871, 2), + (12880, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (68969, 68973, 0), + (69291, 69292, 0), + (69372, 69375, 0), + (69446, 69456, 0), + (69506, 69509, 0), + (69632, 69634, 0), + (69688, 69702, 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, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70584, 70592, 0), + (70594, 70594, 0), + (70597, 70597, 0), + (70599, 70602, 0), + (70604, 70608, 0), + (70610, 70610, 0), + (70625, 70626, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (73472, 73473, 0), + (73475, 73475, 0), + (73524, 73530, 0), + (73534, 73538, 0), + (73562, 73562, 0), + (78896, 78912, 0), + (78919, 78933, 0), + (90398, 90415, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 0), + (94208, 100343, 2), + (100352, 101589, 2), + (101631, 101640, 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), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (119552, 119638, 2), + (119648, 119670, 2), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123023, 123023, 0), + (123184, 123190, 0), + (123566, 123566, 0), + (123628, 123631, 0), + (124140, 124143, 0), + (124398, 124399, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (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, 129535, 2), + (129648, 129660, 2), + (129664, 129673, 2), + (129679, 129734, 2), + (129742, 129756, 2), + (129759, 129769, 2), + (129776, 129784, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode17-0-0.py b/rich/_unicode_data/unicode17-0-0.py new file mode 100644 index 000000000..59959bfd4 --- /dev/null +++ b/rich/_unicode_data/unicode17-0-0.py @@ -0,0 +1,581 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="17.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2192, 2193, 0), + (2199, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 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, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3315, 3315, 0), + (3328, 3331, 0), + (3387, 3388, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3457, 3459, 0), + (3530, 3530, 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, 3790, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5909, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6159, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6877, 0), + (6880, 6891, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7415, 7417, 0), + (7616, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9776, 9783, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9866, 9871, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 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, 12773, 2), + (12783, 12830, 2), + (12832, 12871, 2), + (12880, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43052, 43052, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (68969, 68973, 0), + (69291, 69292, 0), + (69370, 69375, 0), + (69446, 69456, 0), + (69506, 69509, 0), + (69632, 69634, 0), + (69688, 69702, 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, 69940, 0), + (69957, 69958, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70089, 70092, 0), + (70094, 70095, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70459, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70584, 70592, 0), + (70594, 70594, 0), + (70597, 70597, 0), + (70599, 70602, 0), + (70604, 70608, 0), + (70610, 70610, 0), + (70625, 70626, 0), + (70709, 70726, 0), + (70750, 70750, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 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, 72249, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72544, 72551, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 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), + (73107, 73111, 0), + (73459, 73462, 0), + (73472, 73473, 0), + (73475, 73475, 0), + (73524, 73530, 0), + (73534, 73538, 0), + (73562, 73562, 0), + (78896, 78912, 0), + (78919, 78933, 0), + (90398, 90415, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94033, 94087, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 0), + (94194, 94198, 2), + (94208, 101589, 2), + (101631, 101662, 2), + (101760, 101874, 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), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (119552, 119638, 2), + (119648, 119670, 2), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123023, 123023, 0), + (123184, 123190, 0), + (123566, 123566, 0), + (123628, 123631, 0), + (124140, 124143, 0), + (124398, 124399, 0), + (124643, 124643, 0), + (124646, 124646, 0), + (124654, 124655, 0), + (124661, 124661, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128728, 2), + (128732, 128735, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 2), + (129008, 129008, 2), + (129292, 129338, 2), + (129340, 129349, 2), + (129351, 129535, 2), + (129648, 129660, 2), + (129664, 129674, 2), + (129678, 129734, 2), + (129736, 129736, 2), + (129741, 129756, 2), + (129759, 129770, 2), + (129775, 129784, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode4-1-0.py b/rich/_unicode_data/unicode4-1-0.py new file mode 100644 index 000000000..f500c8c7b --- /dev/null +++ b/rich/_unicode_data/unicode4-1-0.py @@ -0,0 +1,291 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="4.1.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1158, 0), + (1160, 1161, 0), + (1425, 1465, 0), + (1467, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1539, 0), + (1552, 1557, 0), + (1611, 1630, 0), + (1648, 1648, 0), + (1750, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2305, 2307, 0), + (2364, 2364, 0), + (2366, 2381, 0), + (2385, 2388, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2672, 2673, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2883, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3330, 3331, 0), + (3390, 3395, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3984, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4140, 4146, 0), + (4150, 4153, 0), + (4182, 4185, 0), + (4352, 4441, 2), + (4447, 4447, 2), + (4448, 4607, 0), + (4959, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (7616, 7619, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8291, 0), + (8298, 8303, 0), + (8400, 8427, 0), + (9001, 9002, 2), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12588, 2), + (12593, 12686, 2), + (12688, 12727, 2), + (12736, 12751, 2), + (12784, 12830, 2), + (12832, 12867, 2), + (12880, 13054, 2), + (13056, 19893, 2), + (19968, 40891, 2), + (40960, 42124, 2), + (42128, 42182, 2), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (44032, 55203, 2), + (55216, 55295, 0), + (63744, 64045, 2), + (64048, 64106, 2), + (64112, 64217, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65059, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode5-0-0.py b/rich/_unicode_data/unicode5-0-0.py new file mode 100644 index 000000000..5574a44e7 --- /dev/null +++ b/rich/_unicode_data/unicode5-0-0.py @@ -0,0 +1,296 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="5.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1158, 0), + (1160, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1539, 0), + (1552, 1557, 0), + (1611, 1630, 0), + (1648, 1648, 0), + (1750, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2305, 2307, 0), + (2364, 2364, 0), + (2366, 2381, 0), + (2385, 2388, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2672, 2673, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2883, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3395, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3984, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4140, 4146, 0), + (4150, 4153, 0), + (4182, 4185, 0), + (4352, 4441, 2), + (4447, 4447, 2), + (4448, 4607, 0), + (4959, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7616, 7626, 0), + (7678, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8291, 0), + (8298, 8303, 0), + (8400, 8431, 0), + (9001, 9002, 2), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12588, 2), + (12593, 12686, 2), + (12688, 12727, 2), + (12736, 12751, 2), + (12784, 12830, 2), + (12832, 12867, 2), + (12880, 13054, 2), + (13056, 19893, 2), + (19968, 40891, 2), + (40960, 42124, 2), + (42128, 42182, 2), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (44032, 55203, 2), + (55216, 55295, 0), + (63744, 64045, 2), + (64048, 64106, 2), + (64112, 64217, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65059, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode5-1-0.py b/rich/_unicode_data/unicode5-1-0.py new file mode 100644 index 000000000..e5066245c --- /dev/null +++ b/rich/_unicode_data/unicode5-1-0.py @@ -0,0 +1,319 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="5.1.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1539, 0), + (1552, 1562, 0), + (1611, 1630, 0), + (1648, 1648, 0), + (1750, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2305, 2307, 0), + (2364, 2364, 0), + (2366, 2381, 0), + (2385, 2388, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3984, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4352, 4441, 2), + (4447, 4447, 2), + (4448, 4607, 0), + (4959, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7082, 0), + (7204, 7223, 0), + (7616, 7654, 0), + (7678, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8298, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12727, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12867, 2), + (12880, 13054, 2), + (13056, 19893, 2), + (19968, 40899, 2), + (40960, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42620, 42621, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (44032, 55203, 2), + (55216, 55295, 0), + (63744, 64045, 2), + (64048, 64106, 2), + (64112, 64217, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode5-2-0.py b/rich/_unicode_data/unicode5-2-0.py new file mode 100644 index 000000000..c3365d088 --- /dev/null +++ b/rich/_unicode_data/unicode5-2-0.py @@ -0,0 +1,347 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="5.2.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1539, 0), + (1552, 1562, 0), + (1611, 1630, 0), + (1648, 1648, 0), + (1750, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2304, 2307, 0), + (2364, 2364, 0), + (2366, 2382, 0), + (2385, 2389, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3984, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4959, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7082, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7410, 0), + (7616, 7654, 0), + (7677, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8298, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12727, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42620, 42621, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43643, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 0), + (44003, 44010, 0), + (44012, 44013, 0), + (44032, 55203, 2), + (55216, 55295, 0), + (63744, 64255, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (69760, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (127488, 127488, 2), + (127504, 127537, 2), + (127552, 127560, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode6-0-0.py b/rich/_unicode_data/unicode6-0-0.py new file mode 100644 index 000000000..19a939077 --- /dev/null +++ b/rich/_unicode_data/unicode6-0-0.py @@ -0,0 +1,355 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="6.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1539, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 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), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2304, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7082, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7410, 0), + (7616, 7654, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8298, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42620, 42621, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43643, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 0), + (44003, 44010, 0), + (44012, 44013, 0), + (44032, 55203, 2), + (55216, 55295, 0), + (63744, 64255, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69760, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (110592, 110593, 2), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode6-1-0.py b/rich/_unicode_data/unicode6-1-0.py new file mode 100644 index 000000000..2ea468545 --- /dev/null +++ b/rich/_unicode_data/unicode6-1-0.py @@ -0,0 +1,366 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="6.1.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1540, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 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), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2276, 2302, 0), + (2304, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7616, 7654, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8298, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42655, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43643, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69760, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (71339, 71351, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (110592, 110593, 2), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode6-2-0.py b/rich/_unicode_data/unicode6-2-0.py new file mode 100644 index 000000000..55410c3a6 --- /dev/null +++ b/rich/_unicode_data/unicode6-2-0.py @@ -0,0 +1,366 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="6.2.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1540, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 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), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2276, 2302, 0), + (2304, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7616, 7654, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8298, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42655, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43643, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69760, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (71339, 71351, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (110592, 110593, 2), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode6-3-0.py b/rich/_unicode_data/unicode6-3-0.py new file mode 100644 index 000000000..5f9dfc9c8 --- /dev/null +++ b/rich/_unicode_data/unicode6-3-0.py @@ -0,0 +1,367 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="6.3.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1536, 1540, 0), + (1552, 1562, 0), + (1564, 1564, 0), + (1611, 1631, 0), + (1648, 1648, 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), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2276, 2302, 0), + (2304, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3073, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3202, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3330, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7616, 7654, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42655, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43643, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65062, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65279, 65279, 0), + (65281, 65376, 2), + (65504, 65510, 2), + (65529, 65531, 0), + (66045, 66045, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69760, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (71339, 71351, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (110592, 110593, 2), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode7-0-0.py b/rich/_unicode_data/unicode7-0-0.py new file mode 100644 index 000000000..eb474334d --- /dev/null +++ b/rich/_unicode_data/unicode7-0-0.py @@ -0,0 +1,393 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="7.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2276, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3329, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6576, 6592, 0), + (6600, 6601, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7416, 7417, 0), + (7616, 7669, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42655, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65069, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70188, 70199, 0), + (70367, 70378, 0), + (70401, 70403, 0), + (70460, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (110592, 110593, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (125136, 125142, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode8-0-0.py b/rich/_unicode_data/unicode8-0-0.py new file mode 100644 index 000000000..2af86faf9 --- /dev/null +++ b/rich/_unicode_data/unicode8-0-0.py @@ -0,0 +1,401 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="8.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2275, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3329, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7416, 7417, 0), + (7616, 7669, 0), + (7676, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (9001, 9002, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43204, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70090, 70092, 0), + (70188, 70199, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70460, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (110592, 110593, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (125136, 125142, 0), + (127488, 127490, 2), + (127504, 127546, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127995, 127999, 0), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) diff --git a/rich/_unicode_data/unicode9-0-0.py b/rich/_unicode_data/unicode9-0-0.py new file mode 100644 index 000000000..a7b28f474 --- /dev/null +++ b/rich/_unicode_data/unicode9-0-0.py @@ -0,0 +1,486 @@ +# Auto generated by tools/make_width_tables.py + +from rich.cell_string import CellTable + +cell_table = CellTable( + unicode_version="9.0.0", + widths=[ + (0, 0, 0), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (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, 1757, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1807, 1807, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2260, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2435, 0), + (2492, 2492, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), + (2530, 2531, 0), + (2561, 2563, 0), + (2620, 2620, 0), + (2622, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2691, 0), + (2748, 2748, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), + (2786, 2787, 0), + (2817, 2819, 0), + (2876, 2876, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2902, 2903, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3075, 0), + (3134, 3140, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3203, 0), + (3260, 3260, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), + (3298, 3299, 0), + (3329, 3331, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), + (3426, 3427, 0), + (3458, 3459, 0), + (3530, 3530, 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, 3769, 0), + (3771, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3902, 3903, 0), + (3953, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4139, 4158, 0), + (4182, 4185, 0), + (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), + (4209, 4212, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), + (4352, 4447, 2), + (4448, 4607, 0), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6099, 0), + (6109, 6109, 0), + (6155, 6158, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), + (6783, 6783, 0), + (6832, 6846, 0), + (6912, 6916, 0), + (6964, 6980, 0), + (7019, 7027, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), + (7376, 7378, 0), + (7380, 7400, 0), + (7405, 7405, 0), + (7410, 7412, 0), + (7416, 7417, 0), + (7616, 7669, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8292, 0), + (8294, 8303, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12589, 2), + (12593, 12686, 2), + (12688, 12730, 2), + (12736, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 13054, 2), + (13056, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43043, 43047, 0), + (43136, 43137, 0), + (43188, 43205, 0), + (43232, 43249, 0), + (43302, 43309, 0), + (43335, 43347, 0), + (43360, 43388, 2), + (43392, 43395, 0), + (43443, 43456, 0), + (43493, 43493, 0), + (43561, 43574, 0), + (43587, 43587, 0), + (43596, 43597, 0), + (43643, 43645, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 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), + (65040, 65049, 2), + (65056, 65071, 0), + (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), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (69632, 69634, 0), + (69688, 69702, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69888, 69890, 0), + (69927, 69940, 0), + (70003, 70003, 0), + (70016, 70018, 0), + (70067, 70080, 0), + (70090, 70092, 0), + (70188, 70199, 0), + (70206, 70206, 0), + (70367, 70378, 0), + (70400, 70403, 0), + (70460, 70460, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70709, 70726, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), + (71132, 71133, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (72751, 72758, 0), + (72760, 72767, 0), + (72850, 72871, 0), + (72873, 72886, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94033, 94078, 0), + (94095, 94098, 0), + (94176, 94176, 2), + (94208, 100332, 2), + (100352, 101106, 2), + (110592, 110593, 2), + (113821, 113822, 0), + (113824, 113827, 0), + (119141, 119145, 0), + (119149, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128747, 128748, 2), + (128756, 128758, 2), + (129296, 129310, 2), + (129312, 129319, 2), + (129328, 129328, 2), + (129331, 129342, 2), + (129344, 129355, 2), + (129360, 129374, 2), + (129408, 129425, 2), + (129472, 129472, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), + (917760, 917999, 0), + ], + narrow_to_wide=frozenset( + { + 9728, + 9729, + 9730, + 9731, + 11013, + 11014, + 9992, + 9996, + 9762, + 127780, + 127781, + 127782, + 127783, + 127784, + 127785, + 127786, + 127787, + 9774, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 9784, + 9785, + 10035, + 10548, + 128329, + 9823, + 10083, + 9829, + 128367, + 127344, + 128371, + 128372, + 128373, + 128374, + 128375, + 128376, + 127358, + 128394, + 128395, + 128396, + 9876, + 9877, + 9878, + 8596, + 8597, + 8598, + 8599, + 9883, + 8600, + 127894, + 127897, + 127898, + 127902, + 8617, + 9642, + 9904, + 128433, + 128450, + 128451, + 127947, + 127948, + 128717, + 128718, + 127949, + 128465, + 128466, + 127956, + 127957, + 127958, + 127959, + 127960, + 127961, + 127962, + 127963, + 127964, + 127965, + 127966, + 128476, + 128736, + 128737, + 128738, + 128739, + 128740, + 128477, + 9208, + 9197, + 9198, + 9968, + 9201, + 9975, + 9976, + 9209, + 9723, + } + ), +) From 5ffec68c91d460eff61105b736df4768234e40be Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 11:27:10 +0000 Subject: [PATCH 026/100] split text --- rich/_unicode_data/__init__.py | 11 +- rich/cell_string.py | 313 ++++++++++++++++++++++++++------- 2 files changed, 258 insertions(+), 66 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index bba493723..1127c88d8 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -1,10 +1,15 @@ +from __future__ import annotations + import bisect import os from functools import cache from importlib import import_module +from typing import TYPE_CHECKING from rich._unicode_data._versions import VERSIONS -from rich.cell_string import CellTable + +if TYPE_CHECKING: + from rich.cell_string import CellTable VERSION_ORDER = sorted( [ @@ -44,14 +49,14 @@ def _parse_version(version: str) -> tuple[int, int, int]: @cache -def load(unicode_version: str | None) -> CellTable: +def load(unicode_version: str = "auto") -> CellTable: """Load a cell table for the given unicode version. Args: unicode_version: Unicode version, or `None` to auto-detect. """ - if unicode_version is None: + if unicode_version == "auto": unicode_version = os.environ.get("UNICODE_VERSION", "latest") try: _parse_version(unicode_version) diff --git a/rich/cell_string.py b/rich/cell_string.py index e15d840f6..1c3241ec1 100644 --- a/rich/cell_string.py +++ b/rich/cell_string.py @@ -1,5 +1,13 @@ +from functools import lru_cache +from operator import itemgetter from typing import Callable, Generator, Iterator, NamedTuple, Sequence +from rich._unicode_data import load as load_cell_table + +Span = tuple[int, int, int] + +_span_get_cell_len = itemgetter(2) + # 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]] = [ @@ -11,7 +19,7 @@ (0x02800, 0x028FF), # Braille ] -# A set of characters that are a single cell wide +# A frozen set of characters that are a single cell wide _SINGLE_CELLS = frozenset( [ character @@ -32,26 +40,30 @@ class CellTable(NamedTuple): widths: Sequence[tuple[int, int, int]] narrow_to_wide: frozenset[int] - def get_cell_size(self, character: str) -> None: - pass + def __hash__(self) -> int: + return hash(self.unicode_version) -def get_character_cell_size(character: str, cell_table: CellTable | None) -> int: +@lru_cache(maxsize=4096) +def get_character_cell_size(character: str, unicode_version: str = "auto") -> int: """Get the cell size of a character. Args: character (str): A single character. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. Returns: int: Number of cells (0, 1 or 2) occupied by that character. """ codepoint = ord(character) - _table = CELL_WIDTHS + table = load_cell_table(unicode_version).widths + if codepoint < table[0][0] or codepoint > table[-1][1]: + return 0 lower_bound = 0 - upper_bound = len(_table) - 1 + upper_bound = len(table) - 1 index = (lower_bound + upper_bound) // 2 while True: - start, end, width = _table[index] + start, end, width = table[index] if codepoint < start: upper_bound = index - 1 elif codepoint > end: @@ -64,65 +76,205 @@ def get_character_cell_size(character: str, cell_table: CellTable | None) -> int return 1 -def _bisearch(codepoint: int, table: Sequence[tuple[int, int, int]]) -> int: - """Binary search a codepoint table. +def cell_len(text: str, unicode_version: str = "auto") -> int: + """Get the cell length of a string (length as it appears in the terminal). Args: - codepoint: The codepoint of a character. - table: A codepoint table. + text: String to measure. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + Returns: + Length of string in terminal cells. """ - lbound = 0 - ubound = len(table) - 1 - - if codepoint < table[0][0] or codepoint > table[ubound][1]: - return 0 - while ubound >= lbound: - mid = (lbound + ubound) // 2 - if codepoint > table[mid][1]: - lbound = mid + 1 - elif codepoint < table[mid][0]: - ubound = mid - 1 + if _is_single_cell_widths(text): + return len(text) + + # "\u200d" is zero width joiner + # "\ufe0f" is variation selector 16 + if "\u200d" not in text and "\ufe0f" not in text: + return sum( + get_character_cell_size(character, unicode_version) for character in text + ) + + cell_table = load_cell_table(unicode_version) + codepoint_count = len(text) + total_width = 0 + index = 0 + last_measured_character: str | None = None + + SPECIAL = {"\u200d", "\ufe0f"} + + while index < codepoint_count: + if (character := text[index]) in SPECIAL: + if character == "\u200d": + index += 2 + elif last_measured_character: + total_width += last_measured_character in cell_table.narrow_to_wide + last_measured_character = None + index += 1 else: - return 1 + if character_width := get_character_cell_size(character, unicode_version): + last_measured_character = character + total_width += character_width + index += 1 - return 0 + return total_width -def _binary_search(character: str) -> int: - """Get the cell size of a character. +def split_graphemes( + text: str, unicode_version: str = "auto" +) -> "tuple[list[Span], int]": + """Divide text in to spans that define a single grapheme. Args: - character (str): A single character. + text: String to split. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. Returns: - int: Number of cells (0, 1 or 2) occupied by that character. + List of spans. """ - codepoint = ord(character) - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 + + cell_table = load_cell_table(unicode_version) + codepoint_count = len(text) + index = 0 + last_measured_character: str | None = None + + total_width = 0 + spans: list[tuple[int, int, int]] = [] + SPECIAL = {"\u200d", "\ufe0f"} + while index < codepoint_count: + if (character := text[index]) in SPECIAL: + if character == "\u200d": + # zero width joiner + index += 2 + if spans: + start, _end, cell_length = spans[-1] + spans[-1] = (start, index, cell_length) + elif last_measured_character: + # variation selector 16 + index += 1 + if spans: + start, _end, cell_length = spans[-1] + if last_measured_character in cell_table.narrow_to_wide: + last_measured_character = None + cell_length += 1 + total_width += 1 + spans[-1] = (start, index, cell_length) + continue + + if character_width := get_character_cell_size(character, unicode_version): + last_measured_character = character + spans.append((index, index := index + 1, character_width)) + total_width += character_width + elif spans: + # zero width characters are associated with the previous character + start, _end, cell_length = spans[-1] + spans[-1] = (start, index := index + 1, cell_length) + + return (spans, total_width) + + +def _split_text( + text: str, cell_position: int, unicode_version: str = "auto" +) -> tuple[str, str]: + """Split text by cell position. + + If the cell position falls within a double width character, it is converted to two spaces. + + Args: + text: Text to split. + cell_position Offset in cells. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + + Returns: + Tuple to two split strings. + """ + if cell_position == 0: + return "", text + + spans, cell_length = split_graphemes(text, unicode_version) + + # Guess initial offset + offset = int((cell_position / cell_length) * len(spans)) + left_size = sum(map(_span_get_cell_len, spans[:offset])) + while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 + if left_size == cell_position: + split_index = spans[offset][0] + return text[:split_index], text[split_index:] + if left_size < cell_position: + start, end, cell_size = spans[offset] + if left_size + cell_size > cell_position: + return text[:start] + " ", " " + text[end:] + offset += 1 + left_size += cell_size else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 + start, end, cell_size = spans[offset] + if left_size - cell_size < cell_position: + return text[:start] + " ", " " + text[end:] + offset -= 1 + left_size -= cell_size + + +def split_text( + text: str, cell_position: int, unicode_version: str = "auto" +) -> tuple[str, str]: + """Split text by cell position. + If the cell position falls within a double width character, it is converted to two spaces. -class Span(NamedTuple): - """Defines a range of a single grapheme.""" + Args: + text: Text to split. + cell_position Offset in cells. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + + Returns: + Tuple to two split strings. + """ + if _is_single_cell_widths(text): + return text[:cell_position], text[cell_position:] + return _split_text(text, cell_position, unicode_version) - start: int - end: int - cell_length: int + +def set_cell_size(text: str, total: int, unicode_version: str = "auto") -> str: + """Adjust a string by cropping or padding with spaces such that it fits within the given number of cells. + + Args: + text: String to adjust. + total: Desired size in cells. + unicode_version: Unicode version. + + Returns: + A string with cell size equal to total. + """ + 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) + text, _ = _split_text(text, total, unicode_version) + return text + + +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. + """ + # TODO class CellString: @@ -133,7 +285,8 @@ def __init__( text: str, *, cell_length: int | None = None, - spans: list[Span] | None = None, + spans: "list[Span] | None" = None, + unicode_version: str = "auto", ): """ @@ -141,6 +294,7 @@ def __init__( text: The plain text. cell_length: The cell length (as it appears in the terminal), if known. spans: List of spans which divide the text in to atomic units (single glyphs). + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. """ self._text = text self._singles: bool = _is_single_cell_widths(text) @@ -148,7 +302,8 @@ def __init__( self._cell_length = len(text) if self._singles else None else: self._cell_length = cell_length - self._spans: list[Span] | None = spans + self._spans: "list[Span] | None" = spans + self._unicode_version = unicode_version @property def text(self) -> str: @@ -156,24 +311,41 @@ def text(self) -> str: return self._text @property - def spans(self) -> list[Span]: - if self._spans is not None: + def spans(self) -> "list[Span]": + if self._spans is None: if self._singles: self._spans = [ - Span(index, index + 1, 1) for index in range(len(self._text)) + (index, index + 1, 1) for index in range(len(self._text)) ] else: - # TODO: - self._spans = [] - + self._spans, self._cell_length = split_graphemes( + self._text, self._unicode_version + ) return self._spans @property def cell_length(self) -> int: + """The 'cell' length (length as displayed in the terminal).""" if self._cell_length is None: - self._cell_length = sum([cell_length for _, _, cell_length in self.spans]) + self._cell_length = cell_len(self._text) return self._cell_length + @property + def glyphs(self) -> list[str]: + """List of strings that make up atomic glyph.""" + text = self._text + glyphs = [text[start:end] for start, end, _ in self.spans] + return glyphs + + @property + def glyph_widths(self) -> list[tuple[str, int]]: + """List of strings that make up atomic glyph, and corresponding cell width.""" + text = self._text + glyph_widths = [ + (text[start:end], cell_length) for start, end, cell_length in self.spans + ] + return glyph_widths + def __bool__(self) -> bool: return bool(self._text) @@ -188,13 +360,13 @@ def __eq__(self, other: object) -> bool: def __add__(self, other: "CellString") -> "CellString": if self._singles and other._singles: return CellString(self._text + other._text) - spans: list[Span] | None + spans: "list[Span] | None" if self._spans is not None and other._spans is not None: self_length = len(self._text) spans = [ *self._spans, *[ - Span(start + self_length, end + self_length, cell_length) + (start + self_length, end + self_length, cell_length) for start, end, cell_length in other.spans ], ] @@ -206,7 +378,7 @@ def __iter__(self) -> Iterator[str]: if self._singles: return iter(self._text) - def iterate_text(text: str, spans: list[Span]) -> Generator[str]: + def iterate_text(text: str, spans: "list[Span]") -> Generator[str]: """Generator for the""" for start, end, _ in spans: yield text[start:end] @@ -217,7 +389,7 @@ def __reversed__(self) -> Iterator[str]: if self._singles: return reversed(self._text) - def iterate_text(text: str, spans: list[Span]): + def iterate_text(text: str, spans: "list[Span]"): for start, end, _ in reversed(spans): yield text[start:end] @@ -235,8 +407,8 @@ def __getitem__(self, index: int | slice) -> str: start, stop, stride = index.indices(len(self.spans)) if stride == 1: # Fast path for a stride of 1 - start_offset = self.spans[start] - stop_offset = self.spans[stop] + start_offset = self.spans[start][0] + stop_offset = self.spans[stop][1] return self._text[start_offset:stop_offset] else: # More involved case of a stride > 1 @@ -247,3 +419,18 @@ def __getitem__(self, index: int | slice) -> str: output.append(self._text[start_offset:end_offset]) span_offset += stride return "".join(output) + + +if __name__ == "__main__": + from rich import print + + print(CellString("Hello World").glyphs) + + print(CellString("Female mechanic: 👩\u200d🔧").glyphs) + print(CellString("Female mechanic: 👩\u200d🔧").glyph_widths) + + left, right = split_text("Hello 👩\u200d🔧 World", 9) + print(repr(left)) + print(repr(right)) + print(left) + print(right) From 7001a52a356f8e51a3e1cc2ac48192ecb3b46d9d Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 12:59:02 +0000 Subject: [PATCH 027/100] move to cells.py --- rich/_unicode_data/unicode10-0-0.py | 2 +- rich/_unicode_data/unicode11-0-0.py | 2 +- rich/_unicode_data/unicode12-0-0.py | 2 +- rich/_unicode_data/unicode12-1-0.py | 2 +- rich/_unicode_data/unicode13-0-0.py | 2 +- rich/_unicode_data/unicode14-0-0.py | 2 +- rich/_unicode_data/unicode15-0-0.py | 2 +- rich/_unicode_data/unicode15-1-0.py | 2 +- rich/_unicode_data/unicode16-0-0.py | 2 +- rich/_unicode_data/unicode17-0-0.py | 2 +- rich/_unicode_data/unicode4-1-0.py | 2 +- rich/_unicode_data/unicode5-0-0.py | 2 +- rich/_unicode_data/unicode5-1-0.py | 2 +- rich/_unicode_data/unicode5-2-0.py | 2 +- rich/_unicode_data/unicode6-0-0.py | 2 +- rich/_unicode_data/unicode6-1-0.py | 2 +- rich/_unicode_data/unicode6-2-0.py | 2 +- rich/_unicode_data/unicode6-3-0.py | 2 +- rich/_unicode_data/unicode7-0-0.py | 2 +- rich/_unicode_data/unicode8-0-0.py | 2 +- rich/_unicode_data/unicode9-0-0.py | 2 +- rich/cell_string.py | 436 -------------------------- rich/cells.py | 457 +++++++++++++++++++++++----- tests/test_cells.py | 25 +- tools/make_width_tables.py | 4 +- 25 files changed, 423 insertions(+), 541 deletions(-) delete mode 100644 rich/cell_string.py diff --git a/rich/_unicode_data/unicode10-0-0.py b/rich/_unicode_data/unicode10-0-0.py index c50b92e3d..ee42a2539 100644 --- a/rich/_unicode_data/unicode10-0-0.py +++ b/rich/_unicode_data/unicode10-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="10.0.0", diff --git a/rich/_unicode_data/unicode11-0-0.py b/rich/_unicode_data/unicode11-0-0.py index 9089a85aa..05a2bd286 100644 --- a/rich/_unicode_data/unicode11-0-0.py +++ b/rich/_unicode_data/unicode11-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="11.0.0", diff --git a/rich/_unicode_data/unicode12-0-0.py b/rich/_unicode_data/unicode12-0-0.py index 7f073adc8..56177d066 100644 --- a/rich/_unicode_data/unicode12-0-0.py +++ b/rich/_unicode_data/unicode12-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="12.0.0", diff --git a/rich/_unicode_data/unicode12-1-0.py b/rich/_unicode_data/unicode12-1-0.py index e3996cf9f..99ececb78 100644 --- a/rich/_unicode_data/unicode12-1-0.py +++ b/rich/_unicode_data/unicode12-1-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="12.1.0", diff --git a/rich/_unicode_data/unicode13-0-0.py b/rich/_unicode_data/unicode13-0-0.py index 9ea46893b..39ed90aa3 100644 --- a/rich/_unicode_data/unicode13-0-0.py +++ b/rich/_unicode_data/unicode13-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="13.0.0", diff --git a/rich/_unicode_data/unicode14-0-0.py b/rich/_unicode_data/unicode14-0-0.py index 14860fa49..189865876 100644 --- a/rich/_unicode_data/unicode14-0-0.py +++ b/rich/_unicode_data/unicode14-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="14.0.0", diff --git a/rich/_unicode_data/unicode15-0-0.py b/rich/_unicode_data/unicode15-0-0.py index dea6b3319..6c3f2cf2d 100644 --- a/rich/_unicode_data/unicode15-0-0.py +++ b/rich/_unicode_data/unicode15-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="15.0.0", diff --git a/rich/_unicode_data/unicode15-1-0.py b/rich/_unicode_data/unicode15-1-0.py index 857280002..c8749d74a 100644 --- a/rich/_unicode_data/unicode15-1-0.py +++ b/rich/_unicode_data/unicode15-1-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="15.1.0", diff --git a/rich/_unicode_data/unicode16-0-0.py b/rich/_unicode_data/unicode16-0-0.py index b184d9c5a..8f5ca49ce 100644 --- a/rich/_unicode_data/unicode16-0-0.py +++ b/rich/_unicode_data/unicode16-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="16.0.0", diff --git a/rich/_unicode_data/unicode17-0-0.py b/rich/_unicode_data/unicode17-0-0.py index 59959bfd4..5c86e6ea7 100644 --- a/rich/_unicode_data/unicode17-0-0.py +++ b/rich/_unicode_data/unicode17-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="17.0.0", diff --git a/rich/_unicode_data/unicode4-1-0.py b/rich/_unicode_data/unicode4-1-0.py index f500c8c7b..86438bc23 100644 --- a/rich/_unicode_data/unicode4-1-0.py +++ b/rich/_unicode_data/unicode4-1-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="4.1.0", diff --git a/rich/_unicode_data/unicode5-0-0.py b/rich/_unicode_data/unicode5-0-0.py index 5574a44e7..e6f07b323 100644 --- a/rich/_unicode_data/unicode5-0-0.py +++ b/rich/_unicode_data/unicode5-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="5.0.0", diff --git a/rich/_unicode_data/unicode5-1-0.py b/rich/_unicode_data/unicode5-1-0.py index e5066245c..308d5702d 100644 --- a/rich/_unicode_data/unicode5-1-0.py +++ b/rich/_unicode_data/unicode5-1-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="5.1.0", diff --git a/rich/_unicode_data/unicode5-2-0.py b/rich/_unicode_data/unicode5-2-0.py index c3365d088..6e3eaadf6 100644 --- a/rich/_unicode_data/unicode5-2-0.py +++ b/rich/_unicode_data/unicode5-2-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="5.2.0", diff --git a/rich/_unicode_data/unicode6-0-0.py b/rich/_unicode_data/unicode6-0-0.py index 19a939077..271c2d975 100644 --- a/rich/_unicode_data/unicode6-0-0.py +++ b/rich/_unicode_data/unicode6-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="6.0.0", diff --git a/rich/_unicode_data/unicode6-1-0.py b/rich/_unicode_data/unicode6-1-0.py index 2ea468545..fb01a1c69 100644 --- a/rich/_unicode_data/unicode6-1-0.py +++ b/rich/_unicode_data/unicode6-1-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="6.1.0", diff --git a/rich/_unicode_data/unicode6-2-0.py b/rich/_unicode_data/unicode6-2-0.py index 55410c3a6..6e2178c27 100644 --- a/rich/_unicode_data/unicode6-2-0.py +++ b/rich/_unicode_data/unicode6-2-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="6.2.0", diff --git a/rich/_unicode_data/unicode6-3-0.py b/rich/_unicode_data/unicode6-3-0.py index 5f9dfc9c8..36af2259e 100644 --- a/rich/_unicode_data/unicode6-3-0.py +++ b/rich/_unicode_data/unicode6-3-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="6.3.0", diff --git a/rich/_unicode_data/unicode7-0-0.py b/rich/_unicode_data/unicode7-0-0.py index eb474334d..f82eec87b 100644 --- a/rich/_unicode_data/unicode7-0-0.py +++ b/rich/_unicode_data/unicode7-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="7.0.0", diff --git a/rich/_unicode_data/unicode8-0-0.py b/rich/_unicode_data/unicode8-0-0.py index 2af86faf9..796838678 100644 --- a/rich/_unicode_data/unicode8-0-0.py +++ b/rich/_unicode_data/unicode8-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="8.0.0", diff --git a/rich/_unicode_data/unicode9-0-0.py b/rich/_unicode_data/unicode9-0-0.py index a7b28f474..206420250 100644 --- a/rich/_unicode_data/unicode9-0-0.py +++ b/rich/_unicode_data/unicode9-0-0.py @@ -1,6 +1,6 @@ # Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = CellTable( unicode_version="9.0.0", diff --git a/rich/cell_string.py b/rich/cell_string.py deleted file mode 100644 index 1c3241ec1..000000000 --- a/rich/cell_string.py +++ /dev/null @@ -1,436 +0,0 @@ -from functools import lru_cache -from operator import itemgetter -from typing import Callable, Generator, Iterator, NamedTuple, Sequence - -from rich._unicode_data import load as load_cell_table - -Span = tuple[int, int, int] - -_span_get_cell_len = itemgetter(2) - -# 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 frozen 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 - - -class CellTable(NamedTuple): - """Contains unicode data required to measure the cell widths of glyphs.""" - - unicode_version: str - widths: Sequence[tuple[int, int, int]] - narrow_to_wide: frozenset[int] - - def __hash__(self) -> int: - return hash(self.unicode_version) - - -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str, unicode_version: str = "auto") -> int: - """Get the cell size of a character. - - Args: - character (str): A single character. - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - codepoint = ord(character) - table = load_cell_table(unicode_version).widths - if codepoint < table[0][0] or codepoint > table[-1][1]: - return 0 - 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 cell_len(text: str, unicode_version: str = "auto") -> int: - """Get the cell length of a string (length as it appears in the terminal). - - Args: - text: String to measure. - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - - Returns: - Length of string in terminal cells. - """ - if _is_single_cell_widths(text): - return len(text) - - # "\u200d" is zero width joiner - # "\ufe0f" is variation selector 16 - if "\u200d" not in text and "\ufe0f" not in text: - return sum( - get_character_cell_size(character, unicode_version) for character in text - ) - - cell_table = load_cell_table(unicode_version) - codepoint_count = len(text) - total_width = 0 - index = 0 - last_measured_character: str | None = None - - SPECIAL = {"\u200d", "\ufe0f"} - - while index < codepoint_count: - if (character := text[index]) in SPECIAL: - if character == "\u200d": - index += 2 - elif last_measured_character: - total_width += last_measured_character in cell_table.narrow_to_wide - last_measured_character = None - index += 1 - else: - if character_width := get_character_cell_size(character, unicode_version): - last_measured_character = character - total_width += character_width - index += 1 - - return total_width - - -def split_graphemes( - text: str, unicode_version: str = "auto" -) -> "tuple[list[Span], int]": - """Divide text in to spans that define a single grapheme. - - Args: - text: String to split. - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - - Returns: - List of spans. - """ - - cell_table = load_cell_table(unicode_version) - codepoint_count = len(text) - index = 0 - last_measured_character: str | None = None - - total_width = 0 - spans: list[tuple[int, int, int]] = [] - SPECIAL = {"\u200d", "\ufe0f"} - while index < codepoint_count: - if (character := text[index]) in SPECIAL: - if character == "\u200d": - # zero width joiner - index += 2 - if spans: - start, _end, cell_length = spans[-1] - spans[-1] = (start, index, cell_length) - elif last_measured_character: - # variation selector 16 - index += 1 - if spans: - start, _end, cell_length = spans[-1] - if last_measured_character in cell_table.narrow_to_wide: - last_measured_character = None - cell_length += 1 - total_width += 1 - spans[-1] = (start, index, cell_length) - continue - - if character_width := get_character_cell_size(character, unicode_version): - last_measured_character = character - spans.append((index, index := index + 1, character_width)) - total_width += character_width - elif spans: - # zero width characters are associated with the previous character - start, _end, cell_length = spans[-1] - spans[-1] = (start, index := index + 1, cell_length) - - return (spans, total_width) - - -def _split_text( - text: str, cell_position: int, unicode_version: str = "auto" -) -> tuple[str, str]: - """Split text by cell position. - - If the cell position falls within a double width character, it is converted to two spaces. - - Args: - text: Text to split. - cell_position Offset in cells. - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - - Returns: - Tuple to two split strings. - """ - if cell_position == 0: - return "", text - - spans, cell_length = split_graphemes(text, unicode_version) - - # Guess initial offset - offset = int((cell_position / cell_length) * len(spans)) - left_size = sum(map(_span_get_cell_len, spans[:offset])) - - while True: - if left_size == cell_position: - split_index = spans[offset][0] - return text[:split_index], text[split_index:] - if left_size < cell_position: - start, end, cell_size = spans[offset] - if left_size + cell_size > cell_position: - return text[:start] + " ", " " + text[end:] - offset += 1 - left_size += cell_size - else: - start, end, cell_size = spans[offset] - if left_size - cell_size < cell_position: - return text[:start] + " ", " " + text[end:] - offset -= 1 - left_size -= cell_size - - -def split_text( - text: str, cell_position: int, unicode_version: str = "auto" -) -> tuple[str, str]: - """Split text by cell position. - - If the cell position falls within a double width character, it is converted to two spaces. - - Args: - text: Text to split. - cell_position Offset in cells. - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - - Returns: - Tuple to two split strings. - """ - if _is_single_cell_widths(text): - return text[:cell_position], text[cell_position:] - return _split_text(text, cell_position, unicode_version) - - -def set_cell_size(text: str, total: int, unicode_version: str = "auto") -> str: - """Adjust a string by cropping or padding with spaces such that it fits within the given number of cells. - - Args: - text: String to adjust. - total: Desired size in cells. - unicode_version: Unicode version. - - Returns: - A string with cell size equal to total. - """ - 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) - text, _ = _split_text(text, total, unicode_version) - return text - - -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. - """ - # TODO - - -class CellString: - """A string-like object that takes graphemes into account.""" - - def __init__( - self, - text: str, - *, - cell_length: int | None = None, - spans: "list[Span] | None" = None, - unicode_version: str = "auto", - ): - """ - - Args: - text: The plain text. - cell_length: The cell length (as it appears in the terminal), if known. - spans: List of spans which divide the text in to atomic units (single glyphs). - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - """ - self._text = text - self._singles: bool = _is_single_cell_widths(text) - if cell_length is None: - self._cell_length = len(text) if self._singles else None - else: - self._cell_length = cell_length - self._spans: "list[Span] | None" = spans - self._unicode_version = unicode_version - - @property - def text(self) -> str: - """The raw text.""" - return self._text - - @property - def spans(self) -> "list[Span]": - if self._spans is None: - if self._singles: - self._spans = [ - (index, index + 1, 1) for index in range(len(self._text)) - ] - else: - self._spans, self._cell_length = split_graphemes( - self._text, self._unicode_version - ) - return self._spans - - @property - def cell_length(self) -> int: - """The 'cell' length (length as displayed in the terminal).""" - if self._cell_length is None: - self._cell_length = cell_len(self._text) - return self._cell_length - - @property - def glyphs(self) -> list[str]: - """List of strings that make up atomic glyph.""" - text = self._text - glyphs = [text[start:end] for start, end, _ in self.spans] - return glyphs - - @property - def glyph_widths(self) -> list[tuple[str, int]]: - """List of strings that make up atomic glyph, and corresponding cell width.""" - text = self._text - glyph_widths = [ - (text[start:end], cell_length) for start, end, cell_length in self.spans - ] - return glyph_widths - - def __bool__(self) -> bool: - return bool(self._text) - - def __hash__(self) -> int: - return hash(self._text) - - def __eq__(self, other: object) -> bool: - if isinstance(other, CellString): - return self._text == other._text - return NotImplemented - - def __add__(self, other: "CellString") -> "CellString": - if self._singles and other._singles: - return CellString(self._text + other._text) - spans: "list[Span] | None" - if self._spans is not None and other._spans is not None: - self_length = len(self._text) - spans = [ - *self._spans, - *[ - (start + self_length, end + self_length, cell_length) - for start, end, cell_length in other.spans - ], - ] - else: - spans = None - return CellString(self._text + other._text, spans=spans) - - def __iter__(self) -> Iterator[str]: - if self._singles: - return iter(self._text) - - def iterate_text(text: str, spans: "list[Span]") -> Generator[str]: - """Generator for the""" - for start, end, _ in spans: - yield text[start:end] - - return iter(iterate_text(self._text, self.spans)) - - def __reversed__(self) -> Iterator[str]: - if self._singles: - return reversed(self._text) - - def iterate_text(text: str, spans: "list[Span]"): - for start, end, _ in reversed(spans): - yield text[start:end] - - return iter(iterate_text(self._text, self.spans)) - - def __getitem__(self, index: int | slice) -> str: - if self._singles: - # Trivial case of single cell character strings - return self._text[index] - if isinstance(index, int): - # Single span is easy - start, end, _cell_length = self.spans[index] - return self._text[start:end] - - start, stop, stride = index.indices(len(self.spans)) - if stride == 1: - # Fast path for a stride of 1 - start_offset = self.spans[start][0] - stop_offset = self.spans[stop][1] - return self._text[start_offset:stop_offset] - else: - # More involved case of a stride > 1 - span_offset = start - output: list[str] = [] - while span_offset <= stop: - start_offset, end_offset, _ = self.spans[span_offset] - output.append(self._text[start_offset:end_offset]) - span_offset += stride - return "".join(output) - - -if __name__ == "__main__": - from rich import print - - print(CellString("Hello World").glyphs) - - print(CellString("Female mechanic: 👩\u200d🔧").glyphs) - print(CellString("Female mechanic: 👩\u200d🔧").glyph_widths) - - left, right = split_text("Hello 👩\u200d🔧 World", 9) - print(repr(left)) - print(repr(right)) - print(left) - print(right) diff --git a/rich/cells.py b/rich/cells.py index a85462271..145828394 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -1,9 +1,12 @@ -from __future__ import annotations - from functools import lru_cache -from typing import Callable +from operator import itemgetter +from typing import Callable, Generator, Iterator, NamedTuple, Sequence + +from rich._unicode_data import load as load_cell_table + +CellSpan = tuple[int, int, int] -from ._cell_widths import CELL_WIDTHS +_span_get_cell_len = itemgetter(2) # Ranges of unicode ordinals that produce a 1-cell wide character # This is non-exhaustive, but covers most common Western characters @@ -16,7 +19,7 @@ (0x02800, 0x028FF), # Braille ] -# A set of characters that are a single cell wide +# A frozen set of characters that are a single cell wide _SINGLE_CELLS = frozenset( [ character @@ -30,6 +33,49 @@ _is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset +class CellTable(NamedTuple): + """Contains unicode data required to measure the cell widths of glyphs.""" + + unicode_version: str + widths: Sequence[tuple[int, int, int]] + narrow_to_wide: frozenset[int] + + def __hash__(self) -> int: + return hash(self.unicode_version) + + +@lru_cache(maxsize=4096) +def get_character_cell_size(character: str, unicode_version: str = "auto") -> int: + """Get the cell size of a character. + + Args: + character (str): A single character. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + codepoint = ord(character) + table = load_cell_table(unicode_version).widths + if codepoint < table[0][0] or codepoint > table[-1][1]: + return 0 + 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 + + @lru_cache(4096) def cached_cell_len(text: str) -> int: """Get the number of cells required to display text. @@ -48,60 +94,182 @@ def cached_cell_len(text: str) -> int: 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. +def cell_len(text: str, unicode_version: str = "auto") -> int: + """Get the cell length of a string (length as it appears in the terminal). Args: - text (str): Text to display. + text: String to measure. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. Returns: - int: Get the number of cells required to display text. + Length of string in terminal cells. """ - 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)) + # "\u200d" is zero width joiner + # "\ufe0f" is variation selector 16 + if "\u200d" not in text and "\ufe0f" not in text: + return sum( + get_character_cell_size(character, unicode_version) for character in text + ) + + cell_table = load_cell_table(unicode_version) + codepoint_count = len(text) + total_width = 0 + index = 0 + last_measured_character: str | None = None + + SPECIAL = {"\u200d", "\ufe0f"} + + while index < codepoint_count: + if (character := text[index]) in SPECIAL: + if character == "\u200d": + index += 2 + elif last_measured_character: + total_width += last_measured_character in cell_table.narrow_to_wide + last_measured_character = None + index += 1 + else: + if character_width := get_character_cell_size(character, unicode_version): + last_measured_character = character + total_width += character_width + index += 1 + + return total_width -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str) -> int: - """Get the cell size of a character. + +def split_graphemes( + text: str, unicode_version: str = "auto" +) -> "tuple[list[CellSpan], int]": + """Divide text in to spans that define a single grapheme. Args: - character (str): A single character. + text: String to split. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. Returns: - int: Number of cells (0, 1 or 2) occupied by that character. + List of spans. """ - codepoint = ord(character) - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 + + cell_table = load_cell_table(unicode_version) + codepoint_count = len(text) + index = 0 + last_measured_character: str | None = None + + total_width = 0 + spans: list[tuple[int, int, int]] = [] + SPECIAL = {"\u200d", "\ufe0f"} + while index < codepoint_count: + if (character := text[index]) in SPECIAL: + if character == "\u200d": + # zero width joiner + index += 2 + if spans: + start, _end, cell_length = spans[-1] + spans[-1] = (start, index, cell_length) + elif last_measured_character: + # variation selector 16 + index += 1 + if spans: + start, _end, cell_length = spans[-1] + if last_measured_character in cell_table.narrow_to_wide: + last_measured_character = None + cell_length += 1 + total_width += 1 + spans[-1] = (start, index, cell_length) + continue + + if character_width := get_character_cell_size(character, unicode_version): + last_measured_character = character + spans.append((index, index := index + 1, character_width)) + total_width += character_width + elif spans: + # zero width characters are associated with the previous character + start, _end, cell_length = spans[-1] + spans[-1] = (start, index := index + 1, cell_length) + + return (spans, total_width) + + +def _split_text( + text: str, cell_position: int, unicode_version: str = "auto" +) -> tuple[str, str]: + """Split text by cell position. + + If the cell position falls within a double width character, it is converted to two spaces. + + Args: + text: Text to split. + cell_position Offset in cells. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + + Returns: + Tuple to two split strings. + """ + if cell_position == 0: + return "", text + + spans, cell_length = split_graphemes(text, unicode_version) + + # Guess initial offset + offset = int((cell_position / cell_length) * len(spans)) + left_size = sum(map(_span_get_cell_len, spans[:offset])) + while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 + if left_size == cell_position: + split_index = spans[offset][0] + return text[:split_index], text[split_index:] + if left_size < cell_position: + start, end, cell_size = spans[offset] + if left_size + cell_size > cell_position: + return text[:start] + " ", " " + text[end:] + offset += 1 + left_size += cell_size else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 + start, end, cell_size = spans[offset] + if left_size - cell_size < cell_position: + return text[:start] + " ", " " + text[end:] + offset -= 1 + left_size -= cell_size -def set_cell_size(text: str, total: int) -> str: - """Set the length of a string to fit within given number of cells.""" +def split_text( + text: str, cell_position: int, unicode_version: str = "auto" +) -> tuple[str, str]: + """Split text by cell position. + + If the cell position falls within a double width character, it is converted to two spaces. + + Args: + text: Text to split. + cell_position Offset in cells. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + Returns: + Tuple to two split strings. + """ + if _is_single_cell_widths(text): + return text[:cell_position], text[cell_position:] + return _split_text(text, cell_position, unicode_version) + + +def set_cell_size(text: str, total: int, unicode_version: str = "auto") -> str: + """Adjust a string by cropping or padding with spaces such that it fits within the given number of cells. + + Args: + text: String to adjust. + total: Desired size in cells. + unicode_version: Unicode version. + + Returns: + A string with cell size equal to total. + """ 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) @@ -109,29 +277,11 @@ def set_cell_size(text: str, total: int) -> str: return text if cell_size < total: return text + " " * (total - cell_size) + text, _ = _split_text(text, total, unicode_version) + return text - 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]: +def chop_cells(text: str, width: int, unicode_version: str = "auto") -> list[str]: """Split text into lines such that each line fits within the available (cell) width. Args: @@ -142,33 +292,178 @@ def chop_cells( 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 + if _is_single_cell_widths(text): + return [text[index : index + width] for index in range(0, len(text), width)] + spans, _ = split_graphemes(text, unicode_version) + line_size = 0 # Size of line in cells + lines: list[str] = [] + line_offset = 0 # Offset (in codepoints) of start of line + for start, end, cell_size in spans: + if line_size + cell_size > width: + lines.append(text[line_offset:start]) + line_offset = start + line_size = 0 + line_size += cell_size + if line_size: + lines.append(text[line_offset:]) + + return lines + + +class CellString: + """A string-like object that takes graphemes into account.""" + + def __init__( + self, + text: str, + *, + cell_length: int | None = None, + spans: "list[CellSpan] | None" = None, + unicode_version: str = "auto", + ): + """ + + Args: + text: The plain text. + cell_length: The cell length (as it appears in the terminal), if known. + spans: List of spans which divide the text in to atomic units (single glyphs). + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + """ + self._text = text + self._singles: bool = _is_single_cell_widths(text) + if cell_length is None: + self._cell_length = len(text) if self._singles else None + else: + self._cell_length = cell_length + self._spans: "list[CellSpan] | None" = spans + self._unicode_version = unicode_version + + @property + def text(self) -> str: + """The raw text.""" + return self._text + + @property + def spans(self) -> "list[CellSpan]": + if self._spans is None: + if self._singles: + self._spans = [ + (index, index + 1, 1) for index in range(len(self._text)) + ] + else: + self._spans, self._cell_length = split_graphemes( + self._text, self._unicode_version + ) + return self._spans + + @property + def cell_length(self) -> int: + """The 'cell' length (length as displayed in the terminal).""" + if self._cell_length is None: + self._cell_length = cell_len(self._text) + return self._cell_length + + @property + def glyphs(self) -> list[str]: + """List of strings that make up atomic glyph.""" + text = self._text + glyphs = [text[start:end] for start, end, _ in self.spans] + return glyphs + + @property + def glyph_widths(self) -> list[tuple[str, int]]: + """List of strings that make up atomic glyph, and corresponding cell width.""" + text = self._text + glyph_widths = [ + (text[start:end], cell_length) for start, end, cell_length in self.spans + ] + return glyph_widths + + def __bool__(self) -> bool: + return bool(self._text) + + def __hash__(self) -> int: + return hash(self._text) + + def __eq__(self, other: object) -> bool: + if isinstance(other, CellString): + return self._text == other._text + return NotImplemented + + def __add__(self, other: "CellString") -> "CellString": + if self._singles and other._singles: + return CellString(self._text + other._text) + spans: "list[CellSpan] | None" + if self._spans is not None and other._spans is not None: + self_length = len(self._text) + spans = [ + *self._spans, + *[ + (start + self_length, end + self_length, cell_length) + for start, end, cell_length in other.spans + ], + ] + else: + spans = None + return CellString(self._text + other._text, spans=spans) + + def __iter__(self) -> Iterator[str]: + if self._singles: + return iter(self._text) + + def iterate_text(text: str, spans: "list[CellSpan]") -> Generator[str]: + """Generator for the""" + for start, end, _ in spans: + yield text[start:end] + + return iter(iterate_text(self._text, self.spans)) + + def __reversed__(self) -> Iterator[str]: + if self._singles: + return reversed(self._text) + + def iterate_text(text: str, spans: "list[CellSpan]"): + for start, end, _ in reversed(spans): + yield text[start:end] + + return iter(iterate_text(self._text, self.spans)) + + def __getitem__(self, index: int | slice) -> str: + if self._singles: + # Trivial case of single cell character strings + return self._text[index] + if isinstance(index, int): + # Single span is easy + start, end, _cell_length = self.spans[index] + return self._text[start:end] + + start, stop, stride = index.indices(len(self.spans)) + if stride == 1: + # Fast path for a stride of 1 + start_offset = self.spans[start][0] + stop_offset = self.spans[stop][1] + return self._text[start_offset:stop_offset] + else: + # More involved case of a stride > 1 + span_offset = start + output: list[str] = [] + while span_offset <= stop: + start_offset, end_offset, _ = self.spans[span_offset] + output.append(self._text[start_offset:end_offset]) + span_offset += stride + return "".join(output) - 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 +if __name__ == "__main__": + from rich import print - return ["".join(line) for line in lines] + print(CellString("Hello World").glyphs) + print(CellString("Female mechanic: 👩\u200d🔧").glyphs) + print(CellString("Female mechanic: 👩\u200d🔧").glyph_widths) -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) + left, right = split_text("Hello 👩\u200d🔧 World", 9) + print(repr(left)) + print(repr(right)) + print(left) + print(right) diff --git a/tests/test_cells.py b/tests/test_cells.py index 8ba8169e3..51376e909 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -1,7 +1,9 @@ import string +import pytest + from rich import cells -from rich.cells import _is_single_cell_widths, chop_cells +from rich.cells import CellSpan, _is_single_cell_widths, chop_cells, split_graphemes def test_cell_len_long_string(): @@ -79,3 +81,24 @@ def test_is_single_cell_widths() -> None: for character in "わさび": assert not _is_single_cell_widths(character) + + +@pytest.mark.parametrize( + "text,expected_spans,expected_cell_length", + [ + ("", [], 0), + ("a", [(0, 1, 1)], 1), + ("ab", [(0, 1, 1), (1, 2, 1)], 2), + ("💩", [(0, 1, 2)], 2), + ("わさび", [(0, 1, 2), (1, 2, 2), (2, 3, 2)], 6), + ("👩\u200d🔧", [(0, 3, 2)], 2), + ("a👩\u200d🔧", [(0, 1, 1), (1, 4, 2)], 3), + ("a👩\u200d🔧b", [(0, 1, 1), (1, 4, 2), (4, 5, 1)], 4), + ], +) +def test_split_graphemes( + text: str, expected_spans: list[CellSpan], expected_cell_length: int +): + spans, cell_length = split_graphemes(text) + assert spans == expected_spans + assert cell_length == expected_cell_length diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py index d49a4d7e2..f3a7047be 100644 --- a/tools/make_width_tables.py +++ b/tools/make_width_tables.py @@ -6,7 +6,7 @@ from wcwidth.table_wide import WIDE_EASTASIAN from wcwidth.table_zero import ZERO_WIDTH -from rich.cell_string import CellTable +from rich.cells import CellTable UNICODE_VERSIONS: list[str] = list_versions() @@ -38,7 +38,7 @@ table_file = f"""# Auto generated by tools/make_width_tables.py -from rich.cell_string import CellTable +from rich.cells import CellTable cell_table = {cell_table!r} """ From 494ce86a0d7338fb34bc45b96ef4880990a15ece Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 15:53:39 +0000 Subject: [PATCH 028/100] tables and tests --- rich/_unicode_data/unicode10-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode11-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode12-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode12-1-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode13-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode14-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode15-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode15-1-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode16-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode17-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode4-1-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode5-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode5-1-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode5-2-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode6-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode6-1-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode6-2-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode6-3-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode7-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode8-0-0.py | 313 +++++++++++++++++++--------- rich/_unicode_data/unicode9-0-0.py | 313 +++++++++++++++++++--------- rich/cells.py | 4 +- tests/test_cells.py | 20 +- tools/make_width_tables.py | 4 +- 24 files changed, 4496 insertions(+), 2105 deletions(-) diff --git a/rich/_unicode_data/unicode10-0-0.py b/rich/_unicode_data/unicode10-0-0.py index ee42a2539..a09d64bcb 100644 --- a/rich/_unicode_data/unicode10-0-0.py +++ b/rich/_unicode_data/unicode10-0-0.py @@ -394,106 +394,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode11-0-0.py b/rich/_unicode_data/unicode11-0-0.py index 05a2bd286..bc03c12f0 100644 --- a/rich/_unicode_data/unicode11-0-0.py +++ b/rich/_unicode_data/unicode11-0-0.py @@ -409,106 +409,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode12-0-0.py b/rich/_unicode_data/unicode12-0-0.py index 56177d066..051ec577b 100644 --- a/rich/_unicode_data/unicode12-0-0.py +++ b/rich/_unicode_data/unicode12-0-0.py @@ -421,106 +421,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode12-1-0.py b/rich/_unicode_data/unicode12-1-0.py index 99ececb78..5d9e47a6b 100644 --- a/rich/_unicode_data/unicode12-1-0.py +++ b/rich/_unicode_data/unicode12-1-0.py @@ -420,106 +420,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode13-0-0.py b/rich/_unicode_data/unicode13-0-0.py index 39ed90aa3..518eaf687 100644 --- a/rich/_unicode_data/unicode13-0-0.py +++ b/rich/_unicode_data/unicode13-0-0.py @@ -432,106 +432,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode14-0-0.py b/rich/_unicode_data/unicode14-0-0.py index 189865876..0caa82ac9 100644 --- a/rich/_unicode_data/unicode14-0-0.py +++ b/rich/_unicode_data/unicode14-0-0.py @@ -446,106 +446,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode15-0-0.py b/rich/_unicode_data/unicode15-0-0.py index 6c3f2cf2d..ee7625915 100644 --- a/rich/_unicode_data/unicode15-0-0.py +++ b/rich/_unicode_data/unicode15-0-0.py @@ -456,106 +456,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode15-1-0.py b/rich/_unicode_data/unicode15-1-0.py index c8749d74a..fe2eccfe6 100644 --- a/rich/_unicode_data/unicode15-1-0.py +++ b/rich/_unicode_data/unicode15-1-0.py @@ -455,106 +455,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode16-0-0.py b/rich/_unicode_data/unicode16-0-0.py index 8f5ca49ce..1cf0848e3 100644 --- a/rich/_unicode_data/unicode16-0-0.py +++ b/rich/_unicode_data/unicode16-0-0.py @@ -468,106 +468,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode17-0-0.py b/rich/_unicode_data/unicode17-0-0.py index 5c86e6ea7..3fde3d0ff 100644 --- a/rich/_unicode_data/unicode17-0-0.py +++ b/rich/_unicode_data/unicode17-0-0.py @@ -476,106 +476,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode4-1-0.py b/rich/_unicode_data/unicode4-1-0.py index 86438bc23..75cf1af89 100644 --- a/rich/_unicode_data/unicode4-1-0.py +++ b/rich/_unicode_data/unicode4-1-0.py @@ -186,106 +186,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode5-0-0.py b/rich/_unicode_data/unicode5-0-0.py index e6f07b323..4a9dd84cc 100644 --- a/rich/_unicode_data/unicode5-0-0.py +++ b/rich/_unicode_data/unicode5-0-0.py @@ -191,106 +191,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode5-1-0.py b/rich/_unicode_data/unicode5-1-0.py index 308d5702d..b8bf50486 100644 --- a/rich/_unicode_data/unicode5-1-0.py +++ b/rich/_unicode_data/unicode5-1-0.py @@ -214,106 +214,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode5-2-0.py b/rich/_unicode_data/unicode5-2-0.py index 6e3eaadf6..149a7e659 100644 --- a/rich/_unicode_data/unicode5-2-0.py +++ b/rich/_unicode_data/unicode5-2-0.py @@ -242,106 +242,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode6-0-0.py b/rich/_unicode_data/unicode6-0-0.py index 271c2d975..665e63706 100644 --- a/rich/_unicode_data/unicode6-0-0.py +++ b/rich/_unicode_data/unicode6-0-0.py @@ -250,106 +250,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode6-1-0.py b/rich/_unicode_data/unicode6-1-0.py index fb01a1c69..d6eb29fa2 100644 --- a/rich/_unicode_data/unicode6-1-0.py +++ b/rich/_unicode_data/unicode6-1-0.py @@ -261,106 +261,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode6-2-0.py b/rich/_unicode_data/unicode6-2-0.py index 6e2178c27..6027e3596 100644 --- a/rich/_unicode_data/unicode6-2-0.py +++ b/rich/_unicode_data/unicode6-2-0.py @@ -261,106 +261,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode6-3-0.py b/rich/_unicode_data/unicode6-3-0.py index 36af2259e..16d7388e2 100644 --- a/rich/_unicode_data/unicode6-3-0.py +++ b/rich/_unicode_data/unicode6-3-0.py @@ -262,106 +262,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode7-0-0.py b/rich/_unicode_data/unicode7-0-0.py index f82eec87b..575147ece 100644 --- a/rich/_unicode_data/unicode7-0-0.py +++ b/rich/_unicode_data/unicode7-0-0.py @@ -288,106 +288,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode8-0-0.py b/rich/_unicode_data/unicode8-0-0.py index 796838678..42c390db9 100644 --- a/rich/_unicode_data/unicode8-0-0.py +++ b/rich/_unicode_data/unicode8-0-0.py @@ -296,106 +296,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/_unicode_data/unicode9-0-0.py b/rich/_unicode_data/unicode9-0-0.py index 206420250..b6666d634 100644 --- a/rich/_unicode_data/unicode9-0-0.py +++ b/rich/_unicode_data/unicode9-0-0.py @@ -381,106 +381,219 @@ ], narrow_to_wide=frozenset( { - 9728, - 9729, - 9730, - 9731, - 11013, - 11014, - 9992, - 9996, - 9762, - 127780, - 127781, - 127782, - 127783, - 127784, - 127785, - 127786, - 127787, - 9774, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 9784, - 9785, - 10035, - 10548, - 128329, - 9823, - 10083, - 9829, - 128367, - 127344, - 128371, - 128372, - 128373, - 128374, - 128375, - 128376, - 127358, - 128394, - 128395, - 128396, - 9876, - 9877, - 9878, - 8596, - 8597, - 8598, - 8599, - 9883, - 8600, - 127894, - 127897, - 127898, - 127902, - 8617, - 9642, - 9904, - 128433, - 128450, - 128451, - 127947, - 127948, - 128717, - 128718, - 127949, - 128465, - 128466, - 127956, - 127957, - 127958, - 127959, - 127960, - 127961, - 127962, - 127963, - 127964, - 127965, - 127966, - 128476, - 128736, - 128737, - 128738, - 128739, - 128740, - 128477, - 9208, - 9197, - 9198, - 9968, - 9201, - 9975, - 9976, - 9209, - 9723, + "🏗", + "📽", + "🗒", + "🗜", + "♀", + "🎟", + "🛣", + "⏭", + "ℹ", + "☂", + "☺", + "🎙", + "⏸", + "➡", + "☃", + "🖲", + "☝", + "🛠", + "✳", + "▶", + "⚠", + "🛰", + "⛈", + "6", + "🅿", + "🎖", + "⛑", + "🛩", + "☪", + "🕳", + "9", + "🏷", + "☀", + "☸", + "♨", + "⬅", + "❇", + "🗨", + "♦", + "#", + "✏", + "⏹", + "♟", + "🕉", + "🗓", + "🌶", + "⏺", + "☘", + "‼", + "🌩", + "🗑", + "☯", + "🕴", + "✴", + "☢", + "🖼", + "🌫", + "🕵", + "⚧", + "🍽", + "🗄", + "✔", + "🗡", + "⏲", + "🌡", + "🖋", + "🛳", + "🛋", + "☁", + "👁", + "Ⓜ", + "↕", + "🏛", + "⏯", + "7", + "🏖", + "⏱", + "*", + "🗝", + "✍", + "🖌", + "↖", + "⛹", + "🏙", + "❄", + "🎚", + "🏚", + "⁉", + "🏔", + "🐿", + "🏕", + "™", + "1", + "🛤", + "🅱", + "🖊", + "⚱", + "⛸", + "🏳", + "🛍", + "⬇", + "🅰", + "⛩", + "🗳", + "↙", + "🗂", + "⛴", + "🏋", + "🌦", + "®", + "🗞", + "♠", + "⤴", + "✈", + "🎞", + "⚕", + "⛏", + "🕸", + "🛥", + "⚜", + "☮", + "🗯", + "✡", + "⏮", + "⚰", + "3", + "▫", + "🏍", + "✝", + "↘", + "↪", + "⚛", + "🖇", + "✖", + "🛢", + "🎛", + "8", + "↗", + "🛡", + "☣", + "⛰", + "❣", + "✂", + "☑", + "⚙", + "⤵", + "♻", + "🌪", + "🖐", + "🕯", + "✉", + "4", + "✒", + "🌤", + "🏟", + "♂", + "🕰", + "🛎", + "🎗", + "🕹", + "5", + "⚒", + "❤", + "🖍", + "⚔", + "⚖", + "🖱", + "🕊", + "↔", + "2", + "🕷", + "🅾", + "☹", + "🖥", + "⛷", + "🏜", + "☎", + "🏌", + "♾", + "🛏", + "⌨", + "🏎", + "🏵", + "🖨", + "♥", + "◻", + "🌥", + "☄", + "◼", + "⛱", + "✌", + "↩", + "©", + "⏏", + "🏝", + "🌧", + "☠", + "⬆", + "🏘", + "🗃", + "▪", + "☦", + "0", + "🌨", + "🗣", + "🗺", + "🏞", + "🕶", + "🌬", + "♣", + "⚗", + "◀", + "⛓", } ), ) diff --git a/rich/cells.py b/rich/cells.py index 145828394..07faad966 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -38,7 +38,7 @@ class CellTable(NamedTuple): unicode_version: str widths: Sequence[tuple[int, int, int]] - narrow_to_wide: frozenset[int] + narrow_to_wide: frozenset[str] def __hash__(self) -> int: return hash(self.unicode_version) @@ -104,12 +104,14 @@ def cell_len(text: str, unicode_version: str = "auto") -> int: Returns: Length of string in terminal cells. """ + if _is_single_cell_widths(text): return len(text) # "\u200d" is zero width joiner # "\ufe0f" is variation selector 16 if "\u200d" not in text and "\ufe0f" not in text: + # Simplest case with no unicode stuff that changes the size return sum( get_character_cell_size(character, unicode_version) for character in text ) diff --git a/tests/test_cells.py b/tests/test_cells.py index 51376e909..ea1c849e2 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -3,7 +3,13 @@ import pytest from rich import cells -from rich.cells import CellSpan, _is_single_cell_widths, chop_cells, split_graphemes +from rich.cells import ( + CellSpan, + _is_single_cell_widths, + cell_len, + chop_cells, + split_graphemes, +) def test_cell_len_long_string(): @@ -91,14 +97,24 @@ def test_is_single_cell_widths() -> None: ("ab", [(0, 1, 1), (1, 2, 1)], 2), ("💩", [(0, 1, 2)], 2), ("わさび", [(0, 1, 2), (1, 2, 2), (2, 3, 2)], 6), - ("👩\u200d🔧", [(0, 3, 2)], 2), + ( + "👩\u200d🔧", + [(0, 3, 2)], + 2, + ), # 3 code points for female mechanic: female, joiner, spanner ("a👩\u200d🔧", [(0, 1, 1), (1, 4, 2)], 3), ("a👩\u200d🔧b", [(0, 1, 1), (1, 4, 2), (4, 5, 1)], 4), + ("⬇", [(0, 1, 1)], 1), + ("⬇️", [(0, 2, 2)], 2), # Variation selector, makes it double width + ("♻", [(0, 1, 1)], 1), + ("♻️", [(0, 2, 2)], 2), + ("♻♻️", [(0, 1, 1), (1, 3, 2)], 3), ], ) def test_split_graphemes( text: str, expected_spans: list[CellSpan], expected_cell_length: int ): spans, cell_length = split_graphemes(text) + assert cell_len(text) == expected_cell_length assert spans == expected_spans assert cell_length == expected_cell_length diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py index f3a7047be..67700402b 100644 --- a/tools/make_width_tables.py +++ b/tools/make_width_tables.py @@ -20,9 +20,9 @@ init_file.write(init) -narrow_to_wide: set[int] = set() +narrow_to_wide: set[str] = set() for start, end in VS16_NARROW_TO_WIDE["9.0.0"]: - narrow_to_wide.update(range(start, end)) + narrow_to_wide.update(chr(codepoint) for codepoint in range(start, end + 1)) for version in UNICODE_VERSIONS: table: list[tuple[int, int, int]] = [] From 69cd81882b163cd7823621825b95603b4f49e4a6 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 15:57:19 +0000 Subject: [PATCH 029/100] remove reference to cell strings --- rich/_unicode_data/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index 1127c88d8..3e21ca06e 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -9,7 +9,7 @@ from rich._unicode_data._versions import VERSIONS if TYPE_CHECKING: - from rich.cell_string import CellTable + from rich.cells import CellTable VERSION_ORDER = sorted( [ From 7d4a115d8b9b641de0ae38a0fd9c1a855d2ab672 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:06:21 +0000 Subject: [PATCH 030/100] fix typing --- rich/_unicode_data/__init__.py | 10 ++++++---- rich/cells.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index 3e21ca06e..cd3cf5b1a 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -4,7 +4,7 @@ import os from functools import cache from importlib import import_module -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, cast from rich._unicode_data._versions import VERSIONS @@ -19,7 +19,7 @@ for version in VERSIONS ] ) -VERSION_SET = frozenset(VERSION_ORDER) +VERSION_SET = frozenset(VERSIONS) def _parse_version(version: str) -> tuple[int, int, int]: @@ -34,6 +34,7 @@ def _parse_version(version: str) -> tuple[int, int, int]: Returns: A tuple of 3 integers. """ + version_integers: tuple[int, ...] try: version_integers = tuple( map(int, version.split(".")), @@ -43,8 +44,8 @@ def _parse_version(version: str) -> tuple[int, int, int]: f"unicode version string {version!r} is badly formatted" ) from None while len(version_integers) < 3: - version_integers = (version_integers, 0) - triple = version_integers[:3] + version_integers = version_integers + (0,) + triple = cast("tuple[int, int, int]", version_integers[:3]) return triple @@ -80,4 +81,5 @@ def load(unicode_version: str = "auto") -> CellTable: version_path_component = version.replace(".", "-") module_name = f".unicode{version_path_component}" module = import_module(module_name, "rich._unicode_data") + assert isinstance(module.cell_table, CellTable) return module.cell_table diff --git a/rich/cells.py b/rich/cells.py index 07faad966..4411b3dcc 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -424,7 +424,7 @@ def __reversed__(self) -> Iterator[str]: if self._singles: return reversed(self._text) - def iterate_text(text: str, spans: "list[CellSpan]"): + def iterate_text(text: str, spans: "list[CellSpan]") -> Generator[str]: for start, end, _ in reversed(spans): yield text[start:end] From 230fdacb8b4ba28d2f4379812e329f2198a10a6a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:30:48 +0000 Subject: [PATCH 031/100] test --- rich/_unicode_data/__init__.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index cd3cf5b1a..ac9a6ac8e 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -69,17 +69,19 @@ def load(unicode_version: str = "auto") -> CellTable: if unicode_version == "latest": version = VERSIONS[-1] else: - if unicode_version in VERSION_SET: - version = unicode_version - else: - unicode_version_integers = _parse_version(unicode_version) - insert_position = bisect.bisect_left( - VERSION_ORDER, unicode_version_integers - ) + try: + version_numbers = _parse_version(unicode_version) + except ValueError: + version_numbers = _parse_version(VERSIONS[-1]) + major, minor, patch = version_numbers + version = f"{major}.{minor}.{patch}" + if version not in VERSION_SET: + insert_position = bisect.bisect_left(VERSION_ORDER, version_numbers) version = VERSIONS[max(0, insert_position - 1)] version_path_component = version.replace(".", "-") module_name = f".unicode{version_path_component}" module = import_module(module_name, "rich._unicode_data") - assert isinstance(module.cell_table, CellTable) + if TYPE_CHECKING: + assert isinstance(module.cell_table, CellTable) return module.cell_table From de762586f168907b2dd2092b49f0021d3579423e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:36:05 +0000 Subject: [PATCH 032/100] tests for unicode data --- tests/test_unicode_data.py | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/test_unicode_data.py diff --git a/tests/test_unicode_data.py b/tests/test_unicode_data.py new file mode 100644 index 000000000..4e48bbb19 --- /dev/null +++ b/tests/test_unicode_data.py @@ -0,0 +1,56 @@ +import pytest + +from rich._unicode_data import _parse_version, load + + +@pytest.mark.parametrize( + "version_str,version_tuple", + [ + ("1", (1, 0, 0)), + ("1.0", (1, 0, 0)), + ("1.2", (1, 2, 0)), + ("1.2.3", (1, 2, 3)), + ], +) +def test_parse_version(version_str: str, version_tuple: tuple[str, ...]) -> None: + assert _parse_version(version_str) == version_tuple + + +@pytest.mark.parametrize( + "version_in,version_selected", + [ + # Lower versions will pick the first (4.1.0) + ("0", "4.1.0"), + ("1", "4.1.0"), + ("1.0", "4.1.0"), + ("1.0.0", "4.1.0"), + ("4.0.0", "4.1.0"), + ("4.0.2", "4.1.0"), + ("4.1.0", "4.1.0"), + ("4.1.1", "4.1.0"), + ("4.2.1", "4.1.0"), + # Nearest version lower + ("5", "5.0.0"), + ("5.0", "5.0.0"), + ("5.0.0", "5.0.0"), + ("5.0.1", "5.0.0"), + ("5.1.0", "5.1.0"), + ("5.1.1", "5.1.0"), + # Maximum version if greater than the maximum + ("17.0.0", "17.0.0"), + ("17.0.1", "17.0.0"), + ("17.1.0", "17.0.0"), + # Greater than the maximum + ("18.0.0", "17.0.0"), + ], +) +def test_load_version(version_in: str, version_selected: str) -> None: + """Test that load will pick the nearest lower version if it exists, or the lowest version if below the first available version.""" + assert load(version_in).unicode_version == version_selected + + +def test_load_version_invalid() -> None: + """Check that invalid versions load the latest unicode data.""" + assert load("foo").unicode_version == "17.0.0" + assert load("a.b.c").unicode_version == "17.0.0" + assert load("1.2.3a").unicode_version == "17.0.0" From 263d25b8e1419c38c57694a4ed8c60f8ae73008a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:38:08 +0000 Subject: [PATCH 033/100] future --- rich/cells.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rich/cells.py b/rich/cells.py index 4411b3dcc..219612ef5 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from functools import lru_cache from operator import itemgetter from typing import Callable, Generator, Iterator, NamedTuple, Sequence From b63cb57e4d9a287753c284a6b4886c064bf99c78 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:41:43 +0000 Subject: [PATCH 034/100] py3.8 fix --- rich/_unicode_data/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index ac9a6ac8e..b2659b5fe 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -2,7 +2,13 @@ import bisect import os -from functools import cache + +try: + from functools import cache +except ImportError: + # No cache in Python 3.8, lru_cache works here too + from functools import lru_cache as cache + from importlib import import_module from typing import TYPE_CHECKING, cast From c7778bc68638fca6dae3fb64f47ed4c441615e9f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:46:31 +0000 Subject: [PATCH 035/100] typing issues --- rich/_unicode_data/__init__.py | 4 ++-- rich/cells.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index b2659b5fe..7139601c0 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -4,7 +4,7 @@ import os try: - from functools import cache + from functools import cache # type: ignore[attr-defined] except ImportError: # No cache in Python 3.8, lru_cache works here too from functools import lru_cache as cache @@ -55,7 +55,7 @@ def _parse_version(version: str) -> tuple[int, int, int]: return triple -@cache +@cache # type: ignore[misc] def load(unicode_version: str = "auto") -> CellTable: """Load a cell table for the given unicode version. diff --git a/rich/cells.py b/rich/cells.py index 219612ef5..b1751088c 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -6,7 +6,7 @@ from rich._unicode_data import load as load_cell_table -CellSpan = tuple[int, int, int] +CellSpan = "tuple[int, int, int]" _span_get_cell_len = itemgetter(2) From 0d7f2ab7c54f32b79067133eb5bc97b8865fbf66 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:53:30 +0000 Subject: [PATCH 036/100] alternative typing --- rich/_unicode_data/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index 7139601c0..e48fbd090 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -2,12 +2,12 @@ import bisect import os +import sys -try: - from functools import cache # type: ignore[attr-defined] -except ImportError: - # No cache in Python 3.8, lru_cache works here too +if sys.version_info == (3, 8): from functools import lru_cache as cache +else: + from functools import cache from importlib import import_module from typing import TYPE_CHECKING, cast @@ -55,7 +55,7 @@ def _parse_version(version: str) -> tuple[int, int, int]: return triple -@cache # type: ignore[misc] +@cache def load(unicode_version: str = "auto") -> CellTable: """Load a cell table for the given unicode version. From ee796e1a0606a0820c6b13c0bf9b22c1e8c4c0bb Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 17:58:34 +0000 Subject: [PATCH 037/100] typing --- rich/cells.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index b1751088c..ab343d307 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -2,11 +2,11 @@ from functools import lru_cache from operator import itemgetter -from typing import Callable, Generator, Iterator, NamedTuple, Sequence +from typing import Callable, Generator, Iterator, NamedTuple, Sequence, Tuple from rich._unicode_data import load as load_cell_table -CellSpan = "tuple[int, int, int]" +CellSpan = Tuple[int, int, int] _span_get_cell_len = itemgetter(2) From 19a6fada99b1012cf6925e46910052e260434d25 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 20 Jan 2026 18:29:24 +0000 Subject: [PATCH 038/100] typing --- rich/_unicode_data/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index e48fbd090..352478662 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -4,10 +4,10 @@ import os import sys -if sys.version_info == (3, 8): - from functools import lru_cache as cache -else: +if sys.version_info >= (3, 9): from functools import cache +else: + from functools import lru_cache as cache from importlib import import_module from typing import TYPE_CHECKING, cast From 786e9de79413ff57ddccf382729ff4f14796db36 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Wed, 21 Jan 2026 13:56:15 +0000 Subject: [PATCH 039/100] mypy fix --- rich/_unicode_data/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index 352478662..da7f13939 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -4,7 +4,7 @@ import os import sys -if sys.version_info >= (3, 9): +if sys.version_info[:2] >= (3, 9): from functools import cache else: from functools import lru_cache as cache From d09cc4f6d51c0787bb6f9d631dc6a91363aac58d Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Wed, 21 Jan 2026 14:02:19 +0000 Subject: [PATCH 040/100] typing --- tests/test_cells.py | 2 ++ tests/test_unicode_data.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/test_cells.py b/tests/test_cells.py index ea1c849e2..2ead9dfab 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import string import pytest diff --git a/tests/test_unicode_data.py b/tests/test_unicode_data.py index 4e48bbb19..8d0923e12 100644 --- a/tests/test_unicode_data.py +++ b/tests/test_unicode_data.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from rich._unicode_data import _parse_version, load From f924a21a314420a723a94a8d10b769dc855a67ec Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:07:03 +0000 Subject: [PATCH 041/100] tests --- rich/__main__.py | 5 +- rich/_unicode_data/__init__.py | 2 +- rich/cells.py | 174 ++------------------------------- tests/test_cells.py | 61 ++++++++++++ tests/test_text.py | 22 +++++ tests/test_unicode_data.py | 8 +- 6 files changed, 101 insertions(+), 171 deletions(-) diff --git a/rich/__main__.py b/rich/__main__.py index 06683305d..495c933d7 100644 --- a/rich/__main__.py +++ b/rich/__main__.py @@ -238,8 +238,9 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: "[b magenta]Hope you enjoy using Rich![/]\n\n" "Please consider sponsoring me if you get value from my work.\n\n" "Even the price of a ☕ can brighten my day!\n\n" - "https://github.com/sponsors/willmcgugan", - border_style="red", + "[cyan]https://github.com/sponsors/willmcgugan[/cyan]", + border_style="green", title="Help ensure Rich is maintained", + padding=(1, 2), ) ) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index da7f13939..1689215c0 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -7,7 +7,7 @@ if sys.version_info[:2] >= (3, 9): from functools import cache else: - from functools import lru_cache as cache + from functools import lru_cache as cache # pragma: no cover from importlib import import_module from typing import TYPE_CHECKING, cast diff --git a/rich/cells.py b/rich/cells.py index ab343d307..d3eda9c0b 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -2,7 +2,7 @@ from functools import lru_cache from operator import itemgetter -from typing import Callable, Generator, Iterator, NamedTuple, Sequence, Tuple +from typing import Callable, NamedTuple, Sequence, Tuple from rich._unicode_data import load as load_cell_table @@ -42,9 +42,6 @@ class CellTable(NamedTuple): widths: Sequence[tuple[int, int, int]] narrow_to_wide: frozenset[str] - def __hash__(self) -> int: - return hash(self.unicode_version) - @lru_cache(maxsize=4096) def get_character_cell_size(character: str, unicode_version: str = "auto") -> int: @@ -59,7 +56,7 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in """ codepoint = ord(character) table = load_cell_table(unicode_version).widths - if codepoint < table[0][0] or codepoint > table[-1][1]: + if codepoint > table[-1][1]: return 0 lower_bound = 0 upper_bound = len(table) - 1 @@ -211,7 +208,7 @@ def _split_text( Returns: Tuple to two split strings. """ - if cell_position == 0: + if cell_position <= 0: return "", text spans, cell_length = split_graphemes(text, unicode_version) @@ -222,6 +219,8 @@ def _split_text( while True: if left_size == cell_position: + if offset >= len(spans): + return text, "" split_index = spans[offset][0] return text[:split_index], text[split_index:] if left_size < cell_position: @@ -230,8 +229,8 @@ def _split_text( return text[:start] + " ", " " + text[end:] offset += 1 left_size += cell_size - else: - start, end, cell_size = spans[offset] + else: # left_size > cell_position + start, end, cell_size = spans[offset - 1] if left_size - cell_size < cell_position: return text[:start] + " ", " " + text[end:] offset -= 1 @@ -312,162 +311,3 @@ def chop_cells(text: str, width: int, unicode_version: str = "auto") -> list[str lines.append(text[line_offset:]) return lines - - -class CellString: - """A string-like object that takes graphemes into account.""" - - def __init__( - self, - text: str, - *, - cell_length: int | None = None, - spans: "list[CellSpan] | None" = None, - unicode_version: str = "auto", - ): - """ - - Args: - text: The plain text. - cell_length: The cell length (as it appears in the terminal), if known. - spans: List of spans which divide the text in to atomic units (single glyphs). - unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. - """ - self._text = text - self._singles: bool = _is_single_cell_widths(text) - if cell_length is None: - self._cell_length = len(text) if self._singles else None - else: - self._cell_length = cell_length - self._spans: "list[CellSpan] | None" = spans - self._unicode_version = unicode_version - - @property - def text(self) -> str: - """The raw text.""" - return self._text - - @property - def spans(self) -> "list[CellSpan]": - if self._spans is None: - if self._singles: - self._spans = [ - (index, index + 1, 1) for index in range(len(self._text)) - ] - else: - self._spans, self._cell_length = split_graphemes( - self._text, self._unicode_version - ) - return self._spans - - @property - def cell_length(self) -> int: - """The 'cell' length (length as displayed in the terminal).""" - if self._cell_length is None: - self._cell_length = cell_len(self._text) - return self._cell_length - - @property - def glyphs(self) -> list[str]: - """List of strings that make up atomic glyph.""" - text = self._text - glyphs = [text[start:end] for start, end, _ in self.spans] - return glyphs - - @property - def glyph_widths(self) -> list[tuple[str, int]]: - """List of strings that make up atomic glyph, and corresponding cell width.""" - text = self._text - glyph_widths = [ - (text[start:end], cell_length) for start, end, cell_length in self.spans - ] - return glyph_widths - - def __bool__(self) -> bool: - return bool(self._text) - - def __hash__(self) -> int: - return hash(self._text) - - def __eq__(self, other: object) -> bool: - if isinstance(other, CellString): - return self._text == other._text - return NotImplemented - - def __add__(self, other: "CellString") -> "CellString": - if self._singles and other._singles: - return CellString(self._text + other._text) - spans: "list[CellSpan] | None" - if self._spans is not None and other._spans is not None: - self_length = len(self._text) - spans = [ - *self._spans, - *[ - (start + self_length, end + self_length, cell_length) - for start, end, cell_length in other.spans - ], - ] - else: - spans = None - return CellString(self._text + other._text, spans=spans) - - def __iter__(self) -> Iterator[str]: - if self._singles: - return iter(self._text) - - def iterate_text(text: str, spans: "list[CellSpan]") -> Generator[str]: - """Generator for the""" - for start, end, _ in spans: - yield text[start:end] - - return iter(iterate_text(self._text, self.spans)) - - def __reversed__(self) -> Iterator[str]: - if self._singles: - return reversed(self._text) - - def iterate_text(text: str, spans: "list[CellSpan]") -> Generator[str]: - for start, end, _ in reversed(spans): - yield text[start:end] - - return iter(iterate_text(self._text, self.spans)) - - def __getitem__(self, index: int | slice) -> str: - if self._singles: - # Trivial case of single cell character strings - return self._text[index] - if isinstance(index, int): - # Single span is easy - start, end, _cell_length = self.spans[index] - return self._text[start:end] - - start, stop, stride = index.indices(len(self.spans)) - if stride == 1: - # Fast path for a stride of 1 - start_offset = self.spans[start][0] - stop_offset = self.spans[stop][1] - return self._text[start_offset:stop_offset] - else: - # More involved case of a stride > 1 - span_offset = start - output: list[str] = [] - while span_offset <= stop: - start_offset, end_offset, _ = self.spans[span_offset] - output.append(self._text[start_offset:end_offset]) - span_offset += stride - return "".join(output) - - -if __name__ == "__main__": - from rich import print - - print(CellString("Hello World").glyphs) - - print(CellString("Female mechanic: 👩\u200d🔧").glyphs) - print(CellString("Female mechanic: 👩\u200d🔧").glyph_widths) - - left, right = split_text("Hello 👩\u200d🔧 World", 9) - print(repr(left)) - print(repr(right)) - print(left) - print(right) diff --git a/tests/test_cells.py b/tests/test_cells.py index 2ead9dfab..84ff55f88 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -10,10 +10,27 @@ _is_single_cell_widths, cell_len, chop_cells, + get_character_cell_size, split_graphemes, + split_text, ) +@pytest.mark.parametrize( + "character,size", + [ + ("\0", 0), + ("\u200d", 0), + ("a", 1), + ("💩", 2), + (chr(917999 + 1), 0), + ], +) +def test_get_character_cell_size(character: str, size: int) -> None: + """Test single character cell size.""" + assert get_character_cell_size(character) == size + + def test_cell_len_long_string(): # Long strings don't use cached cell length implementation assert cells.cell_len("abc" * 200) == 3 * 200 @@ -55,6 +72,50 @@ def test_set_cell_size_infinite(): ) +FM = "👩\u200d🔧" + + +@pytest.mark.parametrize( + "text,offset,left,right", + [ + # Edge cases + ("", -1, "", ""), + ("x", -1, "", "x"), + ("x", 1, "x", ""), + ("x", 2, "x", ""), + ("", 0, "", ""), + ("", 1, "", ""), + ("a", 0, "", "a"), + ("a", 1, "a", ""), + # Check simple double width character + ("💩", 0, "", "💩"), + ("💩", 1, " ", " "), # Split in the middle of a double wide results in spaces + ("💩", 2, "💩", ""), + ("💩x", 1, " ", " x"), + ("💩x", 2, "💩", "x"), + ("💩x", 3, "💩x", ""), + # Check same for multi-codepoint emoji + (FM, 0, "", FM), + (FM, 1, " ", " "), # Split in the middle of a double wide results in spaces + (FM, 2, FM, ""), + (FM + "x", 1, " ", " x"), + (FM + "x", 2, FM, "x"), + (FM + "x", 3, FM + "x", ""), + # Edge cases + ("xxxxxxxxxxxxxxx💩💩", 10, "xxxxxxxxxx", "xxxxx💩💩"), + ("xxxxxxxxxxxxxxx💩💩", 15, "xxxxxxxxxxxxxxx", "💩💩"), + ("xxxxxxxxxxxxxxx💩💩", 16, "xxxxxxxxxxxxxxx ", " 💩"), + ("💩💩", 3, "💩 ", " "), + ("💩💩xxxxxxxxxx", 2, "💩", "💩xxxxxxxxxx"), + ("💩💩xxxxxxxxxx", 3, "💩 ", " xxxxxxxxxx"), + ("💩💩xxxxxxxxxx", 4, "💩💩", "xxxxxxxxxx"), + ], +) +def test_split_text(text: str, offset: int, left: str, right: str) -> None: + """Check that split_text works on grapheme boundaries""" + assert split_text(text, offset) == (left, right) + + def test_chop_cells(): """Simple example of splitting cells into lines of width 3.""" text = "abcdefghijk" diff --git a/tests/test_text.py b/tests/test_text.py index 925803343..93a98d7c0 100644 --- a/tests/test_text.py +++ b/tests/test_text.py @@ -525,6 +525,16 @@ def test_wrap_long(): assert lines[2] == Text("bra ") +def test_wrap_long_multi_codepoint(): + female_mechanic = "👩\u200d🔧" + text = Text(female_mechanic * 5, justify="left") + lines = text.wrap(Console(), 4) + assert len(lines) == 3 + assert lines[0] == Text(female_mechanic * 2) + assert lines[1] == Text(female_mechanic * 2) + assert lines[2] == Text(female_mechanic + " ") + + def test_wrap_overflow(): text = Text("Some more words") lines = text.wrap(Console(), 4, overflow="ellipsis") @@ -605,6 +615,18 @@ def test_wrap_multiple_consecutive_spaces(): ] +def test_wrap_multi_codepoint(): + """Test wrapping of multi-codepoint characters.""" + female_mechanic = "👩\u200d🔧" + text = Text(female_mechanic * 6 + " " + female_mechanic * 4) + lines = text.wrap(Console(), 12) + print(repr(lines)) + assert lines._lines == [ + Text(female_mechanic * 6), + Text(female_mechanic * 4), + ] + + def test_wrap_long_words_justify_left(): text = Text("X 123456789", justify="left") lines = text.wrap(Console(), 4) diff --git a/tests/test_unicode_data.py b/tests/test_unicode_data.py index 8d0923e12..4531f2ed1 100644 --- a/tests/test_unicode_data.py +++ b/tests/test_unicode_data.py @@ -2,7 +2,13 @@ import pytest -from rich._unicode_data import _parse_version, load +from rich._unicode_data import VERSIONS, _parse_version, load + + +def test_load(): + """Test all verions may be loaded.""" + for version in VERSIONS: + load(version) @pytest.mark.parametrize( From 3c8d89cf6b126b73c7fea89d93d6ab5f50a45a6d Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:09:48 +0000 Subject: [PATCH 042/100] old code --- rich/_cell_widths.py | 454 ---------------------------------- tools/make_terminal_widths.py | 89 ------- 2 files changed, 543 deletions(-) delete mode 100644 rich/_cell_widths.py delete mode 100644 tools/make_terminal_widths.py diff --git a/rich/_cell_widths.py b/rich/_cell_widths.py deleted file mode 100644 index 608ae3a75..000000000 --- a/rich/_cell_widths.py +++ /dev/null @@ -1,454 +0,0 @@ -# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = [ - (0, 0, 0), - (1, 31, -1), - (127, 159, -1), - (173, 173, 0), - (768, 879, 0), - (1155, 1161, 0), - (1425, 1469, 0), - (1471, 1471, 0), - (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, 1757, 0), - (1759, 1764, 0), - (1767, 1768, 0), - (1770, 1773, 0), - (1807, 1807, 0), - (1809, 1809, 0), - (1840, 1866, 0), - (1958, 1968, 0), - (2027, 2035, 0), - (2045, 2045, 0), - (2070, 2073, 0), - (2075, 2083, 0), - (2085, 2087, 0), - (2089, 2093, 0), - (2137, 2139, 0), - (2192, 2193, 0), - (2200, 2207, 0), - (2250, 2307, 0), - (2362, 2364, 0), - (2366, 2383, 0), - (2385, 2391, 0), - (2402, 2403, 0), - (2433, 2435, 0), - (2492, 2492, 0), - (2494, 2500, 0), - (2503, 2504, 0), - (2507, 2509, 0), - (2519, 2519, 0), - (2530, 2531, 0), - (2558, 2558, 0), - (2561, 2563, 0), - (2620, 2620, 0), - (2622, 2626, 0), - (2631, 2632, 0), - (2635, 2637, 0), - (2641, 2641, 0), - (2672, 2673, 0), - (2677, 2677, 0), - (2689, 2691, 0), - (2748, 2748, 0), - (2750, 2757, 0), - (2759, 2761, 0), - (2763, 2765, 0), - (2786, 2787, 0), - (2810, 2815, 0), - (2817, 2819, 0), - (2876, 2876, 0), - (2878, 2884, 0), - (2887, 2888, 0), - (2891, 2893, 0), - (2901, 2903, 0), - (2914, 2915, 0), - (2946, 2946, 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, 3203, 0), - (3260, 3260, 0), - (3262, 3268, 0), - (3270, 3272, 0), - (3274, 3277, 0), - (3285, 3286, 0), - (3298, 3299, 0), - (3315, 3315, 0), - (3328, 3331, 0), - (3387, 3388, 0), - (3390, 3396, 0), - (3398, 3400, 0), - (3402, 3405, 0), - (3415, 3415, 0), - (3426, 3427, 0), - (3457, 3459, 0), - (3530, 3530, 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, 3790, 0), - (3864, 3865, 0), - (3893, 3893, 0), - (3895, 3895, 0), - (3897, 3897, 0), - (3902, 3903, 0), - (3953, 3972, 0), - (3974, 3975, 0), - (3981, 3991, 0), - (3993, 4028, 0), - (4038, 4038, 0), - (4139, 4158, 0), - (4182, 4185, 0), - (4190, 4192, 0), - (4194, 4196, 0), - (4199, 4205, 0), - (4209, 4212, 0), - (4226, 4237, 0), - (4239, 4239, 0), - (4250, 4253, 0), - (4352, 4447, 2), - (4448, 4607, 0), - (4957, 4959, 0), - (5906, 5909, 0), - (5938, 5940, 0), - (5970, 5971, 0), - (6002, 6003, 0), - (6068, 6099, 0), - (6109, 6109, 0), - (6155, 6159, 0), - (6277, 6278, 0), - (6313, 6313, 0), - (6432, 6443, 0), - (6448, 6459, 0), - (6679, 6683, 0), - (6741, 6750, 0), - (6752, 6780, 0), - (6783, 6783, 0), - (6832, 6862, 0), - (6912, 6916, 0), - (6964, 6980, 0), - (7019, 7027, 0), - (7040, 7042, 0), - (7073, 7085, 0), - (7142, 7155, 0), - (7204, 7223, 0), - (7376, 7378, 0), - (7380, 7400, 0), - (7405, 7405, 0), - (7412, 7412, 0), - (7415, 7417, 0), - (7616, 7679, 0), - (8203, 8207, 0), - (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), - (8400, 8432, 0), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11503, 11505, 0), - (11647, 11647, 0), - (11744, 11775, 0), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 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), - (12783, 12830, 2), - (12832, 12871, 2), - (12880, 19903, 2), - (19968, 42124, 2), - (42128, 42182, 2), - (42607, 42610, 0), - (42612, 42621, 0), - (42654, 42655, 0), - (42736, 42737, 0), - (43010, 43010, 0), - (43014, 43014, 0), - (43019, 43019, 0), - (43043, 43047, 0), - (43052, 43052, 0), - (43136, 43137, 0), - (43188, 43205, 0), - (43232, 43249, 0), - (43263, 43263, 0), - (43302, 43309, 0), - (43335, 43347, 0), - (43360, 43388, 2), - (43392, 43395, 0), - (43443, 43456, 0), - (43493, 43493, 0), - (43561, 43574, 0), - (43587, 43587, 0), - (43596, 43597, 0), - (43643, 43645, 0), - (43696, 43696, 0), - (43698, 43700, 0), - (43703, 43704, 0), - (43710, 43711, 0), - (43713, 43713, 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), - (65040, 65049, 2), - (65056, 65071, 0), - (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), - (68097, 68099, 0), - (68101, 68102, 0), - (68108, 68111, 0), - (68152, 68154, 0), - (68159, 68159, 0), - (68325, 68326, 0), - (68900, 68903, 0), - (69291, 69292, 0), - (69373, 69375, 0), - (69446, 69456, 0), - (69506, 69509, 0), - (69632, 69634, 0), - (69688, 69702, 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, 69940, 0), - (69957, 69958, 0), - (70003, 70003, 0), - (70016, 70018, 0), - (70067, 70080, 0), - (70089, 70092, 0), - (70094, 70095, 0), - (70188, 70199, 0), - (70206, 70206, 0), - (70209, 70209, 0), - (70367, 70378, 0), - (70400, 70403, 0), - (70459, 70460, 0), - (70462, 70468, 0), - (70471, 70472, 0), - (70475, 70477, 0), - (70487, 70487, 0), - (70498, 70499, 0), - (70502, 70508, 0), - (70512, 70516, 0), - (70709, 70726, 0), - (70750, 70750, 0), - (70832, 70851, 0), - (71087, 71093, 0), - (71096, 71104, 0), - (71132, 71133, 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, 72249, 0), - (72251, 72254, 0), - (72263, 72263, 0), - (72273, 72283, 0), - (72330, 72345, 0), - (72751, 72758, 0), - (72760, 72767, 0), - (72850, 72871, 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), - (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, 0), - (94208, 100343, 2), - (100352, 101589, 2), - (101632, 101640, 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), - (113824, 113827, 0), - (118528, 118573, 0), - (118576, 118598, 0), - (119141, 119145, 0), - (119149, 119170, 0), - (119173, 119179, 0), - (119210, 119213, 0), - (119362, 119364, 0), - (121344, 121398, 0), - (121403, 121452, 0), - (121461, 121461, 0), - (121476, 121476, 0), - (121499, 121503, 0), - (121505, 121519, 0), - (122880, 122886, 0), - (122888, 122904, 0), - (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), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 127994, 2), - (127995, 127999, 0), - (128000, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (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, 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), -] diff --git a/tools/make_terminal_widths.py b/tools/make_terminal_widths.py deleted file mode 100644 index 1e5568346..000000000 --- a/tools/make_terminal_widths.py +++ /dev/null @@ -1,89 +0,0 @@ -import subprocess -from typing import List, Tuple -import sys - -from rich.progress import Progress - -from wcwidth import wcwidth - - -progress = Progress() - - -def make_widths_table() -> List[Tuple[int, int, int]]: - table: List[Tuple[int, int, int]] = [] - append = table.append - - make_table_task = progress.add_task("Calculating table...") - - widths = ( - (codepoint, wcwidth(chr(codepoint))) - for codepoint in range(0, sys.maxunicode + 1) - ) - - _widths = [(codepoint, width) for codepoint, width in widths if width != 1] - iter_widths = iter(_widths) - - endpoint, group_cell_size = next(iter_widths) - start_codepoint = end_codepoint = endpoint - for codepoint, cell_size in progress.track( - iter_widths, task_id=make_table_task, total=len(_widths) - 1 - ): - if cell_size != group_cell_size or codepoint != end_codepoint + 1: - append((start_codepoint, end_codepoint, group_cell_size)) - start_codepoint = end_codepoint = codepoint - group_cell_size = cell_size - else: - end_codepoint = codepoint - append((start_codepoint, end_codepoint, group_cell_size)) - return table - - -def get_cell_size(table: List[Tuple[int, int, int]], character: str) -> int: - codepoint = ord(character) - 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 width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 - - -def test(widths_table): - for codepoint in progress.track( - range(0, sys.maxunicode + 1), description="Testing..." - ): - character = chr(codepoint) - width1 = get_cell_size(widths_table, character) - width2 = wcwidth(character) - if width1 != width2: - print(f"{width1} != {width2}") - break - - -def run(): - with progress: - widths_table = make_widths_table() - test(widths_table) - table_file = f"""# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = {widths_table!r} - -""" - with open("../rich/_cell_widths.py", "wt") as fh: - fh.write(table_file) - - subprocess.run("black ../rich/_cell_widths.py", shell=True) - - -if __name__ == "__main__": - run() From 079a6a5ec979cd28f75f7fc0940a19a37e81c512 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:24:55 +0000 Subject: [PATCH 043/100] optimizations --- rich/cells.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index d3eda9c0b..f5272ca5e 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -116,26 +116,24 @@ def cell_len(text: str, unicode_version: str = "auto") -> int: ) cell_table = load_cell_table(unicode_version) - codepoint_count = len(text) total_width = 0 - index = 0 last_measured_character: str | None = None SPECIAL = {"\u200d", "\ufe0f"} - while index < codepoint_count: - if (character := text[index]) in SPECIAL: + iter_characters = iter(text) + + for character in iter_characters: + if character in SPECIAL: if character == "\u200d": - index += 2 + next(iter_characters) elif last_measured_character: total_width += last_measured_character in cell_table.narrow_to_wide last_measured_character = None - index += 1 else: if character_width := get_character_cell_size(character, unicode_version): last_measured_character = character total_width += character_width - index += 1 return total_width From 9904f141ccdb59f6e655c5c9f0050294fd400c39 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:34:32 +0000 Subject: [PATCH 044/100] restore caching behavior --- rich/cells.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index f5272ca5e..2b21a341f 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -76,7 +76,7 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in @lru_cache(4096) -def cached_cell_len(text: str) -> int: +def cached_cell_len(text: str, unicode_version: str = "auto") -> 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 @@ -84,18 +84,32 @@ def cached_cell_len(text: str) -> int: Args: text (str): Text to display. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. 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)) + return _cell_len(text, unicode_version) def cell_len(text: str, unicode_version: str = "auto") -> int: """Get the cell length of a string (length as it appears in the terminal). + Args: + text: String to measure. + unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. + + Returns: + Length of string in terminal cells. + """ + if len(text) < 512: + return cached_cell_len(text, unicode_version) + return _cell_len(text, unicode_version) + + +def _cell_len(text: str, unicode_version: str) -> int: + """Get the cell length of a string (length as it appears in the terminal). + Args: text: String to measure. unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. From 3b533b0a24b513f470911207a01e21654c739bd7 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:40:56 +0000 Subject: [PATCH 045/100] changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53205666..86ef2e2e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [14.3.0] + +### Added + +- Added support for some multi-codepopint glpyhs (will fix alignment issues for these characters) +- Added support for `UNICODE_VERSION` environment variable + + + ## [14.2.0] - 2025-10-09 ### Changed @@ -2147,6 +2156,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - First official release, API still to be stabilized +[14.2.0]: https://github.com/textualize/rich/compare/v14.2.0...v14.3.0 [14.1.0]: https://github.com/textualize/rich/compare/v14.1.0...v14.2.0 [14.0.0]: https://github.com/textualize/rich/compare/v14.0.0...v14.1.0 [14.0.0]: https://github.com/textualize/rich/compare/v13.9.4...v14.0.0 From 16c55757b1f7721f075c9abd5fba8c95a98c1f48 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:42:21 +0000 Subject: [PATCH 046/100] changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86ef2e2e4..e6648b082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Added support for some multi-codepopint glpyhs (will fix alignment issues for these characters) -- Added support for `UNICODE_VERSION` environment variable +- Added support for some multi-codepopint glpyhs (will fix alignment issues for these characters) https://github.com/Textualize/rich/pull/3930 +- Added support for `UNICODE_VERSION` environment variable https://github.com/Textualize/rich/pull/3930 +### Changed +- `cells.cell_len` now has a `unicode_version` parameter (that you probably should never change) https://github.com/Textualize/rich/pull/3930 ## [14.2.0] - 2025-10-09 From 2836d725b734bca429bf1dda738d3ba74aa5078a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:55:51 +0000 Subject: [PATCH 047/100] Update rich/_unicode_data/__init__.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- rich/_unicode_data/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/_unicode_data/__init__.py b/rich/_unicode_data/__init__.py index 1689215c0..ce54baef4 100644 --- a/rich/_unicode_data/__init__.py +++ b/rich/_unicode_data/__init__.py @@ -69,7 +69,7 @@ def load(unicode_version: str = "auto") -> CellTable: _parse_version(unicode_version) except ValueError: # The environment variable is invalid - # Fallback to using the latest version seems s + # Fallback to using the latest version seems reasonable unicode_version = "latest" if unicode_version == "latest": From 199a839fbd22bc06bfdeae92a64ed792b1ef02e4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 14:56:01 +0000 Subject: [PATCH 048/100] Update tests/test_unicode_data.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_unicode_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_unicode_data.py b/tests/test_unicode_data.py index 4531f2ed1..88fc9390f 100644 --- a/tests/test_unicode_data.py +++ b/tests/test_unicode_data.py @@ -6,7 +6,7 @@ def test_load(): - """Test all verions may be loaded.""" + """Test all versions may be loaded.""" for version in VERSIONS: load(version) From 49647d2e4e51e20a5bb8012c5e2d29b0b5081b79 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 15:05:28 +0000 Subject: [PATCH 049/100] typp --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6648b082..13ef9279a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Added support for some multi-codepopint glpyhs (will fix alignment issues for these characters) https://github.com/Textualize/rich/pull/3930 +- Added support for some multi-codepopint glyphs (will fix alignment issues for these characters) https://github.com/Textualize/rich/pull/3930 - Added support for `UNICODE_VERSION` environment variable https://github.com/Textualize/rich/pull/3930 ### Changed From 219b4f2ee7c6105d73d7c4ccfe2aaf1025278f6c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 15:15:20 +0000 Subject: [PATCH 050/100] credit --- rich/_unicode_data/unicode10-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode11-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode12-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode12-1-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode13-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode14-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode15-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode15-1-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode16-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode17-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode4-1-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode5-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode5-1-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode5-2-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode6-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode6-1-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode6-2-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode6-3-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode7-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode8-0-0.py | 379 ++++++++++++++-------------- rich/_unicode_data/unicode9-0-0.py | 379 ++++++++++++++-------------- tools/make_width_tables.py | 3 + 22 files changed, 3993 insertions(+), 3969 deletions(-) diff --git a/rich/_unicode_data/unicode10-0-0.py b/rich/_unicode_data/unicode10-0-0.py index a09d64bcb..f7498f526 100644 --- a/rich/_unicode_data/unicode10-0-0.py +++ b/rich/_unicode_data/unicode10-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -394,219 +395,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode11-0-0.py b/rich/_unicode_data/unicode11-0-0.py index bc03c12f0..07b3fdd0f 100644 --- a/rich/_unicode_data/unicode11-0-0.py +++ b/rich/_unicode_data/unicode11-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -409,219 +410,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode12-0-0.py b/rich/_unicode_data/unicode12-0-0.py index 051ec577b..2aa1ccaf8 100644 --- a/rich/_unicode_data/unicode12-0-0.py +++ b/rich/_unicode_data/unicode12-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -421,219 +422,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode12-1-0.py b/rich/_unicode_data/unicode12-1-0.py index 5d9e47a6b..5c432c449 100644 --- a/rich/_unicode_data/unicode12-1-0.py +++ b/rich/_unicode_data/unicode12-1-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -420,219 +421,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode13-0-0.py b/rich/_unicode_data/unicode13-0-0.py index 518eaf687..6c47b69c7 100644 --- a/rich/_unicode_data/unicode13-0-0.py +++ b/rich/_unicode_data/unicode13-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -432,219 +433,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode14-0-0.py b/rich/_unicode_data/unicode14-0-0.py index 0caa82ac9..d2007494d 100644 --- a/rich/_unicode_data/unicode14-0-0.py +++ b/rich/_unicode_data/unicode14-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -446,219 +447,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode15-0-0.py b/rich/_unicode_data/unicode15-0-0.py index ee7625915..547b15270 100644 --- a/rich/_unicode_data/unicode15-0-0.py +++ b/rich/_unicode_data/unicode15-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -456,219 +457,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode15-1-0.py b/rich/_unicode_data/unicode15-1-0.py index fe2eccfe6..50af2f99b 100644 --- a/rich/_unicode_data/unicode15-1-0.py +++ b/rich/_unicode_data/unicode15-1-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -455,219 +456,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode16-0-0.py b/rich/_unicode_data/unicode16-0-0.py index 1cf0848e3..e7a88a3be 100644 --- a/rich/_unicode_data/unicode16-0-0.py +++ b/rich/_unicode_data/unicode16-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -468,219 +469,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode17-0-0.py b/rich/_unicode_data/unicode17-0-0.py index 3fde3d0ff..e39400836 100644 --- a/rich/_unicode_data/unicode17-0-0.py +++ b/rich/_unicode_data/unicode17-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -476,219 +477,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode4-1-0.py b/rich/_unicode_data/unicode4-1-0.py index 75cf1af89..06612e1ee 100644 --- a/rich/_unicode_data/unicode4-1-0.py +++ b/rich/_unicode_data/unicode4-1-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -186,219 +187,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode5-0-0.py b/rich/_unicode_data/unicode5-0-0.py index 4a9dd84cc..1de377de9 100644 --- a/rich/_unicode_data/unicode5-0-0.py +++ b/rich/_unicode_data/unicode5-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -191,219 +192,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode5-1-0.py b/rich/_unicode_data/unicode5-1-0.py index b8bf50486..abebcc481 100644 --- a/rich/_unicode_data/unicode5-1-0.py +++ b/rich/_unicode_data/unicode5-1-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -214,219 +215,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode5-2-0.py b/rich/_unicode_data/unicode5-2-0.py index 149a7e659..fefd155f5 100644 --- a/rich/_unicode_data/unicode5-2-0.py +++ b/rich/_unicode_data/unicode5-2-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -242,219 +243,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode6-0-0.py b/rich/_unicode_data/unicode6-0-0.py index 665e63706..039c08df0 100644 --- a/rich/_unicode_data/unicode6-0-0.py +++ b/rich/_unicode_data/unicode6-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -250,219 +251,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode6-1-0.py b/rich/_unicode_data/unicode6-1-0.py index d6eb29fa2..cb4798518 100644 --- a/rich/_unicode_data/unicode6-1-0.py +++ b/rich/_unicode_data/unicode6-1-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -261,219 +262,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode6-2-0.py b/rich/_unicode_data/unicode6-2-0.py index 6027e3596..0476d4a9a 100644 --- a/rich/_unicode_data/unicode6-2-0.py +++ b/rich/_unicode_data/unicode6-2-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -261,219 +262,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode6-3-0.py b/rich/_unicode_data/unicode6-3-0.py index 16d7388e2..9b7930971 100644 --- a/rich/_unicode_data/unicode6-3-0.py +++ b/rich/_unicode_data/unicode6-3-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -262,219 +263,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode7-0-0.py b/rich/_unicode_data/unicode7-0-0.py index 575147ece..7809daf98 100644 --- a/rich/_unicode_data/unicode7-0-0.py +++ b/rich/_unicode_data/unicode7-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -288,219 +289,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode8-0-0.py b/rich/_unicode_data/unicode8-0-0.py index 42c390db9..6b1b7889f 100644 --- a/rich/_unicode_data/unicode8-0-0.py +++ b/rich/_unicode_data/unicode8-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -296,219 +297,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/rich/_unicode_data/unicode9-0-0.py b/rich/_unicode_data/unicode9-0-0.py index b6666d634..329020dcd 100644 --- a/rich/_unicode_data/unicode9-0-0.py +++ b/rich/_unicode_data/unicode9-0-0.py @@ -1,4 +1,5 @@ # Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable @@ -381,219 +382,219 @@ ], narrow_to_wide=frozenset( { - "🏗", - "📽", - "🗒", - "🗜", - "♀", - "🎟", - "🛣", - "⏭", - "ℹ", - "☂", - "☺", - "🎙", - "⏸", - "➡", - "☃", - "🖲", - "☝", - "🛠", - "✳", - "▶", - "⚠", - "🛰", - "⛈", - "6", - "🅿", - "🎖", - "⛑", - "🛩", + "2", + "↪", + "☁", + "🌧", + "🛢", + "⁉", + "♨", + "✔", + "☎", + "☣", + "🏛", + "🅾", + "🕵", + "🗣", + "♣", + "🗞", + "🅱", "☪", + "🏕", + "🏞", + "🛰", + "0", + "🛳", "🕳", - "9", + "♠", + "5", + "⌨", + "🛋", + "🗒", + "✳", "🏷", - "☀", + "🌩", + "⚧", + "🏝", + "🕉", + "☦", + "👁", + "🛍", + "🗺", + "🎗", + "🅿", + "♂", + "⚛", + "🛡", + "⏮", + "🏳", + "🗃", + "🗝", + "🐿", + "◻", + "🏙", + "🛥", + "6", + "⏱", + "⛰", + "🏎", + "🕯", + "🏵", + "🏖", + "✖", + "🛎", + "☂", + "#", + "❣", + "♻", + "🗄", + "3", + "⏭", "☸", - "♨", - "⬅", - "❇", - "🗨", + "⏏", + "⛸", + "🖍", + "⏸", "♦", - "#", - "✏", - "⏹", - "♟", - "🕉", - "🗓", - "🌶", - "⏺", - "☘", - "‼", - "🌩", + "❇", + "⏯", + "⛹", + "☠", + "🏔", + "🕸", + "↖", "🗑", + "🌡", + "✈", + "⚒", + "7", + "✏", + "🕰", + "🌫", + "☮", "☯", - "🕴", + "⏲", + "🖐", "✴", - "☢", - "🖼", - "🌫", - "🕵", - "⚧", + "⚰", "🍽", - "🗄", - "✔", + "⚱", + "🏜", "🗡", - "⏲", - "🌡", - "🖋", - "🛳", - "🛋", - "☁", - "👁", + "🕷", + "♀", + "ℹ", + "🌨", + "⚜", + "☄", + "☑", + "⚠", + "✝", + "9", "Ⓜ", - "↕", - "🏛", - "⏯", - "7", - "🏖", - "⏱", - "*", - "🗝", - "✍", - "🖌", - "↖", - "⛹", - "🏙", - "❄", + "↩", + "☹", + "☺", + "4", + "◼", + "⚔", + "♟", + "✉", + "⤵", + "🎖", + "❤", "🎚", - "🏚", - "⁉", - "🏔", - "🐿", - "🏕", - "™", - "1", - "🛤", - "🅱", - "🖊", - "⚱", - "⛸", - "🏳", - "🛍", - "⬇", - "🅰", - "⛩", - "🗳", - "↙", - "🗂", - "⛴", + "🕊", + "🗯", "🏋", + "🗳", + "↕", + "❄", + "✂", + "➡", + "🏘", + "⛱", + "♥", + "🖋", "🌦", - "®", - "🗞", - "♠", + "✒", + "📽", + "⚖", + "🖌", + "☀", + "⛷", + "↙", + "‼", + "🕴", + "↔", + "⛏", "⤴", - "✈", - "🎞", "⚕", - "⛏", - "🕸", - "🛥", - "⚜", - "☮", - "🗯", - "✡", - "⏮", - "⚰", - "3", - "▫", + "⏹", + "🖱", + "⬅", + "🛤", + "🛠", + "🛩", + "🌪", "🏍", - "✝", - "↘", - "↪", - "⚛", - "🖇", - "✖", - "🛢", + "▪", + "⛩", + "🕶", + "🛣", + "🖲", + "🖥", + "⚗", + "©", + "☢", + "↗", + "✌", + "™", "🎛", + "✍", + "⛑", + "🎙", + "1", + "⬇", + "🗓", + "⛈", + "✡", + "🖊", + "🖼", + "🛏", + "🌥", + "🌶", + "🏗", + "🖨", + "♾", + "⛴", + "☝", "8", - "↗", - "🛡", - "☣", - "⛰", - "❣", - "✂", - "☑", + "◀", + "🎟", + "🕹", + "🗨", + "®", "⚙", - "⤵", - "♻", - "🌪", - "🖐", - "🕯", - "✉", - "4", - "✒", + "🏌", + "🗜", "🌤", + "⏺", + "☘", + "🅰", "🏟", - "♂", - "🕰", - "🛎", - "🎗", - "🕹", - "5", - "⚒", - "❤", - "🖍", - "⚔", - "⚖", - "🖱", - "🕊", - "↔", - "2", - "🕷", - "🅾", - "☹", - "🖥", - "⛷", - "🏜", - "☎", - "🏌", - "♾", - "🛏", - "⌨", - "🏎", - "🏵", - "🖨", - "♥", - "◻", - "🌥", - "☄", - "◼", - "⛱", - "✌", - "↩", - "©", - "⏏", - "🏝", - "🌧", - "☠", - "⬆", - "🏘", - "🗃", - "▪", - "☦", - "0", - "🌨", - "🗣", - "🗺", - "🏞", - "🕶", + "▶", + "*", + "🖇", "🌬", - "♣", - "⚗", - "◀", + "🎞", + "🗂", + "▫", + "⬆", + "🏚", + "↘", "⛓", + "☃", } ), ) diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py index 67700402b..8f0e0341f 100644 --- a/tools/make_width_tables.py +++ b/tools/make_width_tables.py @@ -19,6 +19,8 @@ with open(path, "wt") as init_file: init_file.write(init) +subprocess.run(f"black {path}", shell=True) + narrow_to_wide: set[str] = set() for start, end in VS16_NARROW_TO_WIDE["9.0.0"]: @@ -37,6 +39,7 @@ cell_table = CellTable(version, table, frozenset(narrow_to_wide)) table_file = f"""# Auto generated by tools/make_width_tables.py +# Data from wcwidth project (https://github.com/jquast/wcwidth) from rich.cells import CellTable From cbae9229af4391c0e8aea782956ce9b224cb80c2 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 15:58:32 +0000 Subject: [PATCH 051/100] update wcwidth data, add consistant sorting --- rich/_unicode_data/unicode10-0-0.py | 406 +++++++++++++------------- rich/_unicode_data/unicode11-0-0.py | 407 +++++++++++++-------------- rich/_unicode_data/unicode12-0-0.py | 407 +++++++++++++-------------- rich/_unicode_data/unicode12-1-0.py | 407 +++++++++++++-------------- rich/_unicode_data/unicode13-0-0.py | 407 +++++++++++++-------------- rich/_unicode_data/unicode14-0-0.py | 408 +++++++++++++-------------- rich/_unicode_data/unicode15-0-0.py | 408 +++++++++++++-------------- rich/_unicode_data/unicode15-1-0.py | 408 +++++++++++++-------------- rich/_unicode_data/unicode16-0-0.py | 408 +++++++++++++-------------- rich/_unicode_data/unicode17-0-0.py | 408 +++++++++++++-------------- rich/_unicode_data/unicode4-1-0.py | 422 +++++++++++++++------------- rich/_unicode_data/unicode5-0-0.py | 422 +++++++++++++++------------- rich/_unicode_data/unicode5-1-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode5-2-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode6-0-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode6-1-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode6-2-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode6-3-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode7-0-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode8-0-0.py | 398 +++++++++++++------------- rich/_unicode_data/unicode9-0-0.py | 406 +++++++++++++------------- tools/make_width_tables.py | 2 +- 22 files changed, 4257 insertions(+), 4253 deletions(-) diff --git a/rich/_unicode_data/unicode10-0-0.py b/rich/_unicode_data/unicode10-0-0.py index f7498f526..f31808783 100644 --- a/rich/_unicode_data/unicode10-0-0.py +++ b/rich/_unicode_data/unicode10-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="10.0.0", - widths=[ + "10.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -33,7 +31,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2260, 2307, 0), + (2260, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -159,8 +158,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -210,7 +208,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12590, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -261,8 +261,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -276,7 +277,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69888, 69890, 0), (69927, 69940, 0), (70003, 70003, 0), @@ -389,225 +389,223 @@ (129488, 129510, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode11-0-0.py b/rich/_unicode_data/unicode11-0-0.py index 07b3fdd0f..058bb342c 100644 --- a/rich/_unicode_data/unicode11-0-0.py +++ b/rich/_unicode_data/unicode11-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="11.0.0", - widths=[ + "11.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,7 +32,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2307, 0), + (2259, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -161,8 +160,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -212,7 +210,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -264,8 +264,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -281,8 +282,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -404,225 +403,223 @@ (129488, 129535, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode12-0-0.py b/rich/_unicode_data/unicode12-0-0.py index 2aa1ccaf8..7b0022513 100644 --- a/rich/_unicode_data/unicode12-0-0.py +++ b/rich/_unicode_data/unicode12-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="12.0.0", - widths=[ + "12.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,7 +32,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2307, 0), + (2259, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -160,8 +159,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -211,7 +209,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -263,8 +263,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -280,8 +281,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -416,225 +415,223 @@ (129680, 129685, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode12-1-0.py b/rich/_unicode_data/unicode12-1-0.py index 5c432c449..2dbcf3794 100644 --- a/rich/_unicode_data/unicode12-1-0.py +++ b/rich/_unicode_data/unicode12-1-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="12.1.0", - widths=[ + "12.1.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,7 +32,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2307, 0), + (2259, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -160,8 +159,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -211,7 +209,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -262,8 +262,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -279,8 +280,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -415,225 +414,223 @@ (129680, 129685, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode13-0-0.py b/rich/_unicode_data/unicode13-0-0.py index 6c47b69c7..13fbc74b0 100644 --- a/rich/_unicode_data/unicode13-0-0.py +++ b/rich/_unicode_data/unicode13-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="13.0.0", - widths=[ + "13.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,7 +32,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2307, 0), + (2259, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -160,8 +159,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -211,7 +209,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12771, 2), (12784, 12830, 2), (12832, 12871, 2), @@ -262,8 +262,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -280,8 +281,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -427,225 +426,223 @@ (129744, 129750, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode14-0-0.py b/rich/_unicode_data/unicode14-0-0.py index d2007494d..9fa9e29e7 100644 --- a/rich/_unicode_data/unicode14-0-0.py +++ b/rich/_unicode_data/unicode14-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="14.0.0", - widths=[ + "14.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,9 +32,9 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2192, 2193, 0), (2200, 2207, 0), - (2250, 2307, 0), + (2250, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -162,8 +160,7 @@ (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -213,7 +210,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12771, 2), (12784, 12830, 2), (12832, 12871, 2), @@ -264,8 +263,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -285,9 +285,7 @@ (69747, 69748, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69826, 69826, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -441,225 +439,223 @@ (129776, 129782, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode15-0-0.py b/rich/_unicode_data/unicode15-0-0.py index 547b15270..84dd5be93 100644 --- a/rich/_unicode_data/unicode15-0-0.py +++ b/rich/_unicode_data/unicode15-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="15.0.0", - widths=[ + "15.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,9 +32,9 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2192, 2193, 0), (2200, 2207, 0), - (2250, 2307, 0), + (2250, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -163,8 +161,7 @@ (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -214,7 +211,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12771, 2), (12784, 12830, 2), (12832, 12871, 2), @@ -265,8 +264,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -287,9 +287,7 @@ (69747, 69748, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69826, 69826, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -451,225 +449,223 @@ (129776, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode15-1-0.py b/rich/_unicode_data/unicode15-1-0.py index 50af2f99b..aa9f2c3e3 100644 --- a/rich/_unicode_data/unicode15-1-0.py +++ b/rich/_unicode_data/unicode15-1-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="15.1.0", - widths=[ + "15.1.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,9 +32,9 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2192, 2193, 0), (2200, 2207, 0), - (2250, 2307, 0), + (2250, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -163,8 +161,7 @@ (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -213,7 +210,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12771, 2), (12783, 12830, 2), (12832, 12871, 2), @@ -264,8 +263,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -286,9 +286,7 @@ (69747, 69748, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69826, 69826, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -450,225 +448,223 @@ (129776, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode16-0-0.py b/rich/_unicode_data/unicode16-0-0.py index e7a88a3be..b3fe2359d 100644 --- a/rich/_unicode_data/unicode16-0-0.py +++ b/rich/_unicode_data/unicode16-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="16.0.0", - widths=[ + "16.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,9 +32,9 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2192, 2193, 0), (2199, 2207, 0), - (2250, 2307, 0), + (2250, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -163,8 +161,7 @@ (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -215,7 +212,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12773, 2), (12783, 12830, 2), (12832, 12871, 2), @@ -265,8 +264,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -288,9 +288,7 @@ (69747, 69748, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69826, 69826, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -463,225 +461,223 @@ (129776, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode17-0-0.py b/rich/_unicode_data/unicode17-0-0.py index e39400836..4108bb44d 100644 --- a/rich/_unicode_data/unicode17-0-0.py +++ b/rich/_unicode_data/unicode17-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="17.0.0", - widths=[ + "17.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -34,9 +32,9 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2192, 2193, 0), (2199, 2207, 0), - (2250, 2307, 0), + (2250, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -164,8 +162,7 @@ (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -216,7 +213,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12773, 2), (12783, 12830, 2), (12832, 12871, 2), @@ -266,8 +265,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -289,9 +289,7 @@ (69747, 69748, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69826, 69826, 0), - (69837, 69837, 0), (69888, 69890, 0), (69927, 69940, 0), (69957, 69958, 0), @@ -471,225 +469,223 @@ (129775, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode4-1-0.py b/rich/_unicode_data/unicode4-1-0.py index 06612e1ee..23ff5cf1d 100644 --- a/rich/_unicode_data/unicode4-1-0.py +++ b/rich/_unicode_data/unicode4-1-0.py @@ -4,9 +4,12 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="4.1.0", - widths=[ - (0, 0, 0), + "4.1.0", + [ + (0, 8, 0), + (14, 31, 0), + (127, 132, 0), + (134, 159, 0), (768, 879, 0), (1155, 1158, 0), (1160, 1161, 0), @@ -124,8 +127,7 @@ (7616, 7619, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8291, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8427, 0), (9001, 9002, 2), (11904, 11929, 2), @@ -139,7 +141,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12588, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12727, 2), (12736, 12751, 2), (12784, 12830, 2), @@ -154,11 +158,12 @@ (43019, 43019, 0), (43043, 43047, 0), (44032, 55203, 2), - (55216, 55295, 0), + (55216, 57343, 0), (63744, 64045, 2), (64048, 64106, 2), (64112, 64217, 2), (64286, 64286, 0), + (64976, 65007, 0), (65024, 65039, 0), (65040, 65049, 2), (65056, 65059, 0), @@ -167,8 +172,10 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), + (65534, 65535, 0), (68097, 68099, 0), (68101, 68102, 0), (68108, 68111, 0), @@ -179,227 +186,240 @@ (119173, 119179, 0), (119210, 119213, 0), (119362, 119364, 0), + (131070, 131071, 0), (131072, 196605, 2), + (196606, 196607, 0), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (262142, 262143, 0), + (327678, 327679, 0), + (393214, 393215, 0), + (458750, 458751, 0), + (524286, 524287, 0), + (589822, 589823, 0), + (655358, 655359, 0), + (720894, 720895, 0), + (786430, 786431, 0), + (851966, 851967, 0), + (917502, 921599, 0), + (983038, 983039, 0), + (1048574, 1048575, 0), + (1114110, 1114111, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode5-0-0.py b/rich/_unicode_data/unicode5-0-0.py index 1de377de9..599fb7857 100644 --- a/rich/_unicode_data/unicode5-0-0.py +++ b/rich/_unicode_data/unicode5-0-0.py @@ -4,9 +4,12 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="5.0.0", - widths=[ - (0, 0, 0), + "5.0.0", + [ + (0, 8, 0), + (14, 31, 0), + (127, 132, 0), + (134, 159, 0), (768, 879, 0), (1155, 1158, 0), (1160, 1161, 0), @@ -129,8 +132,7 @@ (7678, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8291, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8431, 0), (9001, 9002, 2), (11904, 11929, 2), @@ -144,7 +146,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12588, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12727, 2), (12736, 12751, 2), (12784, 12830, 2), @@ -159,11 +163,12 @@ (43019, 43019, 0), (43043, 43047, 0), (44032, 55203, 2), - (55216, 55295, 0), + (55216, 57343, 0), (63744, 64045, 2), (64048, 64106, 2), (64112, 64217, 2), (64286, 64286, 0), + (64976, 65007, 0), (65024, 65039, 0), (65040, 65049, 2), (65056, 65059, 0), @@ -172,8 +177,10 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), + (65534, 65535, 0), (68097, 68099, 0), (68101, 68102, 0), (68108, 68111, 0), @@ -184,227 +191,240 @@ (119173, 119179, 0), (119210, 119213, 0), (119362, 119364, 0), + (131070, 131071, 0), (131072, 196605, 2), + (196606, 196607, 0), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (262142, 262143, 0), + (327678, 327679, 0), + (393214, 393215, 0), + (458750, 458751, 0), + (524286, 524287, 0), + (589822, 589823, 0), + (655358, 655359, 0), + (720894, 720895, 0), + (786430, 786431, 0), + (851966, 851967, 0), + (917502, 921599, 0), + (983038, 983039, 0), + (1048574, 1048575, 0), + (1114110, 1114111, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode5-1-0.py b/rich/_unicode_data/unicode5-1-0.py index abebcc481..016e7825e 100644 --- a/rich/_unicode_data/unicode5-1-0.py +++ b/rich/_unicode_data/unicode5-1-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="5.1.0", - widths=[ + "5.1.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -141,8 +141,7 @@ (7678, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11744, 11775, 0), @@ -157,7 +156,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12727, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -194,8 +195,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -209,225 +211,223 @@ (119362, 119364, 0), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode5-2-0.py b/rich/_unicode_data/unicode5-2-0.py index fefd155f5..e984f12e9 100644 --- a/rich/_unicode_data/unicode5-2-0.py +++ b/rich/_unicode_data/unicode5-2-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="5.2.0", - widths=[ + "5.2.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -152,8 +152,7 @@ (7677, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -169,7 +168,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12727, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -216,8 +217,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -237,225 +239,223 @@ (127552, 127560, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode6-0-0.py b/rich/_unicode_data/unicode6-0-0.py index 039c08df0..8d5abb455 100644 --- a/rich/_unicode_data/unicode6-0-0.py +++ b/rich/_unicode_data/unicode6-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="6.0.0", - widths=[ + "6.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -155,8 +155,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -173,7 +172,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -220,8 +221,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -245,225 +247,223 @@ (127568, 127569, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode6-1-0.py b/rich/_unicode_data/unicode6-1-0.py index cb4798518..29d3e9298 100644 --- a/rich/_unicode_data/unicode6-1-0.py +++ b/rich/_unicode_data/unicode6-1-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="6.1.0", - widths=[ + "6.1.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -156,8 +156,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -174,7 +173,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -224,8 +225,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -256,225 +258,223 @@ (127568, 127569, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode6-2-0.py b/rich/_unicode_data/unicode6-2-0.py index 0476d4a9a..d0cda351a 100644 --- a/rich/_unicode_data/unicode6-2-0.py +++ b/rich/_unicode_data/unicode6-2-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="6.2.0", - widths=[ + "6.2.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -156,8 +156,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8298, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -174,7 +173,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -224,8 +225,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -256,225 +258,223 @@ (127568, 127569, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode6-3-0.py b/rich/_unicode_data/unicode6-3-0.py index 9b7930971..cffb7ee94 100644 --- a/rich/_unicode_data/unicode6-3-0.py +++ b/rich/_unicode_data/unicode6-3-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="6.3.0", - widths=[ + "6.3.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -157,8 +157,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -175,7 +174,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -225,8 +226,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (68097, 68099, 0), (68101, 68102, 0), @@ -257,225 +259,223 @@ (127568, 127569, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode7-0-0.py b/rich/_unicode_data/unicode7-0-0.py index 7809daf98..996478ac2 100644 --- a/rich/_unicode_data/unicode7-0-0.py +++ b/rich/_unicode_data/unicode7-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="7.0.0", - widths=[ + "7.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -158,8 +158,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -176,7 +175,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -227,8 +228,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -283,225 +285,223 @@ (127568, 127569, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode8-0-0.py b/rich/_unicode_data/unicode8-0-0.py index 6b1b7889f..ae34a382a 100644 --- a/rich/_unicode_data/unicode8-0-0.py +++ b/rich/_unicode_data/unicode8-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="8.0.0", - widths=[ + "8.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -156,8 +156,7 @@ (7676, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (9001, 9002, 2), (11503, 11505, 0), @@ -174,7 +173,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -225,8 +226,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -291,225 +293,223 @@ (127995, 127999, 0), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/rich/_unicode_data/unicode9-0-0.py b/rich/_unicode_data/unicode9-0-0.py index 329020dcd..b15f67d44 100644 --- a/rich/_unicode_data/unicode9-0-0.py +++ b/rich/_unicode_data/unicode9-0-0.py @@ -4,8 +4,8 @@ from rich.cells import CellTable cell_table = CellTable( - unicode_version="9.0.0", - widths=[ + "9.0.0", + [ (0, 0, 0), (768, 879, 0), (1155, 1161, 0), @@ -14,16 +14,14 @@ (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, 1757, 0), + (1750, 1756, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), - (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -33,7 +31,8 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2260, 2307, 0), + (2260, 2273, 0), + (2275, 2307, 0), (2362, 2364, 0), (2366, 2383, 0), (2385, 2391, 0), @@ -157,8 +156,7 @@ (7675, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), + (8288, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -208,7 +206,9 @@ (12441, 12442, 0), (12443, 12543, 2), (12549, 12589, 2), - (12593, 12686, 2), + (12593, 12643, 2), + (12644, 12644, 0), + (12645, 12686, 2), (12688, 12730, 2), (12736, 12771, 2), (12784, 12830, 2), @@ -259,8 +259,9 @@ (65128, 65131, 2), (65279, 65279, 0), (65281, 65376, 2), + (65440, 65440, 0), (65504, 65510, 2), - (65529, 65531, 0), + (65520, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -274,7 +275,6 @@ (69688, 69702, 0), (69759, 69762, 0), (69808, 69818, 0), - (69821, 69821, 0), (69888, 69890, 0), (69927, 69940, 0), (70003, 70003, 0), @@ -376,225 +376,223 @@ (129472, 129472, 2), (131072, 196605, 2), (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), + (917504, 921599, 0), ], - narrow_to_wide=frozenset( - { - "2", - "↪", - "☁", - "🌧", - "🛢", - "⁉", - "♨", - "✔", - "☎", - "☣", - "🏛", - "🅾", - "🕵", - "🗣", - "♣", - "🗞", - "🅱", - "☪", - "🏕", - "🏞", - "🛰", + frozenset( + [ + "#", + "*", "0", - "🛳", - "🕳", - "♠", + "1", + "2", + "3", + "4", "5", + "6", + "7", + "8", + "9", + "©", + "®", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", "⌨", - "🛋", - "🗒", - "✳", - "🏷", - "🌩", - "⚧", - "🏝", - "🕉", - "☦", - "👁", - "🛍", - "🗺", - "🎗", - "🅿", - "♂", - "⚛", - "🛡", + "⏏", + "⏭", "⏮", - "🏳", - "🗃", - "🗝", - "🐿", - "◻", - "🏙", - "🛥", - "6", + "⏯", "⏱", - "⛰", - "🏎", - "🕯", - "🏵", - "🏖", - "✖", - "🛎", - "☂", - "#", - "❣", - "♻", - "🗄", - "3", - "⏭", - "☸", - "⏏", - "⛸", - "🖍", + "⏲", "⏸", - "♦", - "❇", - "⏯", - "⛹", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☘", + "☝", "☠", - "🏔", - "🕸", - "↖", - "🗑", - "🌡", - "✈", - "⚒", - "7", - "✏", - "🕰", - "🌫", + "☢", + "☣", + "☦", + "☪", "☮", "☯", - "⏲", - "🖐", - "✴", - "⚰", - "🍽", - "⚱", - "🏜", - "🗡", - "🕷", - "♀", - "ℹ", - "🌨", - "⚜", - "☄", - "☑", - "⚠", - "✝", - "9", - "Ⓜ", - "↩", + "☸", "☹", "☺", - "4", - "◼", - "⚔", + "♀", + "♂", "♟", - "✉", - "⤵", - "🎖", - "❤", - "🎚", - "🕊", - "🗯", - "🏋", - "🗳", - "↕", - "❄", - "✂", - "➡", - "🏘", - "⛱", + "♠", + "♣", "♥", - "🖋", - "🌦", - "✒", - "📽", + "♦", + "♨", + "♻", + "♾", + "⚒", + "⚔", + "⚕", "⚖", - "🖌", - "☀", - "⛷", - "↙", - "‼", - "🕴", - "↔", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚧", + "⚰", + "⚱", + "⛈", "⛏", - "⤴", - "⚕", - "⏹", - "🖱", - "⬅", - "🛤", - "🛠", - "🛩", - "🌪", - "🏍", - "▪", + "⛑", + "⛓", "⛩", - "🕶", - "🛣", - "🖲", - "🖥", - "⚗", - "©", - "☢", - "↗", + "⛰", + "⛱", + "⛴", + "⛷", + "⛸", + "⛹", + "✂", + "✈", + "✉", "✌", - "™", - "🎛", "✍", - "⛑", - "🎙", - "1", - "⬇", - "🗓", - "⛈", + "✏", + "✒", + "✔", + "✖", + "✝", "✡", - "🖊", - "🖼", - "🛏", + "✳", + "✴", + "❄", + "❇", + "❣", + "❤", + "➡", + "⤴", + "⤵", + "⬅", + "⬆", + "⬇", + "🅰", + "🅱", + "🅾", + "🅿", + "🌡", + "🌤", "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", "🌶", - "🏗", - "🖨", - "♾", - "⛴", - "☝", - "8", - "◀", + "🍽", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", "🎟", - "🕹", - "🗨", - "®", - "⚙", + "🏋", "🏌", - "🗜", - "🌤", - "⏺", - "☘", - "🅰", + "🏍", + "🏎", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", "🏟", - "▶", - "*", + "🏳", + "🏵", + "🏷", + "🐿", + "👁", + "📽", + "🕉", + "🕊", + "🕯", + "🕰", + "🕳", + "🕴", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", "🖇", - "🌬", - "🎞", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", "🗂", - "▫", - "⬆", - "🏚", - "↘", - "⛓", - "☃", - } + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🛋", + "🛍", + "🛎", + "🛏", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛰", + "🛳", + ] ), ) diff --git a/tools/make_width_tables.py b/tools/make_width_tables.py index 8f0e0341f..72764277e 100644 --- a/tools/make_width_tables.py +++ b/tools/make_width_tables.py @@ -43,7 +43,7 @@ from rich.cells import CellTable -cell_table = {cell_table!r} +cell_table = CellTable({cell_table.unicode_version!r}, {cell_table.widths!r}, frozenset({sorted(cell_table.narrow_to_wide)!r})) """ version_path = version.replace(".", "-") path = Path(f"../rich/_unicode_data/unicode{version_path}.py").resolve().absolute() From b08e00fce2c8bd48a69953c15e2c624ac6cf0ab4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 16:55:11 +0000 Subject: [PATCH 052/100] empty live --- CHANGELOG.md | 1 + rich/live.py | 6 +++++- rich/live_render.py | 14 ++++++++++++-- tests/test_live.py | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ef9279a..b54b6e381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - `cells.cell_len` now has a `unicode_version` parameter (that you probably should never change) https://github.com/Textualize/rich/pull/3930 +- Live will not write a new line if there was nothing rendered ## [14.2.0] - 2025-10-09 diff --git a/rich/live.py b/rich/live.py index cc3a39bd5..2fd893b00 100644 --- a/rich/live.py +++ b/rich/live.py @@ -166,7 +166,11 @@ def stop(self) -> None: finally: self._disable_redirect_io() self.console.pop_render_hook() - if not self._alt_screen and self.console.is_terminal: + if ( + not self._alt_screen + and self.console.is_terminal + and self._live_render.last_render_height + ): self.console.line() self.console.show_cursor(True) if self._alt_screen: diff --git a/rich/live_render.py b/rich/live_render.py index d3da5111d..e7ec970a7 100644 --- a/rich/live_render.py +++ b/rich/live_render.py @@ -1,5 +1,4 @@ -from typing import Optional, Tuple, Literal - +from typing import Literal, Optional, Tuple from ._loop import loop_last from .console import Console, ConsoleOptions, RenderableType, RenderResult @@ -30,6 +29,17 @@ def __init__( self.vertical_overflow = vertical_overflow self._shape: Optional[Tuple[int, int]] = None + @property + def last_render_height(self) -> int: + """The number of lines in the last render (may be 0 if nothing was rendered). + + Returns: + Height in lines + """ + if self._shape is None: + return 0 + return self._shape[1] + def set_renderable(self, renderable: RenderableType) -> None: """Set a new renderable. diff --git a/tests/test_live.py b/tests/test_live.py index 16658b44f..15a4e4399 100644 --- a/tests/test_live.py +++ b/tests/test_live.py @@ -167,3 +167,21 @@ def test_live_screen() -> None: print(repr(result)) expected = "\x1b[?1049h\x1b[H\x1b[?25l\x1b[Hfoo \n \n \n \n \x1b[Hfoo \n \n \n \n \x1b[?25h\x1b[?1049l" assert result == expected + + +def test_live_empty() -> None: + """Regression test for https://github.com/Textualize/rich/issues/3796 + + No NL should be written if there was nothing rendered. + """ + + from rich.console import Group + + console = create_capture_console(width=20, height=5) + console.begin_capture() + with Live(Group(), console=console, transient=True): + pass + result = console.end_capture() + print(repr(result)) + assert "\n" not in result + assert result == "\x1b[?25l\r\x1b[2K\x1b[?25h\r" From ad669087b9fe4b48758b57cc80379518bea10ead Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 17:03:51 +0000 Subject: [PATCH 053/100] changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b54b6e381..255f3fd24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for some multi-codepopint glyphs (will fix alignment issues for these characters) https://github.com/Textualize/rich/pull/3930 - Added support for `UNICODE_VERSION` environment variable https://github.com/Textualize/rich/pull/3930 +- Added `last_render_height` property to LiveRender https://github.com/Textualize/rich/pull/3934 ### Changed - `cells.cell_len` now has a `unicode_version` parameter (that you probably should never change) https://github.com/Textualize/rich/pull/3930 -- Live will not write a new line if there was nothing rendered +- Live will not write a new line if there was nothing rendered https://github.com/Textualize/rich/pull/3934 ## [14.2.0] - 2025-10-09 From dd8901c3e3dbbab84b564bb31b818e897cb56703 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 17:15:25 +0000 Subject: [PATCH 054/100] docstring --- rich/_inspect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/_inspect.py b/rich/_inspect.py index 27d65cec9..4eb304fd1 100644 --- a/rich/_inspect.py +++ b/rich/_inspect.py @@ -29,7 +29,7 @@ class Inspect(JupyterMixin): docs (bool, optional): Also render doc strings. Defaults to True. private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. + sort (bool, optional): Sort attributes alphabetically, callables at the top, leading and trailing underscores stripped. Defaults to True. all (bool, optional): Show all attributes. Defaults to False. value (bool, optional): Pretty print value of object. Defaults to True. """ From 7a4a7a614b4893a8197d06800b241c2c28036ad4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 22 Jan 2026 17:21:37 +0000 Subject: [PATCH 055/100] docstring --- rich/progress.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/progress.py b/rich/progress.py index ef6ad60f0..421e14119 100644 --- a/rich/progress.py +++ b/rich/progress.py @@ -1064,7 +1064,7 @@ class Progress(JupyterMixin): Args: console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout. auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. - refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. + refresh_per_second (float, optional): Number of times per second to refresh the progress information. Defaults to 10. speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. transient: (bool, optional): Clear the progress on exit. Defaults to False. redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. From 22b26678419dcb1c13fedda9c98faec022774940 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 10:35:30 +0000 Subject: [PATCH 056/100] comments --- rich/__init__.py | 2 +- rich/_inspect.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rich/__init__.py b/rich/__init__.py index b631d5449..3edd12e01 100644 --- a/rich/__init__.py +++ b/rich/__init__.py @@ -148,7 +148,7 @@ def inspect( docs (bool, optional): Also render doc strings. Defaults to True. private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. + sort (bool, optional): Sort attributes alphabetically, callables at the top, leading and trailing underscores ignored. Defaults to True. all (bool, optional): Show all attributes. Defaults to False. value (bool, optional): Pretty print value. Defaults to True. """ diff --git a/rich/_inspect.py b/rich/_inspect.py index 4eb304fd1..3f54d230b 100644 --- a/rich/_inspect.py +++ b/rich/_inspect.py @@ -29,7 +29,7 @@ class Inspect(JupyterMixin): docs (bool, optional): Also render doc strings. Defaults to True. private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically, callables at the top, leading and trailing underscores stripped. Defaults to True. + sort (bool, optional): Sort attributes alphabetically, callables at the top, leading and trailing underscores ignored. Defaults to True. all (bool, optional): Show all attributes. Defaults to False. value (bool, optional): Pretty print value of object. Defaults to True. """ From 1c5e03eb32020011f5b13174e186c588d09d749c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 11:20:32 +0000 Subject: [PATCH 057/100] fix for padding width --- rich/table.py | 16 +++++++++++++--- tests/test_columns.py | 7 ++++++- tests/test_table.py | 24 ++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/rich/table.py b/rich/table.py index 942175dc3..bfcb8c3f4 100644 --- a/rich/table.py +++ b/rich/table.py @@ -485,6 +485,7 @@ def __rich_console__( max_width = self.width extra_width = self._extra_width + widths = self._calculate_column_widths( console, options.update_width(max_width - extra_width) ) @@ -530,6 +531,7 @@ def _calculate_column_widths( self._measure_column(console, options, column) for column in columns ] widths = [_range.maximum or 1 for _range in width_ranges] + get_padding_width = self._get_padding_width extra_width = self._extra_width if self.expand: @@ -699,9 +701,17 @@ def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: def _get_padding_width(self, column_index: int) -> int: """Get extra width from padding.""" _, pad_right, _, pad_left = self.padding + if self.collapse_padding: - if column_index > 0: - pad_left = max(0, pad_left - pad_right) + pad_left = 0 + pad_right = abs(pad_left - pad_right) + + if not self.pad_edge: + if column_index == 0: + pad_left = 0 + if column_index == len(self.columns) - 1: + pad_right = 0 + return pad_left + pad_right def _measure_column( @@ -717,7 +727,6 @@ def _measure_column( return Measurement(0, 0) padding_width = self._get_padding_width(column._index) - if column.width is not None: # Fixed width column return Measurement( @@ -754,6 +763,7 @@ def _render( self._get_cells(console, column_index, column) for column_index, column in enumerate(self.columns) ) + row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells)) _box = ( self.box.substitute( diff --git a/tests/test_columns.py b/tests/test_columns.py index 1b167f4ac..d4c1113d3 100644 --- a/tests/test_columns.py +++ b/tests/test_columns.py @@ -58,11 +58,16 @@ def render(): console.print(columns) console.print() render_result = console.file.getvalue() + print(render_result) + print(repr(render_result)) return render_result def test_render(): - expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── column first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus \naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo \naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" + expected = "────────────────────────────────────────────── empty ───────────────────────────────────────────────\n───────────────────────────────────────────── optimal ──────────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n───────────────────────────────────────── optimal, expand ──────────────────────────────────────────\nUrsus americanus American buffalo Bison bison American crow \nCorvus brachyrhynchos American marten Martes americana American racer \nColuber constrictor American woodcock Scolopax minor Anaconda (unidentified)\nEunectes sp. Andean goose Chloephaga melanoptera Ant \nAnteater, australian spiny Tachyglossus aculeatus Anteater, giant Myrmecophaga tridactyla\n────────────────────────────────────── column first, optimal ───────────────────────────────────────\nUrsus americanus American marten Scolopax minor Ant \nAmerican buffalo Martes americana Anaconda (unidentified) Anteater, australian spiny\nBison bison American racer Eunectes sp. Tachyglossus aculeatus \nAmerican crow Coluber constrictor Andean goose Anteater, giant \nCorvus brachyrhynchos American woodcock Chloephaga melanoptera Myrmecophaga tridactyla \n─────────────────────────────────── column first, right to left ────────────────────────────────────\nAnt Scolopax minor American marten Ursus americanus \nAnteater, australian spiny Anaconda (unidentified) Martes americana American buffalo \nTachyglossus aculeatus Eunectes sp. American racer Bison bison \nAnteater, giant Andean goose Coluber constrictor American crow \nMyrmecophaga tridactyla Chloephaga melanoptera American woodcock Corvus brachyrhynchos\n────────────────────────────────────── equal columns, expand ───────────────────────────────────────\nChloephaga melanoptera American racer Ursus americanus \nAnt Coluber constrictor American buffalo \nAnteater, australian spiny American woodcock Bison bison \nTachyglossus aculeatus Scolopax minor American crow \nAnteater, giant Anaconda (unidentified) Corvus brachyrhynchos \nMyrmecophaga tridactyla Eunectes sp. American marten \n Andean goose Martes americana \n─────────────────────────────────────────── fixed width ────────────────────────────────────────────\nAnteater, Eunectes sp. Coluber Corvus Ursus americanus\naustralian spiny constrictor brachyrhynchos \nTachyglossus Andean goose American American marten American buffalo\naculeatus woodcock \nAnteater, giant Chloephaga Scolopax minor Martes americana Bison bison \n melanoptera \nMyrmecophaga Ant Anaconda American racer American crow \ntridactyla (unidentified) \n\n" + print("--") + print(expected) + print("--") assert render() == expected diff --git a/tests/test_table.py b/tests/test_table.py index 8767283c5..77a753383 100644 --- a/tests/test_table.py +++ b/tests/test_table.py @@ -382,6 +382,30 @@ def test_columns_highlight_added_by_add_row() -> None: assert output == expected +def test_padding_width(): + """Regression test for https://github.com/Textualize/rich/issues/3871 + + Padding should be even between cells/ + + """ + + table = Table.grid(padding=(0, 1)) + + for _ in range(3): + table.add_column(width=3) + + for row in range(1): + table.add_row(*["a" * 3 for _ in range(3)]) + + console = Console(record=True) + console.print(table) + output = console.export_text(styles=True) + + print(repr(output)) + expected = "aaa aaa aaa\n" + assert output == expected + + if __name__ == "__main__": render = render_tables() print(render) From 624664f00bb2b8b7c19f352f0a7a284af4a85412 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 11:27:44 +0000 Subject: [PATCH 058/100] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28a43eb87..0405f2c87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - IPython now respects when a `Console` instance is passed to `pretty.install` https://github.com/Textualize/rich/pull/3915 - Fixed extraneous blank line on non-interactive disabled `Progress` https://github.com/Textualize/rich/pull/3905 +- Fixed extra padding on first cell in columns https://github.com/Textualize/rich/pull/3935 ### Added From ffc639a3738e79ad73d35db09a70c338b35045a6 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 11:34:37 +0000 Subject: [PATCH 059/100] sponsor --- rich/__main__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rich/__main__.py b/rich/__main__.py index 495c933d7..864b3aed6 100644 --- a/rich/__main__.py +++ b/rich/__main__.py @@ -234,10 +234,9 @@ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: console.print(f"[dim]rendered in [not dim]{taken}ms[/] (warm cache)") console.print() console.print( - Panel.fit( + Panel( "[b magenta]Hope you enjoy using Rich![/]\n\n" - "Please consider sponsoring me if you get value from my work.\n\n" - "Even the price of a ☕ can brighten my day!\n\n" + "Consider sponsoring to ensure this project is maintained.\n\n" "[cyan]https://github.com/sponsors/willmcgugan[/cyan]", border_style="green", title="Help ensure Rich is maintained", From 05a6b9b17a7c778756187f15d6d4bf693db6345f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 12:00:45 +0000 Subject: [PATCH 060/100] ws --- rich/cells.py | 2 +- rich/text.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index 2b21a341f..442979095 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -155,7 +155,7 @@ def _cell_len(text: str, unicode_version: str) -> int: def split_graphemes( text: str, unicode_version: str = "auto" ) -> "tuple[list[CellSpan], int]": - """Divide text in to spans that define a single grapheme. + """Divide text into spans that define a single grapheme. Args: text: String to split. diff --git a/rich/text.py b/rich/text.py index b57d77c27..b5b114b42 100644 --- a/rich/text.py +++ b/rich/text.py @@ -1105,7 +1105,7 @@ def flatten_spans() -> Iterable[int]: return lines def divide(self, offsets: Iterable[int]) -> Lines: - """Divide text in to a number of lines at given offsets. + """Divide text into a number of lines at given offsets. Args: offsets (Iterable[int]): Offsets used to divide text. From ba2806e7f472d6c8e0118ce143562594be7f747b Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 13:30:56 +0000 Subject: [PATCH 061/100] don't strip whitespace when soft_wrap is True --- rich/text.py | 10 +++++----- tests/test_text.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/rich/text.py b/rich/text.py index b5b114b42..9ac3ec252 100644 --- a/rich/text.py +++ b/rich/text.py @@ -691,7 +691,6 @@ def __rich_console__( ) -> Iterable[Segment]: tab_size: int = console.tab_size if self.tab_size is None else self.tab_size justify = self.justify or options.justify or DEFAULT_JUSTIFY - overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW lines = self.wrap( @@ -1232,10 +1231,11 @@ def wrap( if "\t" in line: line.expand_tabs(tab_size) if no_wrap: - new_lines = Lines([line]) - else: - offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") - new_lines = line.divide(offsets) + lines.append(line) + continue + + offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") + new_lines = line.divide(offsets) for line in new_lines: line.rstrip_end(width) if wrap_justify: diff --git a/tests/test_text.py b/tests/test_text.py index 93a98d7c0..b528608ad 100644 --- a/tests/test_text.py +++ b/tests/test_text.py @@ -1092,3 +1092,21 @@ def test_append_loop_regression() -> None: b = Text("two", "blue") b.append_text(b) assert b.plain == "twotwo" + + +def test_soft_wrap() -> None: + """Regression test for https://github.com/Textualize/rich/issues/3841 + + Soft wrap should not strip trailing whitespace. + + """ + console = Console(color_system="standard", width=80, force_terminal=True) + text = Text(" Hello World ", style="white on blue") + + with console.capture() as capture: + console.print(text, soft_wrap=True) + + output = capture.get() + print(repr(output)) + expected = "\x1b[37;44m Hello World \x1b[0m\n" + assert output == expected From c2514fb22c1bb3287a79b035c1b17b16183482b4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 13:31:59 +0000 Subject: [PATCH 062/100] typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7b039886..6e200399d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed exception when callling `inspect` on objects with unusual `__qualname__` attribute https://github.com/Textualize/rich/pull/3894 +- Fixed exception when calling `inspect` on objects with unusual `__qualname__` attribute https://github.com/Textualize/rich/pull/3894 ## [14.1.0] - 2025-06-25 From b9040928de20454342b58e9ecaabeba092b74626 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 13:37:35 +0000 Subject: [PATCH 063/100] changelog --- CHANGELOG.md | 1 + rich/text.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e200399d..57db5c696 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - IPython now respects when a `Console` instance is passed to `pretty.install` https://github.com/Textualize/rich/pull/3915 - Fixed extraneous blank line on non-interactive disabled `Progress` https://github.com/Textualize/rich/pull/3905 - Fixed extra padding on first cell in columns https://github.com/Textualize/rich/pull/3935 +- Fixed trailing whitespace removed when soft_wrap=True ### Added diff --git a/rich/text.py b/rich/text.py index 9ac3ec252..60109dd9e 100644 --- a/rich/text.py +++ b/rich/text.py @@ -1231,13 +1231,15 @@ def wrap( if "\t" in line: line.expand_tabs(tab_size) if no_wrap: - lines.append(line) - continue - - offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") - new_lines = line.divide(offsets) - for line in new_lines: - line.rstrip_end(width) + if overflow == "ignore": + lines.append(line) + continue + new_lines = Lines([line]) + else: + offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") + new_lines = line.divide(offsets) + for line in new_lines: + line.rstrip_end(width) if wrap_justify: new_lines.justify( console, width, justify=wrap_justify, overflow=wrap_overflow From 4d0cbb74a8cc5c7dd9af3056499a43efbd13355a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 13:38:07 +0000 Subject: [PATCH 064/100] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57db5c696..a3b06bdae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - IPython now respects when a `Console` instance is passed to `pretty.install` https://github.com/Textualize/rich/pull/3915 - Fixed extraneous blank line on non-interactive disabled `Progress` https://github.com/Textualize/rich/pull/3905 - Fixed extra padding on first cell in columns https://github.com/Textualize/rich/pull/3935 -- Fixed trailing whitespace removed when soft_wrap=True +- Fixed trailing whitespace removed when soft_wrap=True https://github.com/Textualize/rich/pull/3937 ### Added From 39ee57dfe70614381c3ebce34cb35cab557af2f5 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:04:35 +0000 Subject: [PATCH 065/100] fix background style with soft wrap --- rich/console.py | 11 ++++++----- tests/test_text.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/rich/console.py b/rich/console.py index 994adfc06..406a088cb 100644 --- a/rich/console.py +++ b/rich/console.py @@ -1723,12 +1723,13 @@ def print( for renderable in renderables: extend(render(renderable, render_options)) else: + render_style = self.get_style(style) + new_line = Segment.line() for renderable in renderables: - extend( - Segment.apply_style( - render(renderable, render_options), self.get_style(style) - ) - ) + for line in Segment.split_lines(render(renderable, render_options)): + extend(Segment.apply_style(line, render_style)) + new_segments.append(new_line) + if new_line_start: if ( len("".join(segment.text for segment in new_segments).splitlines()) diff --git a/tests/test_text.py b/tests/test_text.py index b528608ad..b6d39f594 100644 --- a/tests/test_text.py +++ b/tests/test_text.py @@ -1110,3 +1110,20 @@ def test_soft_wrap() -> None: print(repr(output)) expected = "\x1b[37;44m Hello World \x1b[0m\n" assert output == expected + + +def test_soft_wrap_styled() -> None: + """Regression test for https://github.com/Textualize/rich/issues/3838 + + If soft_wrap is True and a style is set, we don't want to style the new lines. + """ + console = Console(color_system="standard", width=80, force_terminal=True) + with console.capture() as capture: + console.print("soft wrap is on", style="blue on white", soft_wrap=True) + console.print("Next line") + + output = capture.get() + print(repr(output)) + # Background is reset before \n + expected = "\x1b[34;47msoft wrap is on\x1b[0m\nNext line\n" + assert output == expected From 565087254a8c9f1e75dd6635b0c3df52190515fe Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:07:12 +0000 Subject: [PATCH 066/100] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3b06bdae..53e925640 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed extraneous blank line on non-interactive disabled `Progress` https://github.com/Textualize/rich/pull/3905 - Fixed extra padding on first cell in columns https://github.com/Textualize/rich/pull/3935 - Fixed trailing whitespace removed when soft_wrap=True https://github.com/Textualize/rich/pull/3937 +- Fixed style new-lines when soft_wrap = True and a print style is set https://github.com/Textualize/rich/pull/3938 ### Added From 9992173c74051e6f0b3e336775fea6feb5e56d33 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:26:19 +0000 Subject: [PATCH 067/100] split lines terminator --- CHANGELOG.md | 1 + rich/console.py | 7 +++++-- rich/segment.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53e925640..33d7734cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for `UNICODE_VERSION` environment variable https://github.com/Textualize/rich/pull/3930 - Added `last_render_height` property to LiveRender https://github.com/Textualize/rich/pull/3934 - Expose locals_max_depth and locals_overflow in traceback.install https://github.com/Textualize/rich/pull/3906/ +- Added `Segment.split_lines_terminator` https://github.com/Textualize/rich/pull/3938 ### Changed diff --git a/rich/console.py b/rich/console.py index 406a088cb..ad92d529c 100644 --- a/rich/console.py +++ b/rich/console.py @@ -1726,9 +1726,12 @@ def print( render_style = self.get_style(style) new_line = Segment.line() for renderable in renderables: - for line in Segment.split_lines(render(renderable, render_options)): + for line, add_new_line in Segment.split_lines_terminator( + render(renderable, render_options) + ): extend(Segment.apply_style(line, render_style)) - new_segments.append(new_line) + if add_new_line: + new_segments.append(new_line) if new_line_start: if ( diff --git a/rich/segment.py b/rich/segment.py index edcb52dd3..0df63fdef 100644 --- a/rich/segment.py +++ b/rich/segment.py @@ -275,6 +275,37 @@ def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]] if line: yield line + @classmethod + def split_lines_terminator( + cls, segments: Iterable["Segment"] + ) -> Iterable[Tuple[List["Segment"], bool]]: + """Split a sequence of segments in to a list of lines and a boolean to indicate if there was a new line. + + Args: + segments (Iterable[Segment]): Segments potentially containing line feeds. + + Yields: + Iterable[List[Segment]]: Iterable of segment lists, one per line. + """ + line: List[Segment] = [] + append = line.append + + for segment in segments: + if "\n" in segment.text and not segment.control: + text, style, _ = segment + while text: + _text, new_line, text = text.partition("\n") + if _text: + append(cls(_text, style)) + if new_line: + yield (line, True) + line = [] + append = line.append + else: + append(segment) + if line: + yield (line, False) + @classmethod def split_and_crop_lines( cls, From cead8a0c0898f7fe24a2c9d2f4c852fae26fef71 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:27:15 +0000 Subject: [PATCH 068/100] test --- tests/test_segment.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_segment.py b/tests/test_segment.py index 2264dbe50..8ab169aef 100644 --- a/tests/test_segment.py +++ b/tests/test_segment.py @@ -34,6 +34,14 @@ def test_split_lines(): assert list(Segment.split_lines(lines)) == [[Segment("Hello")], [Segment("World")]] +def test_split_lines_terminator(): + lines = [Segment("Hello\nWorld")] + assert list(Segment.split_lines_terminator(lines)) == [ + ([Segment("Hello")], True), + ([Segment("World")], False), + ] + + def test_split_and_crop_lines(): assert list( Segment.split_and_crop_lines([Segment("Hello\nWorld!\n"), Segment("foo")], 4) From 2c247e6da72dfa69dd6148f1a0657e2440d1ebe9 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:28:10 +0000 Subject: [PATCH 069/100] test --- tests/test_segment.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_segment.py b/tests/test_segment.py index 8ab169aef..60a7a9d59 100644 --- a/tests/test_segment.py +++ b/tests/test_segment.py @@ -42,6 +42,13 @@ def test_split_lines_terminator(): ] +def test_split_lines_terminator_single_line(): + lines = [Segment("Hello")] + assert list(Segment.split_lines_terminator(lines)) == [ + ([Segment("Hello")], False), + ] + + def test_split_and_crop_lines(): assert list( Segment.split_and_crop_lines([Segment("Hello\nWorld!\n"), Segment("foo")], 4) From 624b30c5979ec602291a2fff0be8d222060f86d1 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 15:37:59 +0000 Subject: [PATCH 070/100] typing highlighter --- rich/highlighter.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rich/highlighter.py b/rich/highlighter.py index e4c462e2b..df28048f8 100644 --- a/rich/highlighter.py +++ b/rich/highlighter.py @@ -1,6 +1,6 @@ import re from abc import ABC, abstractmethod -from typing import List, Union +from typing import ClassVar, Sequence, Union from .text import Span, Text @@ -61,8 +61,8 @@ def highlight(self, text: Text) -> None: class RegexHighlighter(Highlighter): """Applies highlighting from a list of regular expressions.""" - highlights: List[str] = [] - base_style: str = "" + highlights: ClassVar[Sequence[str]] = [] + base_style: ClassVar[str] = "" def highlight(self, text: Text) -> None: """Highlight :class:`rich.text.Text` using regular expressions. @@ -81,7 +81,7 @@ class ReprHighlighter(RegexHighlighter): """Highlights the text typically produced from ``__repr__`` methods.""" base_style = "repr." - highlights = [ + highlights: ClassVar[Sequence[str]] = [ r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', r"(?P[][{}()])", @@ -110,8 +110,8 @@ class JSONHighlighter(RegexHighlighter): JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", @@ -145,8 +145,8 @@ class ISO8601Highlighter(RegexHighlighter): Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html """ - base_style = "iso8601." - highlights = [ + base_style: ClassVar[str] = "iso8601." + highlights: ClassVar[Sequence[str]] = [ # # Dates # From d008e2ab69b60900801e707e056dfc467290a29f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 16:01:42 +0000 Subject: [PATCH 071/100] faq --- FAQ.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/FAQ.md b/FAQ.md index 72ce2b317..145f13cd1 100644 --- a/FAQ.md +++ b/FAQ.md @@ -2,6 +2,7 @@ # Frequently Asked Questions - [How do I log a renderable?](#how-do-i-log-a-renderable) - [How do I render console markup in RichHandler?](#how-do-i-render-console-markup-in-richhandler) +- [Incorrect highlights in printed output](#incorrect-highlights-in-printed-output) - [Natively inserted ANSI escape sequence characters break alignment of Panel.](#natively-inserted-ansi-escape-sequence-characters-break-alignment-of-panel) - [python -m rich.spinner shows extra lines.](#python--m-richspinner-shows-extra-lines) - [Rich is automatically installing traceback handler.](#rich-is-automatically-installing-traceback-handler) @@ -27,6 +28,20 @@ Console markup won't work anywhere else, other than `RichHandler` -- which is wh See the docs if you want to [enable console markup](https://rich.readthedocs.io/en/latest/logging.html#logging-handler) in the logging handler. + +## Incorrect highlights in printed output + +Rich's default highlighter will highlight a number of common patterns, useful for debugging. +Occasionally you may find that it highlights text incorrectly. +This may be unavoidable, as Rich only sees text and can only make a best guess at what it means. + +If this happens, consider disabling highlighting, or write a custom highlighter that better reflects the text you are writing. See the docs for details... + +https://rich.readthedocs.io/en/latest/highlighting.html + +Issues and PRs for highlighters will only be accepted for clearly broken regular expressions. +This is because a fix for your needs can break the highlighting for someone else. + ## Natively inserted ANSI escape sequence characters break alignment of Panel. From 33092121924c84fb31bb19801bdb9750e9f36131 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 16:18:20 +0000 Subject: [PATCH 072/100] faqs --- FAQ.md | 17 +++++++++++++++++ questions/highlight_incorrect.question.md | 16 ++++++++++++++++ questions/jupyter.question.md | 19 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 questions/highlight_incorrect.question.md create mode 100644 questions/jupyter.question.md diff --git a/FAQ.md b/FAQ.md index 145f13cd1..c47acbb87 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1,5 +1,6 @@ # Frequently Asked Questions +- [Extra space, not enough space, in Jupyter output](#extra-space-not-enough-space-in-jupyter-output) - [How do I log a renderable?](#how-do-i-log-a-renderable) - [How do I render console markup in RichHandler?](#how-do-i-render-console-markup-in-richhandler) - [Incorrect highlights in printed output](#incorrect-highlights-in-printed-output) @@ -10,6 +11,22 @@ - [Why does content in square brackets disappear?](#why-does-content-in-square-brackets-disappear) - [Why does emoji break alignment in a Table or Panel?](#why-does-emoji-break-alignment-in-a-table-or-panel) + +## Extra space, not enough space, in Jupyter output + +There are many different implementations of Jupyter, from different venders. + +Different notebook software may render Rich's output differently, due to how the CSS is constructed. +Adding or removing space, may make the output look good on your software, but break somewhere else. + +I have been adding and removing new lines for jupyter since Rich added support, and I am reluctant to continue to do that, *unless* there is some supporting evidence that Rich is doing the wrong thing. +I'm afraid that making it look better for your software isn't evidence. + +Without that evidence, I may close issues and PRs for this issue. +I will accept PRs, if sufficient research has been done regarding not breaking other Jupyter implementations (but that is a high bar). + +Thanks for undertstanding. + ## How do I log a renderable? diff --git a/questions/highlight_incorrect.question.md b/questions/highlight_incorrect.question.md new file mode 100644 index 000000000..06a0cfb62 --- /dev/null +++ b/questions/highlight_incorrect.question.md @@ -0,0 +1,16 @@ +--- +title: "Incorrect highlights in printed output" +alt_title: + - "Highlighter not highlighting data" +--- + +Rich's default highlighter will highlight a number of common patterns, useful for debugging. +Occasionally you may find that it highlights text incorrectly. +This may be unavoidable, as Rich only sees text and can only make a best guess at what it means. + +If this happens, consider disabling highlighting, or write a custom highlighter that better reflects the text you are writing. See the docs for details... + +https://rich.readthedocs.io/en/latest/highlighting.html + +Issues and PRs for highlighters will only be accepted for clearly broken regular expressions. +This is because a fix for your needs can break the highlighting for someone else. diff --git a/questions/jupyter.question.md b/questions/jupyter.question.md new file mode 100644 index 000000000..f5a1fba6e --- /dev/null +++ b/questions/jupyter.question.md @@ -0,0 +1,19 @@ +--- +title: "Extra space, not enough space, in Jupyter output" +alt_titles: + - "Extra new line in Jupyter" + - "Not enough space in Jupyter" +--- + +There are many different implementations of Jupyter, from different venders. + +Different notebook software may render Rich's output differently, due to how the CSS is constructed. +Adding or removing space, may make the output look good on your software, but break somewhere else. + +I have been adding and removing new lines for jupyter since Rich added support, and I am reluctant to continue to do that, *unless* there is some supporting evidence that Rich is doing the wrong thing. +I'm afraid that making it look better for your software isn't evidence. + +Without that evidence, I may close issues and PRs for this issue. +I will accept PRs, if sufficient research has been done regarding not breaking other Jupyter implementations (but that is a high bar). + +Thanks for undertstanding. From e1eef1f20c93948b9c5ff877f0bd9bf967a11cd7 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 16:20:59 +0000 Subject: [PATCH 073/100] remove error docstring --- rich/table.py | 1 - 1 file changed, 1 deletion(-) diff --git a/rich/table.py b/rich/table.py index bfcb8c3f4..1e2eb2b45 100644 --- a/rich/table.py +++ b/rich/table.py @@ -49,7 +49,6 @@ class Column: padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. show_header (bool, optional): Show a header row. Defaults to True. show_footer (bool, optional): Show a footer row. Defaults to False. show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. From c595fa95068dd2c5095d25446b2f0571bc0b3995 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 23 Jan 2026 16:37:46 +0000 Subject: [PATCH 074/100] contributing --- CONTRIBUTING.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb27eb0f4..dc01f0e74 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,20 +12,13 @@ Rich uses [poetry](https://python-poetry.org/docs/) for packaging and dependency management. To start developing with Rich, install Poetry using the [recommended method](https://python-poetry.org/docs/#installation). -Next, you'll need to create a _fork_ (your own personal copy) of the Rich repository, and clone that fork +Next, you'll need to create a _fork_ (your own personal copy) of the Rich repository, and clone that fork on to your local machine. GitHub offers a great tutorial for this process [here](https://docs.github.com/en/get-started/quickstart/fork-a-repo). After following this guide, you'll have a local copy of the Rich project installed. Enter the directory containing your copy of Rich (`cd rich`). -Poetry can be used to create an isolated _virtual environment_ for the project: - -``` -poetry shell -``` - -The first time we run `poetry shell`, such an isolated environment is created and forever associated with our project. -Any time we wish to enter this virtual environment again, we simply run `poetry shell` again. +Next create and activate a [virtual environment](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#create-and-use-virtual-environments) for Rich. Now we can install the dependencies of Rich into the virtual environment: @@ -103,7 +96,7 @@ and use `make format` to format and write to the files. Consider whether the change you made would benefit from documentation - if the feature has any user impact at all, the answer is almost certainly yes! Documentation can be found in the `docs` directory. -There are some additional dependencies required to build the documentation. +There are some additional dependencies required to build the documentation. These dependencies can be installed by running (from the `docs` directory): ``` @@ -151,4 +144,4 @@ There may be some discussion and, in most cases, a few iterations will be requir ## Afterwards When the pull request is approved, it will be merged into the `master` branch. -Your change will only be available to users the next time Rich is released. +Your change will only be available to users the next time Rich is released. From e9b0e19158034a49f2d7048cdf82d7146e59715f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 12:01:02 +0000 Subject: [PATCH 075/100] Update to markdown styles --- CHANGELOG.md | 3 ++ rich/default_styles.py | 20 ++++++----- rich/markdown.py | 50 ++++++++++++++++++---------- tests/_card_render.py | 2 +- tests/test_markdown.py | 10 +++--- tests/test_markdown_no_hyperlinks.py | 6 ++-- 6 files changed, 55 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33d7734cd..21959fdf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `cells.cell_len` now has a `unicode_version` parameter (that you probably should never change) https://github.com/Textualize/rich/pull/3930 - Live will not write a new line if there was nothing rendered https://github.com/Textualize/rich/pull/3934 +- Changed style of Markdown headers +- Changed style of Markdown tables, added `markdown.table.header` and `markdown.table.border` styles +- Changed style of Markdown rules ## [14.2.0] - 2025-10-09 diff --git a/rich/default_styles.py b/rich/default_styles.py index 3a0ad83a2..c18b6095e 100644 --- a/rich/default_styles.py +++ b/rich/default_styles.py @@ -149,20 +149,22 @@ "markdown.block_quote": Style(color="magenta"), "markdown.list": Style(color="cyan"), "markdown.item": Style(), - "markdown.item.bullet": Style(color="yellow", bold=True), - "markdown.item.number": Style(color="yellow", bold=True), - "markdown.hr": Style(color="yellow"), + "markdown.item.bullet": Style(bold=True), + "markdown.item.number": Style(color="cyan"), + "markdown.hr": Style(dim=True), "markdown.h1.border": Style(), - "markdown.h1": Style(bold=True), - "markdown.h2": Style(bold=True, underline=True), - "markdown.h3": Style(bold=True), - "markdown.h4": Style(bold=True, dim=True), - "markdown.h5": Style(underline=True), - "markdown.h6": Style(italic=True), + "markdown.h1": Style(bold=True, underline=True), + "markdown.h2": Style(color="magenta", underline=True), + "markdown.h3": Style(color="magenta", bold=True), + "markdown.h4": Style(color="magenta", italic=True), + "markdown.h5": Style(italic=True), + "markdown.h6": Style(dim=True), "markdown.h7": Style(italic=True, dim=True), "markdown.link": Style(color="bright_blue"), "markdown.link_url": Style(color="blue", underline=True), "markdown.s": Style(strike=True), + "markdown.table.border": Style(color="cyan"), + "markdown.table.header": Style(color="cyan", bold=False), "iso8601.date": Style(color="blue"), "iso8601.time": Style(color="magenta"), "iso8601.timezone": Style(color="yellow"), diff --git a/rich/markdown.py b/rich/markdown.py index 12496487b..5db183b0a 100644 --- a/rich/markdown.py +++ b/rich/markdown.py @@ -1,6 +1,7 @@ from __future__ import annotations import sys +from dataclasses import dataclass from typing import ClassVar, Iterable, get_args from markdown_it import MarkdownIt @@ -14,7 +15,6 @@ from .console import Console, ConsoleOptions, JustifyMethod, RenderResult from .containers import Renderables from .jupyter import JupyterMixin -from .panel import Panel from .rule import Rule from .segment import Segment from .style import Style, StyleStack @@ -124,9 +124,24 @@ def __rich_console__( yield self.text +@dataclass +class HeadingFormat: + justify: JustifyMethod = "left" + style: str = "" + + class Heading(TextElement): """A heading.""" + LEVEL_ALIGN: ClassVar[dict[str, JustifyMethod]] = { + "h1": "center", + "h2": "left", + "h3": "left", + "h4": "left", + "h5": "left", + "h6": "left", + } + @classmethod def create(cls, markdown: Markdown, token: Token) -> Heading: return cls(token.tag) @@ -143,20 +158,10 @@ def __init__(self, tag: str) -> None: def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - text = self.text - text.justify = "center" - if self.tag == "h1": - # Draw a border around h1s - yield Panel( - text, - box=box.HEAVY, - style="markdown.h1.border", - ) - else: - # Styled text for h2 and beyond - if self.tag == "h2": - yield Text("") - yield text + text = self.text.copy() + heading_justify = self.LEVEL_ALIGN.get(self.tag, "left") + text.justify = heading_justify + yield text class CodeBlock(TextElement): @@ -219,7 +224,8 @@ def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: style = console.get_style("markdown.hr", default="none") - yield Rule(style=style) + yield Rule(style=style, characters="-") + yield Text() class TableElement(MarkdownElement): @@ -241,11 +247,19 @@ def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bo def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: - table = Table(box=box.SIMPLE_HEAVY) + table = Table( + box=box.SIMPLE, + pad_edge=False, + style="markdown.table.border", + show_edge=True, + collapse_padding=True, + ) if self.header is not None and self.header.row is not None: for column in self.header.row.cells: - table.add_column(column.content) + heading = column.content.copy() + heading.stylize("markdown.table.header") + table.add_column(heading) if self.body is not None: for row in self.body.rows: diff --git a/tests/_card_render.py b/tests/_card_render.py index 501c95233..f1f2b5a9f 100644 --- a/tests/_card_render.py +++ b/tests/_card_render.py @@ -1 +1 @@ -expected = "\x1b[3m Rich features \x1b[0m\n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Colors \x1b[0m\x1b[1;31m \x1b[0m✓ \x1b[1;32m4-bit color\x1b[0m \x1b[38;2;86;0;0;48;2;51;0;0m▄\x1b[0m\x1b[38;2;86;9;0;48;2;51;5;0m▄\x1b[0m\x1b[38;2;86;18;0;48;2;51;11;0m▄\x1b[0m\x1b[38;2;86;28;0;48;2;51;16;0m▄\x1b[0m\x1b[38;2;86;37;0;48;2;51;22;0m▄\x1b[0m\x1b[38;2;86;47;0;48;2;51;27;0m▄\x1b[0m\x1b[38;2;86;56;0;48;2;51;33;0m▄\x1b[0m\x1b[38;2;86;66;0;48;2;51;38;0m▄\x1b[0m\x1b[38;2;86;75;0;48;2;51;44;0m▄\x1b[0m\x1b[38;2;86;85;0;48;2;51;50;0m▄\x1b[0m\x1b[38;2;78;86;0;48;2;46;51;0m▄\x1b[0m\x1b[38;2;69;86;0;48;2;40;51;0m▄\x1b[0m\x1b[38;2;59;86;0;48;2;35;51;0m▄\x1b[0m\x1b[38;2;50;86;0;48;2;29;51;0m▄\x1b[0m\x1b[38;2;40;86;0;48;2;24;51;0m▄\x1b[0m\x1b[38;2;31;86;0;48;2;18;51;0m▄\x1b[0m\x1b[38;2;22;86;0;48;2;12;51;0m▄\x1b[0m\x1b[38;2;12;86;0;48;2;7;51;0m▄\x1b[0m\x1b[38;2;3;86;0;48;2;1;51;0m▄\x1b[0m\x1b[38;2;0;86;6;48;2;0;51;3m▄\x1b[0m\x1b[38;2;0;86;15;48;2;0;51;9m▄\x1b[0m\x1b[38;2;0;86;25;48;2;0;51;14m▄\x1b[0m\x1b[38;2;0;86;34;48;2;0;51;20m▄\x1b[0m\x1b[38;2;0;86;44;48;2;0;51;25m▄\x1b[0m\x1b[38;2;0;86;53;48;2;0;51;31m▄\x1b[0m\x1b[38;2;0;86;63;48;2;0;51;37m▄\x1b[0m\x1b[38;2;0;86;72;48;2;0;51;42m▄\x1b[0m\x1b[38;2;0;86;81;48;2;0;51;48m▄\x1b[0m\x1b[38;2;0;81;86;48;2;0;48;51m▄\x1b[0m\x1b[38;2;0;72;86;48;2;0;42;51m▄\x1b[0m\x1b[38;2;0;63;86;48;2;0;37;51m▄\x1b[0m\x1b[38;2;0;53;86;48;2;0;31;51m▄\x1b[0m\x1b[38;2;0;44;86;48;2;0;25;51m▄\x1b[0m\x1b[38;2;0;34;86;48;2;0;20;51m▄\x1b[0m\x1b[38;2;0;25;86;48;2;0;14;51m▄\x1b[0m\x1b[38;2;0;15;86;48;2;0;9;51m▄\x1b[0m\x1b[38;2;0;6;86;48;2;0;3;51m▄\x1b[0m\x1b[38;2;3;0;86;48;2;1;0;51m▄\x1b[0m\x1b[38;2;12;0;86;48;2;7;0;51m▄\x1b[0m\x1b[38;2;22;0;86;48;2;12;0;51m▄\x1b[0m\x1b[38;2;31;0;86;48;2;18;0;51m▄\x1b[0m\x1b[38;2;40;0;86;48;2;24;0;51m▄\x1b[0m\x1b[38;2;50;0;86;48;2;29;0;51m▄\x1b[0m\x1b[38;2;59;0;86;48;2;35;0;51m▄\x1b[0m\x1b[38;2;69;0;86;48;2;40;0;51m▄\x1b[0m\x1b[38;2;78;0;86;48;2;46;0;51m▄\x1b[0m\x1b[38;2;86;0;85;48;2;51;0;50m▄\x1b[0m\x1b[38;2;86;0;75;48;2;51;0;44m▄\x1b[0m\x1b[38;2;86;0;66;48;2;51;0;38m▄\x1b[0m\x1b[38;2;86;0;56;48;2;51;0;33m▄\x1b[0m\x1b[38;2;86;0;47;48;2;51;0;27m▄\x1b[0m\x1b[38;2;86;0;37;48;2;51;0;22m▄\x1b[0m\x1b[38;2;86;0;28;48;2;51;0;16m▄\x1b[0m\x1b[38;2;86;0;18;48;2;51;0;11m▄\x1b[0m\x1b[38;2;86;0;9;48;2;51;0;5m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;34m8-bit color\x1b[0m \x1b[38;2;158;0;0;48;2;122;0;0m▄\x1b[0m\x1b[38;2;158;17;0;48;2;122;13;0m▄\x1b[0m\x1b[38;2;158;34;0;48;2;122;26;0m▄\x1b[0m\x1b[38;2;158;51;0;48;2;122;40;0m▄\x1b[0m\x1b[38;2;158;68;0;48;2;122;53;0m▄\x1b[0m\x1b[38;2;158;86;0;48;2;122;66;0m▄\x1b[0m\x1b[38;2;158;103;0;48;2;122;80;0m▄\x1b[0m\x1b[38;2;158;120;0;48;2;122;93;0m▄\x1b[0m\x1b[38;2;158;137;0;48;2;122;106;0m▄\x1b[0m\x1b[38;2;158;155;0;48;2;122;120;0m▄\x1b[0m\x1b[38;2;143;158;0;48;2;111;122;0m▄\x1b[0m\x1b[38;2;126;158;0;48;2;97;122;0m▄\x1b[0m\x1b[38;2;109;158;0;48;2;84;122;0m▄\x1b[0m\x1b[38;2;91;158;0;48;2;71;122;0m▄\x1b[0m\x1b[38;2;74;158;0;48;2;57;122;0m▄\x1b[0m\x1b[38;2;57;158;0;48;2;44;122;0m▄\x1b[0m\x1b[38;2;40;158;0;48;2;31;122;0m▄\x1b[0m\x1b[38;2;22;158;0;48;2;17;122;0m▄\x1b[0m\x1b[38;2;5;158;0;48;2;4;122;0m▄\x1b[0m\x1b[38;2;0;158;11;48;2;0;122;8m▄\x1b[0m\x1b[38;2;0;158;28;48;2;0;122;22m▄\x1b[0m\x1b[38;2;0;158;45;48;2;0;122;35m▄\x1b[0m\x1b[38;2;0;158;63;48;2;0;122;48m▄\x1b[0m\x1b[38;2;0;158;80;48;2;0;122;62m▄\x1b[0m\x1b[38;2;0;158;97;48;2;0;122;75m▄\x1b[0m\x1b[38;2;0;158;114;48;2;0;122;89m▄\x1b[0m\x1b[38;2;0;158;132;48;2;0;122;102m▄\x1b[0m\x1b[38;2;0;158;149;48;2;0;122;115m▄\x1b[0m\x1b[38;2;0;149;158;48;2;0;115;122m▄\x1b[0m\x1b[38;2;0;132;158;48;2;0;102;122m▄\x1b[0m\x1b[38;2;0;114;158;48;2;0;89;122m▄\x1b[0m\x1b[38;2;0;97;158;48;2;0;75;122m▄\x1b[0m\x1b[38;2;0;80;158;48;2;0;62;122m▄\x1b[0m\x1b[38;2;0;63;158;48;2;0;48;122m▄\x1b[0m\x1b[38;2;0;45;158;48;2;0;35;122m▄\x1b[0m\x1b[38;2;0;28;158;48;2;0;22;122m▄\x1b[0m\x1b[38;2;0;11;158;48;2;0;8;122m▄\x1b[0m\x1b[38;2;5;0;158;48;2;4;0;122m▄\x1b[0m\x1b[38;2;22;0;158;48;2;17;0;122m▄\x1b[0m\x1b[38;2;40;0;158;48;2;31;0;122m▄\x1b[0m\x1b[38;2;57;0;158;48;2;44;0;122m▄\x1b[0m\x1b[38;2;74;0;158;48;2;57;0;122m▄\x1b[0m\x1b[38;2;91;0;158;48;2;71;0;122m▄\x1b[0m\x1b[38;2;109;0;158;48;2;84;0;122m▄\x1b[0m\x1b[38;2;126;0;158;48;2;97;0;122m▄\x1b[0m\x1b[38;2;143;0;158;48;2;111;0;122m▄\x1b[0m\x1b[38;2;158;0;155;48;2;122;0;120m▄\x1b[0m\x1b[38;2;158;0;137;48;2;122;0;106m▄\x1b[0m\x1b[38;2;158;0;120;48;2;122;0;93m▄\x1b[0m\x1b[38;2;158;0;103;48;2;122;0;80m▄\x1b[0m\x1b[38;2;158;0;86;48;2;122;0;66m▄\x1b[0m\x1b[38;2;158;0;68;48;2;122;0;53m▄\x1b[0m\x1b[38;2;158;0;51;48;2;122;0;40m▄\x1b[0m\x1b[38;2;158;0;34;48;2;122;0;26m▄\x1b[0m\x1b[38;2;158;0;17;48;2;122;0;13m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;35mTruecolor (16.7 million)\x1b[0m \x1b[38;2;229;0;0;48;2;193;0;0m▄\x1b[0m\x1b[38;2;229;25;0;48;2;193;21;0m▄\x1b[0m\x1b[38;2;229;50;0;48;2;193;42;0m▄\x1b[0m\x1b[38;2;229;75;0;48;2;193;63;0m▄\x1b[0m\x1b[38;2;229;100;0;48;2;193;84;0m▄\x1b[0m\x1b[38;2;229;125;0;48;2;193;105;0m▄\x1b[0m\x1b[38;2;229;150;0;48;2;193;126;0m▄\x1b[0m\x1b[38;2;229;175;0;48;2;193;147;0m▄\x1b[0m\x1b[38;2;229;200;0;48;2;193;169;0m▄\x1b[0m\x1b[38;2;229;225;0;48;2;193;190;0m▄\x1b[0m\x1b[38;2;208;229;0;48;2;176;193;0m▄\x1b[0m\x1b[38;2;183;229;0;48;2;155;193;0m▄\x1b[0m\x1b[38;2;158;229;0;48;2;133;193;0m▄\x1b[0m\x1b[38;2;133;229;0;48;2;112;193;0m▄\x1b[0m\x1b[38;2;108;229;0;48;2;91;193;0m▄\x1b[0m\x1b[38;2;83;229;0;48;2;70;193;0m▄\x1b[0m\x1b[38;2;58;229;0;48;2;49;193;0m▄\x1b[0m\x1b[38;2;33;229;0;48;2;28;193;0m▄\x1b[0m\x1b[38;2;8;229;0;48;2;7;193;0m▄\x1b[0m\x1b[38;2;0;229;16;48;2;0;193;14m▄\x1b[0m\x1b[38;2;0;229;41;48;2;0;193;35m▄\x1b[0m\x1b[38;2;0;229;66;48;2;0;193;56m▄\x1b[0m\x1b[38;2;0;229;91;48;2;0;193;77m▄\x1b[0m\x1b[38;2;0;229;116;48;2;0;193;98m▄\x1b[0m\x1b[38;2;0;229;141;48;2;0;193;119m▄\x1b[0m\x1b[38;2;0;229;166;48;2;0;193;140m▄\x1b[0m\x1b[38;2;0;229;191;48;2;0;193;162m▄\x1b[0m\x1b[38;2;0;229;216;48;2;0;193;183m▄\x1b[0m\x1b[38;2;0;216;229;48;2;0;183;193m▄\x1b[0m\x1b[38;2;0;191;229;48;2;0;162;193m▄\x1b[0m\x1b[38;2;0;166;229;48;2;0;140;193m▄\x1b[0m\x1b[38;2;0;141;229;48;2;0;119;193m▄\x1b[0m\x1b[38;2;0;116;229;48;2;0;98;193m▄\x1b[0m\x1b[38;2;0;91;229;48;2;0;77;193m▄\x1b[0m\x1b[38;2;0;66;229;48;2;0;56;193m▄\x1b[0m\x1b[38;2;0;41;229;48;2;0;35;193m▄\x1b[0m\x1b[38;2;0;16;229;48;2;0;14;193m▄\x1b[0m\x1b[38;2;8;0;229;48;2;7;0;193m▄\x1b[0m\x1b[38;2;33;0;229;48;2;28;0;193m▄\x1b[0m\x1b[38;2;58;0;229;48;2;49;0;193m▄\x1b[0m\x1b[38;2;83;0;229;48;2;70;0;193m▄\x1b[0m\x1b[38;2;108;0;229;48;2;91;0;193m▄\x1b[0m\x1b[38;2;133;0;229;48;2;112;0;193m▄\x1b[0m\x1b[38;2;158;0;229;48;2;133;0;193m▄\x1b[0m\x1b[38;2;183;0;229;48;2;155;0;193m▄\x1b[0m\x1b[38;2;208;0;229;48;2;176;0;193m▄\x1b[0m\x1b[38;2;229;0;225;48;2;193;0;190m▄\x1b[0m\x1b[38;2;229;0;200;48;2;193;0;169m▄\x1b[0m\x1b[38;2;229;0;175;48;2;193;0;147m▄\x1b[0m\x1b[38;2;229;0;150;48;2;193;0;126m▄\x1b[0m\x1b[38;2;229;0;125;48;2;193;0;105m▄\x1b[0m\x1b[38;2;229;0;100;48;2;193;0;84m▄\x1b[0m\x1b[38;2;229;0;75;48;2;193;0;63m▄\x1b[0m\x1b[38;2;229;0;50;48;2;193;0;42m▄\x1b[0m\x1b[38;2;229;0;25;48;2;193;0;21m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;33mDumb terminals\x1b[0m \x1b[38;2;254;45;45;48;2;255;10;10m▄\x1b[0m\x1b[38;2;254;68;45;48;2;255;36;10m▄\x1b[0m\x1b[38;2;254;91;45;48;2;255;63;10m▄\x1b[0m\x1b[38;2;254;114;45;48;2;255;90;10m▄\x1b[0m\x1b[38;2;254;137;45;48;2;255;117;10m▄\x1b[0m\x1b[38;2;254;159;45;48;2;255;143;10m▄\x1b[0m\x1b[38;2;254;182;45;48;2;255;170;10m▄\x1b[0m\x1b[38;2;254;205;45;48;2;255;197;10m▄\x1b[0m\x1b[38;2;254;228;45;48;2;255;223;10m▄\x1b[0m\x1b[38;2;254;251;45;48;2;255;250;10m▄\x1b[0m\x1b[38;2;235;254;45;48;2;232;255;10m▄\x1b[0m\x1b[38;2;213;254;45;48;2;206;255;10m▄\x1b[0m\x1b[38;2;190;254;45;48;2;179;255;10m▄\x1b[0m\x1b[38;2;167;254;45;48;2;152;255;10m▄\x1b[0m\x1b[38;2;144;254;45;48;2;125;255;10m▄\x1b[0m\x1b[38;2;121;254;45;48;2;99;255;10m▄\x1b[0m\x1b[38;2;99;254;45;48;2;72;255;10m▄\x1b[0m\x1b[38;2;76;254;45;48;2;45;255;10m▄\x1b[0m\x1b[38;2;53;254;45;48;2;19;255;10m▄\x1b[0m\x1b[38;2;45;254;61;48;2;10;255;28m▄\x1b[0m\x1b[38;2;45;254;83;48;2;10;255;54m▄\x1b[0m\x1b[38;2;45;254;106;48;2;10;255;81m▄\x1b[0m\x1b[38;2;45;254;129;48;2;10;255;108m▄\x1b[0m\x1b[38;2;45;254;152;48;2;10;255;134m▄\x1b[0m\x1b[38;2;45;254;175;48;2;10;255;161m▄\x1b[0m\x1b[38;2;45;254;197;48;2;10;255;188m▄\x1b[0m\x1b[38;2;45;254;220;48;2;10;255;214m▄\x1b[0m\x1b[38;2;45;254;243;48;2;10;255;241m▄\x1b[0m\x1b[38;2;45;243;254;48;2;10;241;255m▄\x1b[0m\x1b[38;2;45;220;254;48;2;10;214;255m▄\x1b[0m\x1b[38;2;45;197;254;48;2;10;188;255m▄\x1b[0m\x1b[38;2;45;175;254;48;2;10;161;255m▄\x1b[0m\x1b[38;2;45;152;254;48;2;10;134;255m▄\x1b[0m\x1b[38;2;45;129;254;48;2;10;108;255m▄\x1b[0m\x1b[38;2;45;106;254;48;2;10;81;255m▄\x1b[0m\x1b[38;2;45;83;254;48;2;10;54;255m▄\x1b[0m\x1b[38;2;45;61;254;48;2;10;28;255m▄\x1b[0m\x1b[38;2;53;45;254;48;2;19;10;255m▄\x1b[0m\x1b[38;2;76;45;254;48;2;45;10;255m▄\x1b[0m\x1b[38;2;99;45;254;48;2;72;10;255m▄\x1b[0m\x1b[38;2;121;45;254;48;2;99;10;255m▄\x1b[0m\x1b[38;2;144;45;254;48;2;125;10;255m▄\x1b[0m\x1b[38;2;167;45;254;48;2;152;10;255m▄\x1b[0m\x1b[38;2;190;45;254;48;2;179;10;255m▄\x1b[0m\x1b[38;2;213;45;254;48;2;206;10;255m▄\x1b[0m\x1b[38;2;235;45;254;48;2;232;10;255m▄\x1b[0m\x1b[38;2;254;45;251;48;2;255;10;250m▄\x1b[0m\x1b[38;2;254;45;228;48;2;255;10;223m▄\x1b[0m\x1b[38;2;254;45;205;48;2;255;10;197m▄\x1b[0m\x1b[38;2;254;45;182;48;2;255;10;170m▄\x1b[0m\x1b[38;2;254;45;159;48;2;255;10;143m▄\x1b[0m\x1b[38;2;254;45;137;48;2;255;10;117m▄\x1b[0m\x1b[38;2;254;45;114;48;2;255;10;90m▄\x1b[0m\x1b[38;2;254;45;91;48;2;255;10;63m▄\x1b[0m\x1b[38;2;254;45;68;48;2;255;10;36m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;36mAutomatic color conversion\x1b[0m \x1b[38;2;255;117;117;48;2;255;81;81m▄\x1b[0m\x1b[38;2;255;132;117;48;2;255;100;81m▄\x1b[0m\x1b[38;2;255;147;117;48;2;255;119;81m▄\x1b[0m\x1b[38;2;255;162;117;48;2;255;138;81m▄\x1b[0m\x1b[38;2;255;177;117;48;2;255;157;81m▄\x1b[0m\x1b[38;2;255;192;117;48;2;255;176;81m▄\x1b[0m\x1b[38;2;255;207;117;48;2;255;195;81m▄\x1b[0m\x1b[38;2;255;222;117;48;2;255;214;81m▄\x1b[0m\x1b[38;2;255;237;117;48;2;255;232;81m▄\x1b[0m\x1b[38;2;255;252;117;48;2;255;251;81m▄\x1b[0m\x1b[38;2;242;255;117;48;2;239;255;81m▄\x1b[0m\x1b[38;2;227;255;117;48;2;220;255;81m▄\x1b[0m\x1b[38;2;212;255;117;48;2;201;255;81m▄\x1b[0m\x1b[38;2;197;255;117;48;2;182;255;81m▄\x1b[0m\x1b[38;2;182;255;117;48;2;163;255;81m▄\x1b[0m\x1b[38;2;167;255;117;48;2;144;255;81m▄\x1b[0m\x1b[38;2;152;255;117;48;2;125;255;81m▄\x1b[0m\x1b[38;2;137;255;117;48;2;106;255;81m▄\x1b[0m\x1b[38;2;122;255;117;48;2;87;255;81m▄\x1b[0m\x1b[38;2;117;255;127;48;2;81;255;94m▄\x1b[0m\x1b[38;2;117;255;142;48;2;81;255;113m▄\x1b[0m\x1b[38;2;117;255;157;48;2;81;255;132m▄\x1b[0m\x1b[38;2;117;255;172;48;2;81;255;150m▄\x1b[0m\x1b[38;2;117;255;187;48;2;81;255;169m▄\x1b[0m\x1b[38;2;117;255;202;48;2;81;255;188m▄\x1b[0m\x1b[38;2;117;255;217;48;2;81;255;207m▄\x1b[0m\x1b[38;2;117;255;232;48;2;81;255;226m▄\x1b[0m\x1b[38;2;117;255;247;48;2;81;255;245m▄\x1b[0m\x1b[38;2;117;247;255;48;2;81;245;255m▄\x1b[0m\x1b[38;2;117;232;255;48;2;81;226;255m▄\x1b[0m\x1b[38;2;117;217;255;48;2;81;207;255m▄\x1b[0m\x1b[38;2;117;202;255;48;2;81;188;255m▄\x1b[0m\x1b[38;2;117;187;255;48;2;81;169;255m▄\x1b[0m\x1b[38;2;117;172;255;48;2;81;150;255m▄\x1b[0m\x1b[38;2;117;157;255;48;2;81;132;255m▄\x1b[0m\x1b[38;2;117;142;255;48;2;81;113;255m▄\x1b[0m\x1b[38;2;117;127;255;48;2;81;94;255m▄\x1b[0m\x1b[38;2;122;117;255;48;2;87;81;255m▄\x1b[0m\x1b[38;2;137;117;255;48;2;106;81;255m▄\x1b[0m\x1b[38;2;152;117;255;48;2;125;81;255m▄\x1b[0m\x1b[38;2;167;117;255;48;2;144;81;255m▄\x1b[0m\x1b[38;2;182;117;255;48;2;163;81;255m▄\x1b[0m\x1b[38;2;197;117;255;48;2;182;81;255m▄\x1b[0m\x1b[38;2;212;117;255;48;2;201;81;255m▄\x1b[0m\x1b[38;2;227;117;255;48;2;220;81;255m▄\x1b[0m\x1b[38;2;242;117;255;48;2;239;81;255m▄\x1b[0m\x1b[38;2;255;117;252;48;2;255;81;251m▄\x1b[0m\x1b[38;2;255;117;237;48;2;255;81;232m▄\x1b[0m\x1b[38;2;255;117;222;48;2;255;81;214m▄\x1b[0m\x1b[38;2;255;117;207;48;2;255;81;195m▄\x1b[0m\x1b[38;2;255;117;192;48;2;255;81;176m▄\x1b[0m\x1b[38;2;255;117;177;48;2;255;81;157m▄\x1b[0m\x1b[38;2;255;117;162;48;2;255;81;138m▄\x1b[0m\x1b[38;2;255;117;147;48;2;255;81;119m▄\x1b[0m\x1b[38;2;255;117;132;48;2;255;81;100m▄\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Styles \x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and even \n\x1b[1;31m \x1b[0m\x1b[5mblink\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Text \x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mLorem ipsum dolor \x1b[0m \x1b[33m Lorem ipsum dolor \x1b[0m \x1b[34m Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m \x1b[0m\x1b[31mdolor\x1b[0m\x1b[31m \x1b[0m\x1b[31msit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msit amet, \x1b[0m \x1b[33m sit amet, \x1b[0m \x1b[34m sit amet,\x1b[0m \x1b[31mamet,\x1b[0m\x1b[31m \x1b[0m\x1b[31mconsectetur\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mconsectetur \x1b[0m \x1b[33m consectetur \x1b[0m \x1b[34m consectetur\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m \x1b[0m\x1b[31melit.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32madipiscing elit. \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m adipiscing elit.\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m \x1b[0m\x1b[31min\x1b[0m\x1b[31m \x1b[0m\x1b[31mmetus\x1b[0m\x1b[31m \x1b[0m\x1b[31msed\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mQuisque in metus sed\x1b[0m \x1b[33mQuisque in metus sed\x1b[0m \x1b[34mQuisque in metus sed\x1b[0m \x1b[31msapien\x1b[0m\x1b[31m \x1b[0m\x1b[31multricies\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msapien ultricies \x1b[0m \x1b[33m sapien ultricies \x1b[0m \x1b[34m sapien ultricies\x1b[0m \x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m\x1b[31m \x1b[0m\x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mpretium a at justo. \x1b[0m \x1b[33mpretium a at justo. \x1b[0m \x1b[34m pretium a at justo.\x1b[0m \x1b[31mMaecenas\x1b[0m\x1b[31m \x1b[0m\x1b[31mluctus\x1b[0m\x1b[31m \x1b[0m\x1b[31mvelit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mMaecenas luctus \x1b[0m \x1b[33m Maecenas luctus \x1b[0m \x1b[34m Maecenas luctus\x1b[0m \x1b[31met auctor maximus.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mvelit et auctor \x1b[0m \x1b[33m velit et auctor \x1b[0m \x1b[34m velit et auctor\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mmaximus. \x1b[0m \x1b[33m maximus. \x1b[0m \x1b[34m maximus.\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Asian \x1b[0m\x1b[1;31m \x1b[0m🇨🇳 该库支持中文,日文和韩文文本! \n\x1b[1;31m \x1b[0m\x1b[1;31m language \x1b[0m\x1b[1;31m \x1b[0m🇯🇵 ライブラリは中国語、日本語、韓国語のテキストをサポートしています \n\x1b[1;31m \x1b[0m\x1b[1;31m support \x1b[0m\x1b[1;31m \x1b[0m🇰🇷 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markup \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m-like \x1b[1mmarkup\x1b[0m for \x1b[33mcolor\x1b[0m, \x1b[4mstyle\x1b[0m, and emoji! 👍 🍎 🐜 🐻 … \n\x1b[1;31m \x1b[0m🚌 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Tables \x1b[0m\x1b[1;31m \x1b[0m\x1b[1m \x1b[0m\x1b[1;32mDate\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;34mTitle\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;36mProduction Budget\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[1;35mBox Office\x1b[0m\x1b[1m \x1b[0m \n\x1b[1;31m \x1b[0m───────────────────────────────────────────────────────────────────────────────────── \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 20, 2019\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars: The Rise of \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $275,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[35m $375,126,118\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mSkywalker \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 25, 2018\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[1;2;34mSolo\x1b[0m\x1b[2;34m: A Star Wars Story \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $275,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m $393,151,347\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 15, 2017\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars Ep. VIII: The Last \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $262,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[1;35m$1,332,539,889\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mJedi \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 19, 1999\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;34mStar Wars Ep. \x1b[0m\x1b[1;2;34mI\x1b[0m\x1b[2;34m: \x1b[0m\x1b[2;3;34mThe phantom \x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $115,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m$1,027,044,677\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;3;34mMenace\x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Syntax \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m-\x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m>\x1b[0m \x1b[1m{\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31mhighlighting\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m\"\"\"Iterate and generate a tuple w\x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'foo'\x1b[0m: \x1b[1m[\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m & \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1;36m3.1427\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;31m pretty \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m(\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m printing \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_va\x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Paul Atreides'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Vladimir Harkonnen'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Thufir Hawat'\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[1m]\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'atomic'\x1b[0m: \x1b[1m(\x1b[0m\x1b[3;91mFalse\x1b[0m, \x1b[3;92mTrue\x1b[0m, \x1b[3;35mNone\x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[1m}\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markdown \x1b[0m\x1b[1;31m \x1b[0m\x1b[36m# Markdown\x1b[0m ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ \n\x1b[1;31m \x1b[0m ┃ \x1b[1mMarkdown\x1b[0m ┃ \n\x1b[1;31m \x1b[0m\x1b[36mSupports much of the *markdown* \x1b[0m ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ \n\x1b[1;31m \x1b[0m\x1b[36m__syntax__!\x1b[0m \n\x1b[1;31m \x1b[0m Supports much of the \x1b[3mmarkdown\x1b[0m \x1b[1msyntax\x1b[0m! \n\x1b[1;31m \x1b[0m\x1b[36m- Headers\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Basic formatting: **bold**, *italic*, \x1b[0m \x1b[1;33m • \x1b[0mHeaders \n\x1b[1;31m \x1b[0m\x1b[36m`code`\x1b[0m \x1b[1;33m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[1;36;40mcode\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Block quotes\x1b[0m \x1b[1;33m • \x1b[0mBlock quotes \n\x1b[1;31m \x1b[0m\x1b[36m- Lists, and more...\x1b[0m \x1b[1;33m • \x1b[0mLists, and more... \n\x1b[1;31m \x1b[0m\x1b[36m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m +more! \x1b[0m\x1b[1;31m \x1b[0mProgress bars, columns, styled logging handler, tracebacks, etc... \n\x1b[1;31m \x1b[0m \n" +expected = "\x1b[3m Rich features \x1b[0m\n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Colors \x1b[0m\x1b[1;31m \x1b[0m✓ \x1b[1;32m4-bit color\x1b[0m \x1b[38;2;86;0;0;48;2;51;0;0m▄\x1b[0m\x1b[38;2;86;9;0;48;2;51;5;0m▄\x1b[0m\x1b[38;2;86;18;0;48;2;51;11;0m▄\x1b[0m\x1b[38;2;86;28;0;48;2;51;16;0m▄\x1b[0m\x1b[38;2;86;37;0;48;2;51;22;0m▄\x1b[0m\x1b[38;2;86;47;0;48;2;51;27;0m▄\x1b[0m\x1b[38;2;86;56;0;48;2;51;33;0m▄\x1b[0m\x1b[38;2;86;66;0;48;2;51;38;0m▄\x1b[0m\x1b[38;2;86;75;0;48;2;51;44;0m▄\x1b[0m\x1b[38;2;86;85;0;48;2;51;50;0m▄\x1b[0m\x1b[38;2;78;86;0;48;2;46;51;0m▄\x1b[0m\x1b[38;2;69;86;0;48;2;40;51;0m▄\x1b[0m\x1b[38;2;59;86;0;48;2;35;51;0m▄\x1b[0m\x1b[38;2;50;86;0;48;2;29;51;0m▄\x1b[0m\x1b[38;2;40;86;0;48;2;24;51;0m▄\x1b[0m\x1b[38;2;31;86;0;48;2;18;51;0m▄\x1b[0m\x1b[38;2;22;86;0;48;2;12;51;0m▄\x1b[0m\x1b[38;2;12;86;0;48;2;7;51;0m▄\x1b[0m\x1b[38;2;3;86;0;48;2;1;51;0m▄\x1b[0m\x1b[38;2;0;86;6;48;2;0;51;3m▄\x1b[0m\x1b[38;2;0;86;15;48;2;0;51;9m▄\x1b[0m\x1b[38;2;0;86;25;48;2;0;51;14m▄\x1b[0m\x1b[38;2;0;86;34;48;2;0;51;20m▄\x1b[0m\x1b[38;2;0;86;44;48;2;0;51;25m▄\x1b[0m\x1b[38;2;0;86;53;48;2;0;51;31m▄\x1b[0m\x1b[38;2;0;86;63;48;2;0;51;37m▄\x1b[0m\x1b[38;2;0;86;72;48;2;0;51;42m▄\x1b[0m\x1b[38;2;0;86;81;48;2;0;51;48m▄\x1b[0m\x1b[38;2;0;81;86;48;2;0;48;51m▄\x1b[0m\x1b[38;2;0;72;86;48;2;0;42;51m▄\x1b[0m\x1b[38;2;0;63;86;48;2;0;37;51m▄\x1b[0m\x1b[38;2;0;53;86;48;2;0;31;51m▄\x1b[0m\x1b[38;2;0;44;86;48;2;0;25;51m▄\x1b[0m\x1b[38;2;0;34;86;48;2;0;20;51m▄\x1b[0m\x1b[38;2;0;25;86;48;2;0;14;51m▄\x1b[0m\x1b[38;2;0;15;86;48;2;0;9;51m▄\x1b[0m\x1b[38;2;0;6;86;48;2;0;3;51m▄\x1b[0m\x1b[38;2;3;0;86;48;2;1;0;51m▄\x1b[0m\x1b[38;2;12;0;86;48;2;7;0;51m▄\x1b[0m\x1b[38;2;22;0;86;48;2;12;0;51m▄\x1b[0m\x1b[38;2;31;0;86;48;2;18;0;51m▄\x1b[0m\x1b[38;2;40;0;86;48;2;24;0;51m▄\x1b[0m\x1b[38;2;50;0;86;48;2;29;0;51m▄\x1b[0m\x1b[38;2;59;0;86;48;2;35;0;51m▄\x1b[0m\x1b[38;2;69;0;86;48;2;40;0;51m▄\x1b[0m\x1b[38;2;78;0;86;48;2;46;0;51m▄\x1b[0m\x1b[38;2;86;0;85;48;2;51;0;50m▄\x1b[0m\x1b[38;2;86;0;75;48;2;51;0;44m▄\x1b[0m\x1b[38;2;86;0;66;48;2;51;0;38m▄\x1b[0m\x1b[38;2;86;0;56;48;2;51;0;33m▄\x1b[0m\x1b[38;2;86;0;47;48;2;51;0;27m▄\x1b[0m\x1b[38;2;86;0;37;48;2;51;0;22m▄\x1b[0m\x1b[38;2;86;0;28;48;2;51;0;16m▄\x1b[0m\x1b[38;2;86;0;18;48;2;51;0;11m▄\x1b[0m\x1b[38;2;86;0;9;48;2;51;0;5m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;34m8-bit color\x1b[0m \x1b[38;2;158;0;0;48;2;122;0;0m▄\x1b[0m\x1b[38;2;158;17;0;48;2;122;13;0m▄\x1b[0m\x1b[38;2;158;34;0;48;2;122;26;0m▄\x1b[0m\x1b[38;2;158;51;0;48;2;122;40;0m▄\x1b[0m\x1b[38;2;158;68;0;48;2;122;53;0m▄\x1b[0m\x1b[38;2;158;86;0;48;2;122;66;0m▄\x1b[0m\x1b[38;2;158;103;0;48;2;122;80;0m▄\x1b[0m\x1b[38;2;158;120;0;48;2;122;93;0m▄\x1b[0m\x1b[38;2;158;137;0;48;2;122;106;0m▄\x1b[0m\x1b[38;2;158;155;0;48;2;122;120;0m▄\x1b[0m\x1b[38;2;143;158;0;48;2;111;122;0m▄\x1b[0m\x1b[38;2;126;158;0;48;2;97;122;0m▄\x1b[0m\x1b[38;2;109;158;0;48;2;84;122;0m▄\x1b[0m\x1b[38;2;91;158;0;48;2;71;122;0m▄\x1b[0m\x1b[38;2;74;158;0;48;2;57;122;0m▄\x1b[0m\x1b[38;2;57;158;0;48;2;44;122;0m▄\x1b[0m\x1b[38;2;40;158;0;48;2;31;122;0m▄\x1b[0m\x1b[38;2;22;158;0;48;2;17;122;0m▄\x1b[0m\x1b[38;2;5;158;0;48;2;4;122;0m▄\x1b[0m\x1b[38;2;0;158;11;48;2;0;122;8m▄\x1b[0m\x1b[38;2;0;158;28;48;2;0;122;22m▄\x1b[0m\x1b[38;2;0;158;45;48;2;0;122;35m▄\x1b[0m\x1b[38;2;0;158;63;48;2;0;122;48m▄\x1b[0m\x1b[38;2;0;158;80;48;2;0;122;62m▄\x1b[0m\x1b[38;2;0;158;97;48;2;0;122;75m▄\x1b[0m\x1b[38;2;0;158;114;48;2;0;122;89m▄\x1b[0m\x1b[38;2;0;158;132;48;2;0;122;102m▄\x1b[0m\x1b[38;2;0;158;149;48;2;0;122;115m▄\x1b[0m\x1b[38;2;0;149;158;48;2;0;115;122m▄\x1b[0m\x1b[38;2;0;132;158;48;2;0;102;122m▄\x1b[0m\x1b[38;2;0;114;158;48;2;0;89;122m▄\x1b[0m\x1b[38;2;0;97;158;48;2;0;75;122m▄\x1b[0m\x1b[38;2;0;80;158;48;2;0;62;122m▄\x1b[0m\x1b[38;2;0;63;158;48;2;0;48;122m▄\x1b[0m\x1b[38;2;0;45;158;48;2;0;35;122m▄\x1b[0m\x1b[38;2;0;28;158;48;2;0;22;122m▄\x1b[0m\x1b[38;2;0;11;158;48;2;0;8;122m▄\x1b[0m\x1b[38;2;5;0;158;48;2;4;0;122m▄\x1b[0m\x1b[38;2;22;0;158;48;2;17;0;122m▄\x1b[0m\x1b[38;2;40;0;158;48;2;31;0;122m▄\x1b[0m\x1b[38;2;57;0;158;48;2;44;0;122m▄\x1b[0m\x1b[38;2;74;0;158;48;2;57;0;122m▄\x1b[0m\x1b[38;2;91;0;158;48;2;71;0;122m▄\x1b[0m\x1b[38;2;109;0;158;48;2;84;0;122m▄\x1b[0m\x1b[38;2;126;0;158;48;2;97;0;122m▄\x1b[0m\x1b[38;2;143;0;158;48;2;111;0;122m▄\x1b[0m\x1b[38;2;158;0;155;48;2;122;0;120m▄\x1b[0m\x1b[38;2;158;0;137;48;2;122;0;106m▄\x1b[0m\x1b[38;2;158;0;120;48;2;122;0;93m▄\x1b[0m\x1b[38;2;158;0;103;48;2;122;0;80m▄\x1b[0m\x1b[38;2;158;0;86;48;2;122;0;66m▄\x1b[0m\x1b[38;2;158;0;68;48;2;122;0;53m▄\x1b[0m\x1b[38;2;158;0;51;48;2;122;0;40m▄\x1b[0m\x1b[38;2;158;0;34;48;2;122;0;26m▄\x1b[0m\x1b[38;2;158;0;17;48;2;122;0;13m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;35mTruecolor (16.7 million)\x1b[0m \x1b[38;2;229;0;0;48;2;193;0;0m▄\x1b[0m\x1b[38;2;229;25;0;48;2;193;21;0m▄\x1b[0m\x1b[38;2;229;50;0;48;2;193;42;0m▄\x1b[0m\x1b[38;2;229;75;0;48;2;193;63;0m▄\x1b[0m\x1b[38;2;229;100;0;48;2;193;84;0m▄\x1b[0m\x1b[38;2;229;125;0;48;2;193;105;0m▄\x1b[0m\x1b[38;2;229;150;0;48;2;193;126;0m▄\x1b[0m\x1b[38;2;229;175;0;48;2;193;147;0m▄\x1b[0m\x1b[38;2;229;200;0;48;2;193;169;0m▄\x1b[0m\x1b[38;2;229;225;0;48;2;193;190;0m▄\x1b[0m\x1b[38;2;208;229;0;48;2;176;193;0m▄\x1b[0m\x1b[38;2;183;229;0;48;2;155;193;0m▄\x1b[0m\x1b[38;2;158;229;0;48;2;133;193;0m▄\x1b[0m\x1b[38;2;133;229;0;48;2;112;193;0m▄\x1b[0m\x1b[38;2;108;229;0;48;2;91;193;0m▄\x1b[0m\x1b[38;2;83;229;0;48;2;70;193;0m▄\x1b[0m\x1b[38;2;58;229;0;48;2;49;193;0m▄\x1b[0m\x1b[38;2;33;229;0;48;2;28;193;0m▄\x1b[0m\x1b[38;2;8;229;0;48;2;7;193;0m▄\x1b[0m\x1b[38;2;0;229;16;48;2;0;193;14m▄\x1b[0m\x1b[38;2;0;229;41;48;2;0;193;35m▄\x1b[0m\x1b[38;2;0;229;66;48;2;0;193;56m▄\x1b[0m\x1b[38;2;0;229;91;48;2;0;193;77m▄\x1b[0m\x1b[38;2;0;229;116;48;2;0;193;98m▄\x1b[0m\x1b[38;2;0;229;141;48;2;0;193;119m▄\x1b[0m\x1b[38;2;0;229;166;48;2;0;193;140m▄\x1b[0m\x1b[38;2;0;229;191;48;2;0;193;162m▄\x1b[0m\x1b[38;2;0;229;216;48;2;0;193;183m▄\x1b[0m\x1b[38;2;0;216;229;48;2;0;183;193m▄\x1b[0m\x1b[38;2;0;191;229;48;2;0;162;193m▄\x1b[0m\x1b[38;2;0;166;229;48;2;0;140;193m▄\x1b[0m\x1b[38;2;0;141;229;48;2;0;119;193m▄\x1b[0m\x1b[38;2;0;116;229;48;2;0;98;193m▄\x1b[0m\x1b[38;2;0;91;229;48;2;0;77;193m▄\x1b[0m\x1b[38;2;0;66;229;48;2;0;56;193m▄\x1b[0m\x1b[38;2;0;41;229;48;2;0;35;193m▄\x1b[0m\x1b[38;2;0;16;229;48;2;0;14;193m▄\x1b[0m\x1b[38;2;8;0;229;48;2;7;0;193m▄\x1b[0m\x1b[38;2;33;0;229;48;2;28;0;193m▄\x1b[0m\x1b[38;2;58;0;229;48;2;49;0;193m▄\x1b[0m\x1b[38;2;83;0;229;48;2;70;0;193m▄\x1b[0m\x1b[38;2;108;0;229;48;2;91;0;193m▄\x1b[0m\x1b[38;2;133;0;229;48;2;112;0;193m▄\x1b[0m\x1b[38;2;158;0;229;48;2;133;0;193m▄\x1b[0m\x1b[38;2;183;0;229;48;2;155;0;193m▄\x1b[0m\x1b[38;2;208;0;229;48;2;176;0;193m▄\x1b[0m\x1b[38;2;229;0;225;48;2;193;0;190m▄\x1b[0m\x1b[38;2;229;0;200;48;2;193;0;169m▄\x1b[0m\x1b[38;2;229;0;175;48;2;193;0;147m▄\x1b[0m\x1b[38;2;229;0;150;48;2;193;0;126m▄\x1b[0m\x1b[38;2;229;0;125;48;2;193;0;105m▄\x1b[0m\x1b[38;2;229;0;100;48;2;193;0;84m▄\x1b[0m\x1b[38;2;229;0;75;48;2;193;0;63m▄\x1b[0m\x1b[38;2;229;0;50;48;2;193;0;42m▄\x1b[0m\x1b[38;2;229;0;25;48;2;193;0;21m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;33mDumb terminals\x1b[0m \x1b[38;2;254;45;45;48;2;255;10;10m▄\x1b[0m\x1b[38;2;254;68;45;48;2;255;36;10m▄\x1b[0m\x1b[38;2;254;91;45;48;2;255;63;10m▄\x1b[0m\x1b[38;2;254;114;45;48;2;255;90;10m▄\x1b[0m\x1b[38;2;254;137;45;48;2;255;117;10m▄\x1b[0m\x1b[38;2;254;159;45;48;2;255;143;10m▄\x1b[0m\x1b[38;2;254;182;45;48;2;255;170;10m▄\x1b[0m\x1b[38;2;254;205;45;48;2;255;197;10m▄\x1b[0m\x1b[38;2;254;228;45;48;2;255;223;10m▄\x1b[0m\x1b[38;2;254;251;45;48;2;255;250;10m▄\x1b[0m\x1b[38;2;235;254;45;48;2;232;255;10m▄\x1b[0m\x1b[38;2;213;254;45;48;2;206;255;10m▄\x1b[0m\x1b[38;2;190;254;45;48;2;179;255;10m▄\x1b[0m\x1b[38;2;167;254;45;48;2;152;255;10m▄\x1b[0m\x1b[38;2;144;254;45;48;2;125;255;10m▄\x1b[0m\x1b[38;2;121;254;45;48;2;99;255;10m▄\x1b[0m\x1b[38;2;99;254;45;48;2;72;255;10m▄\x1b[0m\x1b[38;2;76;254;45;48;2;45;255;10m▄\x1b[0m\x1b[38;2;53;254;45;48;2;19;255;10m▄\x1b[0m\x1b[38;2;45;254;61;48;2;10;255;28m▄\x1b[0m\x1b[38;2;45;254;83;48;2;10;255;54m▄\x1b[0m\x1b[38;2;45;254;106;48;2;10;255;81m▄\x1b[0m\x1b[38;2;45;254;129;48;2;10;255;108m▄\x1b[0m\x1b[38;2;45;254;152;48;2;10;255;134m▄\x1b[0m\x1b[38;2;45;254;175;48;2;10;255;161m▄\x1b[0m\x1b[38;2;45;254;197;48;2;10;255;188m▄\x1b[0m\x1b[38;2;45;254;220;48;2;10;255;214m▄\x1b[0m\x1b[38;2;45;254;243;48;2;10;255;241m▄\x1b[0m\x1b[38;2;45;243;254;48;2;10;241;255m▄\x1b[0m\x1b[38;2;45;220;254;48;2;10;214;255m▄\x1b[0m\x1b[38;2;45;197;254;48;2;10;188;255m▄\x1b[0m\x1b[38;2;45;175;254;48;2;10;161;255m▄\x1b[0m\x1b[38;2;45;152;254;48;2;10;134;255m▄\x1b[0m\x1b[38;2;45;129;254;48;2;10;108;255m▄\x1b[0m\x1b[38;2;45;106;254;48;2;10;81;255m▄\x1b[0m\x1b[38;2;45;83;254;48;2;10;54;255m▄\x1b[0m\x1b[38;2;45;61;254;48;2;10;28;255m▄\x1b[0m\x1b[38;2;53;45;254;48;2;19;10;255m▄\x1b[0m\x1b[38;2;76;45;254;48;2;45;10;255m▄\x1b[0m\x1b[38;2;99;45;254;48;2;72;10;255m▄\x1b[0m\x1b[38;2;121;45;254;48;2;99;10;255m▄\x1b[0m\x1b[38;2;144;45;254;48;2;125;10;255m▄\x1b[0m\x1b[38;2;167;45;254;48;2;152;10;255m▄\x1b[0m\x1b[38;2;190;45;254;48;2;179;10;255m▄\x1b[0m\x1b[38;2;213;45;254;48;2;206;10;255m▄\x1b[0m\x1b[38;2;235;45;254;48;2;232;10;255m▄\x1b[0m\x1b[38;2;254;45;251;48;2;255;10;250m▄\x1b[0m\x1b[38;2;254;45;228;48;2;255;10;223m▄\x1b[0m\x1b[38;2;254;45;205;48;2;255;10;197m▄\x1b[0m\x1b[38;2;254;45;182;48;2;255;10;170m▄\x1b[0m\x1b[38;2;254;45;159;48;2;255;10;143m▄\x1b[0m\x1b[38;2;254;45;137;48;2;255;10;117m▄\x1b[0m\x1b[38;2;254;45;114;48;2;255;10;90m▄\x1b[0m\x1b[38;2;254;45;91;48;2;255;10;63m▄\x1b[0m\x1b[38;2;254;45;68;48;2;255;10;36m▄\x1b[0m \n\x1b[1;31m \x1b[0m✓ \x1b[1;36mAutomatic color conversion\x1b[0m \x1b[38;2;255;117;117;48;2;255;81;81m▄\x1b[0m\x1b[38;2;255;132;117;48;2;255;100;81m▄\x1b[0m\x1b[38;2;255;147;117;48;2;255;119;81m▄\x1b[0m\x1b[38;2;255;162;117;48;2;255;138;81m▄\x1b[0m\x1b[38;2;255;177;117;48;2;255;157;81m▄\x1b[0m\x1b[38;2;255;192;117;48;2;255;176;81m▄\x1b[0m\x1b[38;2;255;207;117;48;2;255;195;81m▄\x1b[0m\x1b[38;2;255;222;117;48;2;255;214;81m▄\x1b[0m\x1b[38;2;255;237;117;48;2;255;232;81m▄\x1b[0m\x1b[38;2;255;252;117;48;2;255;251;81m▄\x1b[0m\x1b[38;2;242;255;117;48;2;239;255;81m▄\x1b[0m\x1b[38;2;227;255;117;48;2;220;255;81m▄\x1b[0m\x1b[38;2;212;255;117;48;2;201;255;81m▄\x1b[0m\x1b[38;2;197;255;117;48;2;182;255;81m▄\x1b[0m\x1b[38;2;182;255;117;48;2;163;255;81m▄\x1b[0m\x1b[38;2;167;255;117;48;2;144;255;81m▄\x1b[0m\x1b[38;2;152;255;117;48;2;125;255;81m▄\x1b[0m\x1b[38;2;137;255;117;48;2;106;255;81m▄\x1b[0m\x1b[38;2;122;255;117;48;2;87;255;81m▄\x1b[0m\x1b[38;2;117;255;127;48;2;81;255;94m▄\x1b[0m\x1b[38;2;117;255;142;48;2;81;255;113m▄\x1b[0m\x1b[38;2;117;255;157;48;2;81;255;132m▄\x1b[0m\x1b[38;2;117;255;172;48;2;81;255;150m▄\x1b[0m\x1b[38;2;117;255;187;48;2;81;255;169m▄\x1b[0m\x1b[38;2;117;255;202;48;2;81;255;188m▄\x1b[0m\x1b[38;2;117;255;217;48;2;81;255;207m▄\x1b[0m\x1b[38;2;117;255;232;48;2;81;255;226m▄\x1b[0m\x1b[38;2;117;255;247;48;2;81;255;245m▄\x1b[0m\x1b[38;2;117;247;255;48;2;81;245;255m▄\x1b[0m\x1b[38;2;117;232;255;48;2;81;226;255m▄\x1b[0m\x1b[38;2;117;217;255;48;2;81;207;255m▄\x1b[0m\x1b[38;2;117;202;255;48;2;81;188;255m▄\x1b[0m\x1b[38;2;117;187;255;48;2;81;169;255m▄\x1b[0m\x1b[38;2;117;172;255;48;2;81;150;255m▄\x1b[0m\x1b[38;2;117;157;255;48;2;81;132;255m▄\x1b[0m\x1b[38;2;117;142;255;48;2;81;113;255m▄\x1b[0m\x1b[38;2;117;127;255;48;2;81;94;255m▄\x1b[0m\x1b[38;2;122;117;255;48;2;87;81;255m▄\x1b[0m\x1b[38;2;137;117;255;48;2;106;81;255m▄\x1b[0m\x1b[38;2;152;117;255;48;2;125;81;255m▄\x1b[0m\x1b[38;2;167;117;255;48;2;144;81;255m▄\x1b[0m\x1b[38;2;182;117;255;48;2;163;81;255m▄\x1b[0m\x1b[38;2;197;117;255;48;2;182;81;255m▄\x1b[0m\x1b[38;2;212;117;255;48;2;201;81;255m▄\x1b[0m\x1b[38;2;227;117;255;48;2;220;81;255m▄\x1b[0m\x1b[38;2;242;117;255;48;2;239;81;255m▄\x1b[0m\x1b[38;2;255;117;252;48;2;255;81;251m▄\x1b[0m\x1b[38;2;255;117;237;48;2;255;81;232m▄\x1b[0m\x1b[38;2;255;117;222;48;2;255;81;214m▄\x1b[0m\x1b[38;2;255;117;207;48;2;255;81;195m▄\x1b[0m\x1b[38;2;255;117;192;48;2;255;81;176m▄\x1b[0m\x1b[38;2;255;117;177;48;2;255;81;157m▄\x1b[0m\x1b[38;2;255;117;162;48;2;255;81;138m▄\x1b[0m\x1b[38;2;255;117;147;48;2;255;81;119m▄\x1b[0m\x1b[38;2;255;117;132;48;2;255;81;100m▄\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Styles \x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and even \n\x1b[1;31m \x1b[0m\x1b[5mblink\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Text \x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m. \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mLorem ipsum dolor \x1b[0m \x1b[33m Lorem ipsum dolor \x1b[0m \x1b[34m Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m \x1b[0m\x1b[31mdolor\x1b[0m\x1b[31m \x1b[0m\x1b[31msit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msit amet, \x1b[0m \x1b[33m sit amet, \x1b[0m \x1b[34m sit amet,\x1b[0m \x1b[31mamet,\x1b[0m\x1b[31m \x1b[0m\x1b[31mconsectetur\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mconsectetur \x1b[0m \x1b[33m consectetur \x1b[0m \x1b[34m consectetur\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m \x1b[0m\x1b[31melit.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32madipiscing elit. \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m adipiscing elit.\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m \x1b[0m\x1b[31min\x1b[0m\x1b[31m \x1b[0m\x1b[31mmetus\x1b[0m\x1b[31m \x1b[0m\x1b[31msed\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mQuisque in metus sed\x1b[0m \x1b[33mQuisque in metus sed\x1b[0m \x1b[34mQuisque in metus sed\x1b[0m \x1b[31msapien\x1b[0m\x1b[31m \x1b[0m\x1b[31multricies\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32msapien ultricies \x1b[0m \x1b[33m sapien ultricies \x1b[0m \x1b[34m sapien ultricies\x1b[0m \x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m\x1b[31m \x1b[0m\x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mpretium a at justo. \x1b[0m \x1b[33mpretium a at justo. \x1b[0m \x1b[34m pretium a at justo.\x1b[0m \x1b[31mMaecenas\x1b[0m\x1b[31m \x1b[0m\x1b[31mluctus\x1b[0m\x1b[31m \x1b[0m\x1b[31mvelit\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mMaecenas luctus \x1b[0m \x1b[33m Maecenas luctus \x1b[0m \x1b[34m Maecenas luctus\x1b[0m \x1b[31met auctor maximus.\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mvelit et auctor \x1b[0m \x1b[33m velit et auctor \x1b[0m \x1b[34m velit et auctor\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32mmaximus. \x1b[0m \x1b[33m maximus. \x1b[0m \x1b[34m maximus.\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Asian \x1b[0m\x1b[1;31m \x1b[0m🇨🇳 该库支持中文,日文和韩文文本! \n\x1b[1;31m \x1b[0m\x1b[1;31m language \x1b[0m\x1b[1;31m \x1b[0m🇯🇵 ライブラリは中国語、日本語、韓国語のテキストをサポートしています \n\x1b[1;31m \x1b[0m\x1b[1;31m support \x1b[0m\x1b[1;31m \x1b[0m🇰🇷 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markup \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m-like \x1b[1mmarkup\x1b[0m for \x1b[33mcolor\x1b[0m, \x1b[4mstyle\x1b[0m, and emoji! 👍 🍎 🐜 🐻 … \n\x1b[1;31m \x1b[0m🚌 \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Tables \x1b[0m\x1b[1;31m \x1b[0m\x1b[1m \x1b[0m\x1b[1;32mDate\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;34mTitle\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1;36mProduction Budget\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[1;35mBox Office\x1b[0m\x1b[1m \x1b[0m \n\x1b[1;31m \x1b[0m───────────────────────────────────────────────────────────────────────────────────── \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 20, 2019\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars: The Rise of \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $275,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[35m $375,126,118\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mSkywalker \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 25, 2018\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[1;2;34mSolo\x1b[0m\x1b[2;34m: A Star Wars Story \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $275,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m $393,151,347\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m\x1b[32mDec 15, 2017\x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mStar Wars Ep. VIII: The Last \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m\x1b[36m $262,000,000\x1b[0m\x1b[36m \x1b[0m \x1b[35m \x1b[0m\x1b[1;35m$1,332,539,889\x1b[0m\x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[32m \x1b[0m \x1b[34m \x1b[0m\x1b[34mJedi \x1b[0m\x1b[34m \x1b[0m \x1b[36m \x1b[0m \x1b[35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m\x1b[2;32mMay 19, 1999\x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;34mStar Wars Ep. \x1b[0m\x1b[1;2;34mI\x1b[0m\x1b[2;34m: \x1b[0m\x1b[2;3;34mThe phantom \x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m\x1b[2;36m $115,000,000\x1b[0m\x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m\x1b[2;35m$1,027,044,677\x1b[0m\x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[2;32m \x1b[0m \x1b[2;34m \x1b[0m\x1b[2;3;34mMenace\x1b[0m\x1b[2;34m \x1b[0m\x1b[2;34m \x1b[0m \x1b[2;36m \x1b[0m \x1b[2;35m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Syntax \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m-\x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m>\x1b[0m \x1b[1m{\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31mhighlighting\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m\"\"\"Iterate and generate a tuple w\x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'foo'\x1b[0m: \x1b[1m[\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m & \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1;36m3.1427\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;31m pretty \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m(\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m printing \x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_va\x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Paul Atreides'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Vladimir Harkonnen'\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ │ \x1b[0m\x1b[32m'Thufir Hawat'\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ │ \x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[1m]\x1b[0m, \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ │ \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[2;32m│ \x1b[0m\x1b[32m'atomic'\x1b[0m: \x1b[1m(\x1b[0m\x1b[3;91mFalse\x1b[0m, \x1b[3;92mTrue\x1b[0m, \x1b[3;35mNone\x1b[0m\x1b[1m)\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[2;38;2;149;144;119;48;2;39;40;34m│ \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m \x1b[0m \x1b[1m}\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m Markdown \x1b[0m\x1b[1;31m \x1b[0m\x1b[36m# Markdown\x1b[0m \x1b[1;4mMarkdown\x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36mSupports much of the *markdown* \x1b[0m Supports much of the \x1b[3mmarkdown\x1b[0m \x1b[1msyntax\x1b[0m! \n\x1b[1;31m \x1b[0m\x1b[36m__syntax__!\x1b[0m \n\x1b[1;31m \x1b[0m \x1b[1m • \x1b[0mHeaders \n\x1b[1;31m \x1b[0m\x1b[36m- Headers\x1b[0m \x1b[1m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[1;36;40mcode\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Basic formatting: **bold**, *italic*, \x1b[0m \x1b[1m • \x1b[0mBlock quotes \n\x1b[1;31m \x1b[0m\x1b[36m`code`\x1b[0m \x1b[1m • \x1b[0mLists, and more... \n\x1b[1;31m \x1b[0m\x1b[36m- Block quotes\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m- Lists, and more...\x1b[0m \n\x1b[1;31m \x1b[0m\x1b[36m \x1b[0m \n\x1b[1;31m \x1b[0m \n\x1b[1;31m \x1b[0m\x1b[1;31m +more! \x1b[0m\x1b[1;31m \x1b[0mProgress bars, columns, styled logging handler, tracebacks, etc... \n\x1b[1;31m \x1b[0m \n" diff --git a/tests/test_markdown.py b/tests/test_markdown.py index 2ffbdd93d..a76eac9b1 100644 --- a/tests/test_markdown.py +++ b/tests/test_markdown.py @@ -99,7 +99,7 @@ def render(renderable: RenderableType) -> str: def test_markdown_render(): markdown = Markdown(MARKDOWN) rendered_markdown = render(markdown) - expected = "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n┃ \x1b[1mHeading\x1b[0m ┃\n┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n\n \x1b[1;4mSub-heading\x1b[0m \n\n \x1b[1mHeading\x1b[0m \n\n \x1b[1;2mH4 Heading\x1b[0m \n\n \x1b[4mH5 Heading\x1b[0m \n\n \x1b[3mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line produces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[33m────────────────────────────────────────────────────────────────────────────────────────────────────\x1b[0m\nBullet list: \n\n\x1b[1;33m • \x1b[0mapples \n\x1b[1;33m • \x1b[0moranges \n\x1b[1;33m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[1;33m 1 \x1b[0mlather \n\x1b[1;33m 2 \x1b[0mrinse \n\x1b[1;33m 3 \x1b[0mrepeat \n\nAn \x1b]8;id=0;foo\x1b\\\x1b[4;34mexample\x1b[0m\x1b]8;;\x1b\\. \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 \x1b]8;id=0;foo\x1b\\progress\x1b]8;;\x1b\\ \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mimport this\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[1;33m 1 \x1b[0mList item \n\x1b[1;33m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[1;33m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mCode block\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[1;33m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n" + expected = " \x1b[1;4mHeading\x1b[0m \n\n\x1b[4;35mSub-heading\x1b[0m \n\n\x1b[1;35mHeading\x1b[0m \n\n\x1b[3;35mH4 Heading\x1b[0m \n\n\x1b[3mH5 Heading\x1b[0m \n\n\x1b[2mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line produces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[2m----------------------------------------------------------------------------------------------------\x1b[0m\n\nBullet list: \n\n\x1b[1m • \x1b[0mapples \n\x1b[1m • \x1b[0moranges \n\x1b[1m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[36m 1 \x1b[0mlather \n\x1b[36m 2 \x1b[0mrinse \n\x1b[36m 3 \x1b[0mrepeat \n\nAn \x1b]8;id=0;foo\x1b\\\x1b[4;34mexample\x1b[0m\x1b]8;;\x1b\\. \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 \x1b]8;id=0;foo\x1b\\progress\x1b]8;;\x1b\\ \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mimport this\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[36m 1 \x1b[0mList item \n\x1b[36m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[36m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mCode block\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[36m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n" assert rendered_markdown == expected @@ -129,7 +129,7 @@ def test_markdown_table(): """ ) result = render(markdown) - expected = "\n \n \x1b[1m \x1b[0m\x1b[1mYear\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m Title \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mDirector \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mBox Office (USD)\x1b[0m\x1b[1m \x1b[0m \n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n 1982 \x1b[3mE.T. the Extra-Terrestrial\x1b[0m Steven Spielberg $792.9 million \n 1980 Star Wars: Episode V – The Empire Strikes Back Irvin Kershner $538.4 million \n 1983 Star Wars: Episode VI – Return of the Jedi Richard Marquand $475.1 million \n 1981 Raiders of the Lost Ark Steven Spielberg $389.9 million \n 1984 Indiana Jones and the Temple of Doom Steven Spielberg $333.1 million \n \n" + expected = "\n\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\x1b[36mYear\x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[1m \x1b[0m\x1b[36mTitle\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mDirector\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mBox Office (USD)\x1b[0m\x1b[36m \x1b[0m\n\x1b[36m ──────────────────────────────────────────────────────────────────────────────────────── \x1b[0m\n\x1b[36m \x1b[0m1982 \x1b[36m \x1b[0m \x1b[3mE.T. the Extra-Terrestrial\x1b[0m \x1b[36m \x1b[0mSteven Spielberg \x1b[36m \x1b[0m $792.9 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m1980 \x1b[36m \x1b[0mStar Wars: Episode V – The Empire Strikes Back \x1b[36m \x1b[0mIrvin Kershner \x1b[36m \x1b[0m $538.4 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m1983 \x1b[36m \x1b[0m Star Wars: Episode VI – Return of the Jedi \x1b[36m \x1b[0mRichard Marquand \x1b[36m \x1b[0m $475.1 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m1981 \x1b[36m \x1b[0m Raiders of the Lost Ark \x1b[36m \x1b[0mSteven Spielberg \x1b[36m \x1b[0m $389.9 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m1984 \x1b[36m \x1b[0m Indiana Jones and the Temple of Doom \x1b[36m \x1b[0mSteven Spielberg \x1b[36m \x1b[0m $333.1 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\n" assert result == expected @@ -144,7 +144,7 @@ def test_inline_styles_in_table(): """ ) result = render(markdown) - expected = "\n \n \x1b[1m \x1b[0m\x1b[1mYear\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mThis \x1b[0m\x1b[1mcolumn\x1b[0m\x1b[1m displays \x1b[0m\x1b[1;3mthe\x1b[0m\x1b[1m movie \x1b[0m\x1b[1;3mtitle\x1b[0m\x1b[1m \x1b[0m\x1b[1;9mdescription\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mDirector \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mBox Office (USD)\x1b[0m\x1b[1m \x1b[0m \n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n 1982 \x1b[3mE.T. the Extra-Terrestrial\x1b[0m (\x1b]8;id=0;foo\x1b\\\x1b[4;34mWikipedia article\x1b[0m\x1b]8;;\x1b\\) Steven Spielberg $792.9 million \n 1980 Star Wars: Episode V – The \x1b[3mEmpire\x1b[0m \x1b[1mStrikes\x1b[0m \x1b[9mBack\x1b[0m Irvin Kershner $538.4 million \n \n" + expected = "\n\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\x1b[36mYear\x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mThis \x1b[0m\x1b[36mcolumn\x1b[0m\x1b[36m displays \x1b[0m\x1b[3;36mthe\x1b[0m\x1b[36m movie \x1b[0m\x1b[3;36mtitle\x1b[0m\x1b[36m \x1b[0m\x1b[9;36mdescription\x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mDirector\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mBox Office (USD)\x1b[0m\x1b[36m \x1b[0m\n\x1b[36m ────────────────────────────────────────────────────────────────────────────────────────── \x1b[0m\n\x1b[36m \x1b[0m1982 \x1b[36m \x1b[0m \x1b[3mE.T. the Extra-Terrestrial\x1b[0m (\x1b]8;id=0;foo\x1b\\\x1b[4;34mWikipedia article\x1b[0m\x1b]8;;\x1b\\) \x1b[36m \x1b[0mSteven Spielberg \x1b[36m \x1b[0m $792.9 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m1980 \x1b[36m \x1b[0m Star Wars: Episode V – The \x1b[3mEmpire\x1b[0m \x1b[1mStrikes\x1b[0m \x1b[9mBack\x1b[0m \x1b[36m \x1b[0mIrvin Kershner \x1b[36m \x1b[0m $538.4 million\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\n" assert result == expected @@ -162,7 +162,7 @@ def test_inline_styles_with_justification(): | a*b* _c_ ~~d~~ e | a*b* _c_ ~~d~~ e | a*b* _c_ ~~d~~ e |""" ) result = render(markdown) - expected = "\n \n \x1b[1m \x1b[0m\x1b[1mleft \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m center \x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1m right\x1b[0m\x1b[1m \x1b[0m \n ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n This is a long row because it contains a fairly long sentence. \n a\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e a\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e a\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e \n \n" + expected = "\n\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\x1b[36mleft\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[1m \x1b[0m\x1b[36mcenter\x1b[0m\x1b[1m \x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[1m \x1b[0m\x1b[36mright\x1b[0m\x1b[36m \x1b[0m\n\x1b[36m ──────────────────────────────────────────────────────────────── \x1b[0m\n\x1b[36m \x1b[0mThis is a long row \x1b[36m \x1b[0mbecause it contains \x1b[36m \x1b[0ma fairly long sentence.\x1b[36m \x1b[0m\n\x1b[36m \x1b[0ma\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e \x1b[36m \x1b[0m a\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e \x1b[36m \x1b[0m a\x1b[3mb\x1b[0m \x1b[3mc\x1b[0m \x1b[9md\x1b[0m e\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\n" assert result == expected @@ -170,7 +170,7 @@ def test_partial_table(): markdown = Markdown("| Simple | Table |\n| ------ | ----- ") result = render(markdown) print(repr(result)) - expected = "\n \n \x1b[1m \x1b[0m\x1b[1mSimple\x1b[0m\x1b[1m \x1b[0m \x1b[1m \x1b[0m\x1b[1mTable\x1b[0m\x1b[1m \x1b[0m \n ━━━━━━━━━━━━━━━━ \n \n" + expected = "\n\x1b[36m \x1b[0m\n\x1b[36m \x1b[0m\x1b[36mSimple\x1b[0m\x1b[1m \x1b[0m\x1b[36m \x1b[0m\x1b[36mTable\x1b[0m\x1b[36m \x1b[0m\n\x1b[36m ───────────── \x1b[0m\n\x1b[36m \x1b[0m\n" assert result == expected diff --git a/tests/test_markdown_no_hyperlinks.py b/tests/test_markdown_no_hyperlinks.py index 4c5ff66fd..3a1db8790 100644 --- a/tests/test_markdown_no_hyperlinks.py +++ b/tests/test_markdown_no_hyperlinks.py @@ -18,10 +18,10 @@ Paragraphs are separated by a blank line. -Two spaces at the end of a line +Two spaces at the end of a line produces a line break. -Text attributes _italic_, +Text attributes _italic_, **bold**, `monospace`. Horizontal rule: @@ -93,7 +93,7 @@ def test_markdown_render(): markdown = Markdown(MARKDOWN, hyperlinks=False) rendered_markdown = render(markdown) print(repr(rendered_markdown)) - expected = "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n┃ \x1b[1mHeading\x1b[0m ┃\n┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n\n \x1b[1;4mSub-heading\x1b[0m \n\n \x1b[1mHeading\x1b[0m \n\n \x1b[1;2mH4 Heading\x1b[0m \n\n \x1b[4mH5 Heading\x1b[0m \n\n \x1b[3mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line \nproduces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[33m────────────────────────────────────────────────────────────────────────────────────────────────────\x1b[0m\nBullet list: \n\n\x1b[1;33m • \x1b[0mapples \n\x1b[1;33m • \x1b[0moranges \n\x1b[1;33m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[1;33m 1 \x1b[0mlather \n\x1b[1;33m 2 \x1b[0mrinse \n\x1b[1;33m 3 \x1b[0mrepeat \n\nAn \x1b[94mexample\x1b[0m (\x1b[4;34mhttp://example.com\x1b[0m). \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 progress \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n" + expected = " \x1b[1;4mHeading\x1b[0m \n\n\x1b[4;35mSub-heading\x1b[0m \n\n\x1b[1;35mHeading\x1b[0m \n\n\x1b[3;35mH4 Heading\x1b[0m \n\n\x1b[3mH5 Heading\x1b[0m \n\n\x1b[2mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line \nproduces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[2m----------------------------------------------------------------------------------------------------\x1b[0m\n\nBullet list: \n\n\x1b[1m • \x1b[0mapples \n\x1b[1m • \x1b[0moranges \n\x1b[1m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[36m 1 \x1b[0mlather \n\x1b[36m 2 \x1b[0mrinse \n\x1b[36m 3 \x1b[0mrepeat \n\nAn \x1b[94mexample\x1b[0m (\x1b[4;34mhttp://example.com\x1b[0m). \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 progress \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n" assert rendered_markdown == expected From 900052cd5a67d43be8a484703c17599de6f88dea Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 12:04:00 +0000 Subject: [PATCH 076/100] bump --- CHANGELOG.md | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21959fdf4..0cd1275bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [14.3.0] - 2025-01-24 ### Fixed @@ -27,9 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `cells.cell_len` now has a `unicode_version` parameter (that you probably should never change) https://github.com/Textualize/rich/pull/3930 - Live will not write a new line if there was nothing rendered https://github.com/Textualize/rich/pull/3934 -- Changed style of Markdown headers -- Changed style of Markdown tables, added `markdown.table.header` and `markdown.table.border` styles -- Changed style of Markdown rules +- Changed style of Markdown headers https://github.com/Textualize/rich/pull/3942 +- Changed style of Markdown tables, added `markdown.table.header` and `markdown.table.border` styles https://github.com/Textualize/rich/pull/3942 +- Changed style of Markdown rules https://github.com/Textualize/rich/pull/3942 ## [14.2.0] - 2025-10-09 @@ -2177,9 +2177,9 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - First official release, API still to be stabilized -[14.2.0]: https://github.com/textualize/rich/compare/v14.2.0...v14.3.0 -[14.1.0]: https://github.com/textualize/rich/compare/v14.1.0...v14.2.0 -[14.0.0]: https://github.com/textualize/rich/compare/v14.0.0...v14.1.0 +[14.3.0]: https://github.com/textualize/rich/compare/v14.2.0...v14.3.0 +[14.2.0]: https://github.com/textualize/rich/compare/v14.1.0...v14.2.0 +[14.1.0]: https://github.com/textualize/rich/compare/v14.0.0...v14.1.0 [14.0.0]: https://github.com/textualize/rich/compare/v13.9.4...v14.0.0 [13.9.4]: https://github.com/textualize/rich/compare/v13.9.3...v13.9.4 [13.9.3]: https://github.com/textualize/rich/compare/v13.9.2...v13.9.3 diff --git a/pyproject.toml b/pyproject.toml index dcd16d6fb..1cd6a50c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "rich" homepage = "https://github.com/Textualize/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "14.2.0" +version = "14.3.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" From 9303d77e8d41c6f43c090420f921dd3fc66ebfd1 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 12:07:55 +0000 Subject: [PATCH 077/100] markdown test --- tests/test_markdown_no_hyperlinks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_markdown_no_hyperlinks.py b/tests/test_markdown_no_hyperlinks.py index 3a1db8790..8373aa289 100644 --- a/tests/test_markdown_no_hyperlinks.py +++ b/tests/test_markdown_no_hyperlinks.py @@ -93,7 +93,7 @@ def test_markdown_render(): markdown = Markdown(MARKDOWN, hyperlinks=False) rendered_markdown = render(markdown) print(repr(rendered_markdown)) - expected = " \x1b[1;4mHeading\x1b[0m \n\n\x1b[4;35mSub-heading\x1b[0m \n\n\x1b[1;35mHeading\x1b[0m \n\n\x1b[3;35mH4 Heading\x1b[0m \n\n\x1b[3mH5 Heading\x1b[0m \n\n\x1b[2mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line \nproduces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[2m----------------------------------------------------------------------------------------------------\x1b[0m\n\nBullet list: \n\n\x1b[1m • \x1b[0mapples \n\x1b[1m • \x1b[0moranges \n\x1b[1m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[36m 1 \x1b[0mlather \n\x1b[36m 2 \x1b[0mrinse \n\x1b[36m 3 \x1b[0mrepeat \n\nAn \x1b[94mexample\x1b[0m (\x1b[4;34mhttp://example.com\x1b[0m). \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 progress \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n" + expected = " \x1b[1;4mHeading\x1b[0m \n\n\x1b[4;35mSub-heading\x1b[0m \n\n\x1b[1;35mHeading\x1b[0m \n\n\x1b[3;35mH4 Heading\x1b[0m \n\n\x1b[3mH5 Heading\x1b[0m \n\n\x1b[2mH6 Heading\x1b[0m \n\nParagraphs are separated by a blank line. \n\nTwo spaces at the end of a line produces a line break. \n\nText attributes \x1b[3mitalic\x1b[0m, \x1b[1mbold\x1b[0m, \x1b[1;36;40mmonospace\x1b[0m. \n\nHorizontal rule: \n\n\x1b[2m----------------------------------------------------------------------------------------------------\x1b[0m\n\nBullet list: \n\n\x1b[1m • \x1b[0mapples \n\x1b[1m • \x1b[0moranges \n\x1b[1m • \x1b[0mpears \n\nNumbered list: \n\n\x1b[36m 1 \x1b[0mlather \n\x1b[36m 2 \x1b[0mrinse \n\x1b[36m 3 \x1b[0mrepeat \n\nAn \x1b[94mexample\x1b[0m (\x1b[4;34mhttp://example.com\x1b[0m). \n\n\x1b[35m▌ \x1b[0m\x1b[35mMarkdown uses email-style > characters for blockquoting.\x1b[0m\x1b[35m \x1b[0m\n\x1b[35m▌ \x1b[0m\x1b[35mLorem ipsum\x1b[0m\x1b[35m \x1b[0m\n\n🌆 progress \n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34ma=1\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;255;70;137;48;2;39;40;34mimport\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mthis\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n\n\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mfoobar\x1b[0m\x1b[48;2;39;40;34m \x1b[0m\x1b[48;2;39;40;34m \x1b[0m\n\x1b[48;2;39;40;34m \x1b[0m\n" assert rendered_markdown == expected From 97b5beacc3d9c1336d4bc6a3d69fec363bfe5d2c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 12:11:49 +0000 Subject: [PATCH 078/100] typo --- FAQ.md | 2 +- questions/jupyter.question.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index c47acbb87..d5377fb82 100644 --- a/FAQ.md +++ b/FAQ.md @@ -14,7 +14,7 @@ ## Extra space, not enough space, in Jupyter output -There are many different implementations of Jupyter, from different venders. +There are many different implementations of Jupyter, from different vendors. Different notebook software may render Rich's output differently, due to how the CSS is constructed. Adding or removing space, may make the output look good on your software, but break somewhere else. diff --git a/questions/jupyter.question.md b/questions/jupyter.question.md index f5a1fba6e..047726f86 100644 --- a/questions/jupyter.question.md +++ b/questions/jupyter.question.md @@ -5,7 +5,7 @@ alt_titles: - "Not enough space in Jupyter" --- -There are many different implementations of Jupyter, from different venders. +There are many different implementations of Jupyter, from different vendors. Different notebook software may render Rich's output differently, due to how the CSS is constructed. Adding or removing space, may make the output look good on your software, but break somewhere else. From 36fe3f7ca9becca4777861d5e6e625f5a4a37545 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 12:21:18 +0000 Subject: [PATCH 079/100] docstring --- rich/progress.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/progress.py b/rich/progress.py index f55b981e4..c2de125ae 100644 --- a/rich/progress.py +++ b/rich/progress.py @@ -1493,7 +1493,7 @@ def reset( start (bool, optional): Start the task after reset. Defaults to True. total (float, optional): New total steps in task, or None to use current total. Defaults to None. completed (int, optional): Number of steps completed. Defaults to 0. - visible (bool, optional): Enable display of the task. Defaults to True. + visible (bool, optional): Set visible flag if not None. description (str, optional): Change task description if not None. Defaults to None. **fields (str): Additional data fields required for rendering. """ From 73ee8232e7ea72a90130ccf67d8ffefd4122e9f4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 21:33:23 +0000 Subject: [PATCH 080/100] fix fonts --- CHANGELOG.md | 7 +++++++ pyproject.toml | 2 +- rich/cells.py | 2 +- tests/test_cells.py | 6 ++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd1275bf..1472ac84c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [14.3.1] - 2025-01-24 + +### Fixed + +- Fixed characters out of unicode range reporting a cell size if 0 + ## [14.3.0] - 2025-01-24 ### Fixed @@ -2177,6 +2183,7 @@ Major version bump for a breaking change to `Text.stylize signature`, which corr - First official release, API still to be stabilized +[14.3.1]: https://github.com/textualize/rich/compare/v14.3.0...v14.3.1 [14.3.0]: https://github.com/textualize/rich/compare/v14.2.0...v14.3.0 [14.2.0]: https://github.com/textualize/rich/compare/v14.1.0...v14.2.0 [14.1.0]: https://github.com/textualize/rich/compare/v14.0.0...v14.1.0 diff --git a/pyproject.toml b/pyproject.toml index 1cd6a50c3..267fdc91c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "rich" homepage = "https://github.com/Textualize/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "14.3.0" +version = "14.3.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" diff --git a/rich/cells.py b/rich/cells.py index 442979095..15fe7b65c 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -57,7 +57,7 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in codepoint = ord(character) table = load_cell_table(unicode_version).widths if codepoint > table[-1][1]: - return 0 + return 1 lower_bound = 0 upper_bound = len(table) - 1 index = (lower_bound + upper_bound) // 2 diff --git a/tests/test_cells.py b/tests/test_cells.py index 84ff55f88..b0f96978a 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -181,3 +181,9 @@ def test_split_graphemes( assert cell_len(text) == expected_cell_length assert spans == expected_spans assert cell_length == expected_cell_length + + +def test_nerd_font(): + """Regression test for https://github.com/Textualize/rich/issues/3943""" + # Not allocated by unicode, but used by nerd fonts + assert cell_len("\U000f024d") == 1 From 2e5a5dad304b59d75aa4b4ed6cae031693e3615e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 21:34:12 +0000 Subject: [PATCH 081/100] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1472ac84c..6f3029d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed characters out of unicode range reporting a cell size if 0 +- Fixed characters out of unicode range reporting a cell size if 0 https://github.com/Textualize/rich/pull/3944 ## [14.3.0] - 2025-01-24 From 1d402e0c59f8765e420a5a4440eb2fca7465d1ae Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 24 Jan 2026 21:42:08 +0000 Subject: [PATCH 082/100] fix dates --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f3029d4a..c4a823078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [14.3.1] - 2025-01-24 +## [14.3.1] - 2026-01-24 ### Fixed - Fixed characters out of unicode range reporting a cell size if 0 https://github.com/Textualize/rich/pull/3944 -## [14.3.0] - 2025-01-24 +## [14.3.0] - 2026-01-24 ### Fixed From 13f87a4007f629c00b491286034751d53ae9d63c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 1 Feb 2026 15:00:41 +0000 Subject: [PATCH 083/100] Fix ZWJ and edge cases --- CHANGELOG.md | 7 +++++++ pyproject.toml | 2 +- rich/cells.py | 38 ++++++++++++++++++++++++-------------- tests/test_cells.py | 15 +++++++++++++++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4a823078..b63ad7d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [14.3.2] - 2026-02-01 + +### Fixed + +- Fixed solo ZWJ crash +- Fixed control codes reporting width of 1 + ## [14.3.1] - 2026-01-24 ### Fixed diff --git a/pyproject.toml b/pyproject.toml index 267fdc91c..23e86e400 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "rich" homepage = "https://github.com/Textualize/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "14.3.1" +version = "14.3.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" diff --git a/rich/cells.py b/rich/cells.py index 15fe7b65c..d41410cf8 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -55,23 +55,32 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in int: Number of cells (0, 1 or 2) occupied by that character. """ codepoint = ord(character) + if codepoint and codepoint < 32 or 0x07F <= codepoint < 0x0A0: + return 0 table = load_cell_table(unicode_version).widths - if codepoint > table[-1][1]: + + # Fast path: codepoint beyond table range + last_entry = table[-1] + if codepoint > last_entry[1]: return 1 + + # Binary search with fewer tuple unpacks lower_bound = 0 upper_bound = len(table) - 1 - index = (lower_bound + upper_bound) // 2 - while True: - start, end, width = table[index] + + while lower_bound <= upper_bound: + index = (lower_bound + upper_bound) >> 1 # Faster than // 2 + entry = table[index] + start = entry[0] + if codepoint < start: upper_bound = index - 1 - elif codepoint > end: + elif codepoint > entry[1]: # 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 + # Found: codepoint is in range [start, end] + return entry[2] + return 1 @@ -135,19 +144,20 @@ def _cell_len(text: str, unicode_version: str) -> int: SPECIAL = {"\u200d", "\ufe0f"} - iter_characters = iter(text) + index = 0 + character_count = len(text) - for character in iter_characters: + while index < character_count: + character = text[index] if character in SPECIAL: - if character == "\u200d": - next(iter_characters) - elif last_measured_character: + if character == "\ufe0f" and last_measured_character: total_width += last_measured_character in cell_table.narrow_to_wide last_measured_character = None else: if character_width := get_character_cell_size(character, unicode_version): last_measured_character = character total_width += character_width + index += 1 return total_width diff --git a/tests/test_cells.py b/tests/test_cells.py index b0f96978a..7da1d0326 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -187,3 +187,18 @@ def test_nerd_font(): """Regression test for https://github.com/Textualize/rich/issues/3943""" # Not allocated by unicode, but used by nerd fonts assert cell_len("\U000f024d") == 1 + + +def test_zwj(): + """Test special case of zero width joiners""" + assert cell_len("") == 0 + assert cell_len("\u200d") == 0 + assert cell_len("1\u200d") == 1 + assert cell_len("1\u200d2") == 2 + + +def test_non_printable(): + """Non printable characters should report a width of 0.""" + for ordinal in range(31): + character = chr(ordinal) + assert cell_len(character) == 0 From 454fcfc92c66556f9538d420b5bd3ba95b1f57b7 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 1 Feb 2026 15:08:09 +0000 Subject: [PATCH 084/100] stupid comment --- rich/cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/cells.py b/rich/cells.py index d41410cf8..dead61749 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -69,7 +69,7 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in upper_bound = len(table) - 1 while lower_bound <= upper_bound: - index = (lower_bound + upper_bound) >> 1 # Faster than // 2 + index = (lower_bound + upper_bound) >> 1 entry = table[index] start = entry[0] From 31930ddc842d9e1cd224327d5f6c22eff4a87f82 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 1 Feb 2026 15:24:39 +0000 Subject: [PATCH 085/100] fix test --- rich/cells.py | 4 +++- tests/test_cells.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index dead61749..6e5322081 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -150,7 +150,9 @@ def _cell_len(text: str, unicode_version: str) -> int: while index < character_count: character = text[index] if character in SPECIAL: - if character == "\ufe0f" and last_measured_character: + if character == "\u200d": + index += 1 + elif character == "\ufe0f" and last_measured_character: total_width += last_measured_character in cell_table.narrow_to_wide last_measured_character = None else: diff --git a/tests/test_cells.py b/tests/test_cells.py index 7da1d0326..f101740a0 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -194,7 +194,9 @@ def test_zwj(): assert cell_len("") == 0 assert cell_len("\u200d") == 0 assert cell_len("1\u200d") == 1 - assert cell_len("1\u200d2") == 2 + # This sequence should really produce 2, but it aligns with with wcwidth + # What gets written to the terminal is anybody's guess, I've seen multiple variations + assert cell_len("1\u200d2") == 1 def test_non_printable(): From 07edb85f7e09ae76f0a0c9ac4c2059803ce8eb9a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 1 Feb 2026 15:59:59 +0000 Subject: [PATCH 086/100] refine --- rich/cells.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index 6e5322081..0aa09d568 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -59,28 +59,22 @@ def get_character_cell_size(character: str, unicode_version: str = "auto") -> in return 0 table = load_cell_table(unicode_version).widths - # Fast path: codepoint beyond table range last_entry = table[-1] if codepoint > last_entry[1]: return 1 - # Binary search with fewer tuple unpacks lower_bound = 0 upper_bound = len(table) - 1 while lower_bound <= upper_bound: index = (lower_bound + upper_bound) >> 1 - entry = table[index] - start = entry[0] - + start, end, width = table[index] if codepoint < start: upper_bound = index - 1 - elif codepoint > entry[1]: # end + elif codepoint > end: lower_bound = index + 1 else: - # Found: codepoint is in range [start, end] - return entry[2] - + return width return 1 From 54ae0cfbb8d43ccc8f56bf57019b9a22c252eefa Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 1 Feb 2026 16:12:26 +0000 Subject: [PATCH 087/100] simplify --- CHANGELOG.md | 4 ++-- rich/cells.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b63ad7d15..0b093843a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed solo ZWJ crash -- Fixed control codes reporting width of 1 +- Fixed solo ZWJ crash https://github.com/Textualize/rich/pull/3953 +- Fixed control codes reporting width of 1 https://github.com/Textualize/rich/pull/3953 ## [14.3.1] - 2026-01-24 diff --git a/rich/cells.py b/rich/cells.py index 0aa09d568..31165957b 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -146,7 +146,7 @@ def _cell_len(text: str, unicode_version: str) -> int: if character in SPECIAL: if character == "\u200d": index += 1 - elif character == "\ufe0f" and last_measured_character: + elif last_measured_character: total_width += last_measured_character in cell_table.narrow_to_wide last_measured_character = None else: From 1568912d6513eea76213a2640cc174e3606a0df0 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Wed, 11 Feb 2026 21:58:11 +0000 Subject: [PATCH 088/100] Add AI contribution guidelines to AI_POLICY.md --- AI_POLICY.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 AI_POLICY.md diff --git a/AI_POLICY.md b/AI_POLICY.md new file mode 100644 index 000000000..61cf773ad --- /dev/null +++ b/AI_POLICY.md @@ -0,0 +1,7 @@ +This project accepts AI generated Pull Requests, as long as the following guidelines are met. + +- The Pull Request must fill in the repository's pull request template. +- The Pull Request must identify itself as AI generated, including the name of the agent used. +- The Pull Request must link to a issue or discussion where a solution has been approved by a maintainer (@willmcgugan). + +The maintainer reserves the right to close PRs without comment if the above are not met. From 60b064a70a9db813e96955b7b344f61f62817f4c Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 14:02:23 +0000 Subject: [PATCH 089/100] fix for infinite loop in split_graphemes --- CHANGELOG.md | 6 ++++++ rich/cells.py | 2 ++ tests/test_cells.py | 2 ++ 3 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b093843a..6b0a52ad2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- Fixed infinite loop with `cells.split_graphemes` + ## [14.3.2] - 2026-02-01 ### Fixed diff --git a/rich/cells.py b/rich/cells.py index 31165957b..a35065a78 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -207,6 +207,8 @@ def split_graphemes( # zero width characters are associated with the previous character start, _end, cell_length = spans[-1] spans[-1] = (start, index := index + 1, cell_length) + else: + index = index + 1 return (spans, total_width) diff --git a/tests/test_cells.py b/tests/test_cells.py index f101740a0..ce6fb99e7 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -172,6 +172,8 @@ def test_is_single_cell_widths() -> None: ("♻", [(0, 1, 1)], 1), ("♻️", [(0, 2, 2)], 2), ("♻♻️", [(0, 1, 1), (1, 3, 2)], 3), + ("\x1b", [], 0), + ("\x1b\x1b", [], 0), ], ) def test_split_graphemes( From c4db67aa039ac26041e702aa4db053ea56ac9a7f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 15:49:21 +0000 Subject: [PATCH 090/100] test cases --- rich/cells.py | 20 ++++++++++++++------ tests/test_cells.py | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index a35065a78..bf8eaf5e1 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -181,9 +181,14 @@ def split_graphemes( SPECIAL = {"\u200d", "\ufe0f"} while index < codepoint_count: if (character := text[index]) in SPECIAL: + if not spans: + spans.append((index, index := index + 1, 0)) + continue if character == "\u200d": # zero width joiner - index += 2 + index += 1 + if index != codepoint_count: + index += 1 if spans: start, _end, cell_length = spans[-1] spans[-1] = (start, index, cell_length) @@ -203,12 +208,15 @@ def split_graphemes( last_measured_character = character spans.append((index, index := index + 1, character_width)) total_width += character_width - elif spans: - # zero width characters are associated with the previous character - start, _end, cell_length = spans[-1] - spans[-1] = (start, index := index + 1, cell_length) else: - index = index + 1 + # Character has zero width + if spans: + # zero width characters are associated with the previous character + start, _end, cell_length = spans[-1] + spans[-1] = (start, index := index + 1, cell_length) + else: + # A zero width character with no prior spans + spans.append((index, index := index + 1, 0)) return (spans, total_width) diff --git a/tests/test_cells.py b/tests/test_cells.py index ce6fb99e7..609d035fe 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -134,6 +134,18 @@ def test_chop_cells_mixed_width(): assert chop_cells(text, 3) == ["あ1", "り2", "34", "が5", "と6", "う7", "8"] +@pytest.mark.parametrize( + "text,expected", + [ + ("", []), + ("\x1b", []), + ("\x1b\x1b", []), + ], +) +def test_chop_cells_zero_width(text: str, expected: list) -> None: + assert chop_cells(text, 3) == expected + + def test_is_single_cell_widths() -> None: # Check _is_single_cell_widths reports correctly for character in string.printable: @@ -172,14 +184,30 @@ def test_is_single_cell_widths() -> None: ("♻", [(0, 1, 1)], 1), ("♻️", [(0, 2, 2)], 2), ("♻♻️", [(0, 1, 1), (1, 3, 2)], 3), - ("\x1b", [], 0), - ("\x1b\x1b", [], 0), + ("\x1b", [(0, 1, 0)], 0), # One escape sahould have zero width + ("\x1b\x1b", [(0, 2, 0)], 0), # Two escapes should have zero width + ( + "\ufe0f", + [(0, 1, 0)], + 0, + ), # Variation selector 16, without anything to change should have zero width + ( + "\u200d", + [(0, 1, 0)], + 0, + ), # A zero width joiner within noting prior should have zero width + ( + "\u200d\u200d", + [(0, 2, 0)], + 0, + ), # Two ZWJs should have zero width ], ) def test_split_graphemes( text: str, expected_spans: list[CellSpan], expected_cell_length: int ): spans, cell_length = split_graphemes(text) + print(spans) assert cell_len(text) == expected_cell_length assert spans == expected_spans assert cell_length == expected_cell_length From 646aff8e44739869a1eff41c8e56b9fff3f38ef1 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 15:53:14 +0000 Subject: [PATCH 091/100] more defensive condition --- rich/cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/cells.py b/rich/cells.py index bf8eaf5e1..a25fd5101 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -187,7 +187,7 @@ def split_graphemes( if character == "\u200d": # zero width joiner index += 1 - if index != codepoint_count: + if index < codepoint_count: index += 1 if spans: start, _end, cell_length = spans[-1] From 87e7ca27d0f8047e2d22c6ee9f7cf2c59e4c96af Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 16:44:19 +0000 Subject: [PATCH 092/100] refinements, and tests --- rich/cells.py | 31 +++++++++++++++++++++---------- tests/test_cells.py | 8 ++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/rich/cells.py b/rich/cells.py index a25fd5101..fe84f1a82 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -161,14 +161,19 @@ def _cell_len(text: str, unicode_version: str) -> int: def split_graphemes( text: str, unicode_version: str = "auto" ) -> "tuple[list[CellSpan], int]": - """Divide text into spans that define a single grapheme. + """Divide text into spans that define a single grapheme, and additonally return the cell length of the whole string. + + The returned spans will cover every index in the string, with no gaps. It is possible for some graphemes to have a cell length of zero. + This can occur for nonsense strings like two zero width joiners, or for control codes that don't contribute to the grapheme size. Args: text: String to split. unicode_version: Unicode version, `"auto"` to auto detect, `"latest"` for the latest unicode version. Returns: - List of spans. + A tuple of a list of *spans* and the cell length of the entire string. A span is a list of tuples + of three values consisting of (, , ), where START and END are string indices, + and CELL LENGTH is the cell length of the single grapheme. """ cell_table = load_cell_table(unicode_version) @@ -182,26 +187,32 @@ def split_graphemes( while index < codepoint_count: if (character := text[index]) in SPECIAL: if not spans: + # ZWJ or variation selector at the beginning of the string doesn't really make sense. + # But handle it, we must. spans.append((index, index := index + 1, 0)) continue if character == "\u200d": # zero width joiner - index += 1 - if index < codepoint_count: - index += 1 - if spans: - start, _end, cell_length = spans[-1] - spans[-1] = (start, index, cell_length) - elif last_measured_character: + # The condition handles the case where a ZWJ is at the end of the string, and has nothing to join + index += 2 if index < (codepoint_count - 1) else 1 + start, _end, cell_length = spans[-1] + spans[-1] = (start, index, cell_length) + else: # variation selector 16 index += 1 - if spans: + if last_measured_character: start, _end, cell_length = spans[-1] if last_measured_character in cell_table.narrow_to_wide: last_measured_character = None cell_length += 1 total_width += 1 spans[-1] = (start, index, cell_length) + else: + # No previous character to change the size of. + # Shouldn't occur in practice. + # But handle it, we must. + start, _end, cell_length = spans[-1] + spans[-1] = (start, index, cell_length) continue if character_width := get_character_cell_size(character, unicode_version): diff --git a/tests/test_cells.py b/tests/test_cells.py index 609d035fe..5aefda524 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -140,9 +140,12 @@ def test_chop_cells_mixed_width(): ("", []), ("\x1b", []), ("\x1b\x1b", []), + ("\x1b\x1b\x1b", []), + ("\x1b\x1b\x1b\x1b", []), ], ) def test_chop_cells_zero_width(text: str, expected: list) -> None: + """Test zer width characters being chopped.""" assert chop_cells(text, 3) == expected @@ -191,6 +194,11 @@ def test_is_single_cell_widths() -> None: [(0, 1, 0)], 0, ), # Variation selector 16, without anything to change should have zero width + ( + "\ufe0f\ufe0f", + [(0, 2, 0)], + 0, + ), # 2 X variation selector 16, without anything to change should have zero width ( "\u200d", [(0, 1, 0)], From 378c34bd43eb4c9779ce1f7ff5dea376b34c91c5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 16:50:17 +0000 Subject: [PATCH 093/100] Initial plan From b618ccc7e310a92e555d6ec38a7f390b37192ef3 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 16:51:51 +0000 Subject: [PATCH 094/100] spelling --- rich/cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rich/cells.py b/rich/cells.py index fe84f1a82..9d590b04e 100644 --- a/rich/cells.py +++ b/rich/cells.py @@ -161,7 +161,7 @@ def _cell_len(text: str, unicode_version: str) -> int: def split_graphemes( text: str, unicode_version: str = "auto" ) -> "tuple[list[CellSpan], int]": - """Divide text into spans that define a single grapheme, and additonally return the cell length of the whole string. + """Divide text into spans that define a single grapheme, and additionally return the cell length of the whole string. The returned spans will cover every index in the string, with no gaps. It is possible for some graphemes to have a cell length of zero. This can occur for nonsense strings like two zero width joiners, or for control codes that don't contribute to the grapheme size. From f07a3fc5f5f4d5bfc0152cca4b103369934cd8b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 16:53:24 +0000 Subject: [PATCH 095/100] Add regression tests for VS16 after zero-width chars in split_graphemes Co-authored-by: willmcgugan <554369+willmcgugan@users.noreply.github.com> --- tests/test_cells.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_cells.py b/tests/test_cells.py index 5aefda524..c307fa5ac 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -209,6 +209,16 @@ def test_is_single_cell_widths() -> None: [(0, 2, 0)], 0, ), # Two ZWJs should have zero width + ( + "\x1b\ufe0f", + [(0, 2, 0)], + 0, + ), # VS16 after escape (zero-width, doesn't set last_measured_character) should have zero width + ( + "\u200d\ufe0f", + [(0, 2, 0)], + 0, + ), # VS16 after ZWJ (zero-width, doesn't set last_measured_character) should have zero width ], ) def test_split_graphemes( From b031dca1d74f1f82a02d71e771b116ec4f9ad6c8 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 16:55:55 +0000 Subject: [PATCH 096/100] Update tests/test_cells.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cells.py b/tests/test_cells.py index 5aefda524..e7e04fa8d 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -187,7 +187,7 @@ def test_is_single_cell_widths() -> None: ("♻", [(0, 1, 1)], 1), ("♻️", [(0, 2, 2)], 2), ("♻♻️", [(0, 1, 1), (1, 3, 2)], 3), - ("\x1b", [(0, 1, 0)], 0), # One escape sahould have zero width + ("\x1b", [(0, 1, 0)], 0), # One escape should have zero width ("\x1b\x1b", [(0, 2, 0)], 0), # Two escapes should have zero width ( "\ufe0f", From 905b397deb6b5ed59dfd80fa499c90e215f309c8 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 16:56:04 +0000 Subject: [PATCH 097/100] Update tests/test_cells.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/test_cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cells.py b/tests/test_cells.py index e7e04fa8d..39ba346e7 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -144,7 +144,7 @@ def test_chop_cells_mixed_width(): ("\x1b\x1b\x1b\x1b", []), ], ) -def test_chop_cells_zero_width(text: str, expected: list) -> None: +def test_chop_cells_zero_width(text: str, expected: list[str]) -> None: """Test zer width characters being chopped.""" assert chop_cells(text, 3) == expected From 14a47c928241fe5cbf2f1adab0bb61fd1db3472f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 17:11:10 +0000 Subject: [PATCH 098/100] bump --- CHANGELOG.md | 4 ++-- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0a52ad2..bdd4f1597 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## [14.3.3] - 2026-02-19 ### Fixed -- Fixed infinite loop with `cells.split_graphemes` +- Fixed infinite loop with `cells.split_graphemes` https://github.com/Textualize/rich/pull/4006 ## [14.3.2] - 2026-02-01 diff --git a/pyproject.toml b/pyproject.toml index 23e86e400..a98f6585d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "rich" homepage = "https://github.com/Textualize/rich" documentation = "https://rich.readthedocs.io/en/latest/" -version = "14.3.2" +version = "14.3.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" authors = ["Will McGugan "] license = "MIT" From 42899d8a0a96b121a514516f4be9db44ff7aeaf3 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 19 Feb 2026 17:26:13 +0000 Subject: [PATCH 099/100] typo --- tests/test_cells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cells.py b/tests/test_cells.py index 5a8173d5e..0aff1159b 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -203,7 +203,7 @@ def test_is_single_cell_widths() -> None: "\u200d", [(0, 1, 0)], 0, - ), # A zero width joiner within noting prior should have zero width + ), # A zero width joiner with nothing prior should have zero width ( "\u200d\u200d", [(0, 2, 0)], From efe8f619138327dd3e8fe490289d1b0e6da4a0e8 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 26 Feb 2026 09:51:52 +0000 Subject: [PATCH 100/100] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9437e719..6d1dfb776 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,6 +6,8 @@ For new features or if there is any doubt in how to fix a bug, you might want to open an issue prior to starting work, or email willmcgugan+rich@gmail.com to discuss it first. +See also [AI_POLICY.md](https://github.com/Textualize/rich/blob/master/AI_POLICY.md) if you will be using AI. + ## Prerequisites Rich uses [poetry](https://python-poetry.org/docs/) for packaging and