wcwidth 0.8.2__tar.gz → 0.8.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wcwidth-0.8.2 → wcwidth-0.8.4}/.gitignore +4 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/PKG-INFO +36 -483
- wcwidth-0.8.4/bin/update-docs.py +562 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/update-tables.py +887 -174
- wcwidth-0.8.4/code_templates/api_c.rst.j2 +12 -0
- wcwidth-0.8.4/code_templates/c_gcb_class.c.j2 +21 -0
- wcwidth-0.8.4/code_templates/c_table.c.j2 +18 -0
- wcwidth-0.8.4/code_templates/c_term_programs.c.j2 +16 -0
- wcwidth-0.8.4/code_templates/c_terminal_overrides.c.j2 +74 -0
- wcwidth-0.8.4/code_templates/grapheme_table.c.j2 +20 -0
- wcwidth-0.8.4/code_templates/tables.h.j2 +51 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/term_programs.py.j2 +3 -3
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/unicode_version.rst.j2 +3 -0
- wcwidth-0.8.4/code_templates/wcwidth_config.h.j2 +37 -0
- wcwidth-0.8.4/docs/api_c.rst +1043 -0
- wcwidth-0.8.4/docs/developing.rst +71 -0
- wcwidth-0.8.4/docs/history.rst +319 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/index.rst +6 -1
- wcwidth-0.8.4/docs/intro.rst +558 -0
- wcwidth-0.8.4/docs/libwcwidth.rst +487 -0
- wcwidth-0.8.4/docs/related.rst +128 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/specs.rst +8 -5
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/unicode_version.rst +10 -4
- {wcwidth-0.8.2 → wcwidth-0.8.4}/pyproject.toml +1 -4
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_ambiguous.py +16 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_benchmarks.py +64 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip.py +212 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip_overtyping.py +88 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_core.py +83 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_grapheme.py +91 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_justify.py +3 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_sgr_state.py +33 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_term_overrides.py +44 -2
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_text_sizing.py +5 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_textwrap.py +172 -3
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_ucslevel.py +1 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_width.py +43 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tox.ini +51 -10
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/__init__.py +2 -4
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_clip.py +132 -60
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_constants.py +13 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_wcswidth.py +9 -2
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_wcwidth.py +7 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_width.py +8 -4
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/align.py +9 -9
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/escape_sequences.py +19 -5
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/grapheme.py +10 -78
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/hyperlink.py +1 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/sgr_state.py +18 -2
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_ambiguous.py +3 -3
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_grapheme.py +65 -47
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_grapheme_overrides/__init__.py +3 -3
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_50bf0759.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_058c7585.py +73 -2
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_da9ceb0a.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_2148ff29.py +1 -106
- wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_244dc88b.py +82 -0
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c0a2cdbf.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_336a71a1.py +18 -45
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_45d92e98.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_33ac73f2.py +1 -1
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_8589765c.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_3a1895d5.py +181 -284
- wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_59180a0d.py +2669 -0
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_27e0693f.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_65c6beb5.py +73 -2
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c2157f7e.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_78f828e8.py +73 -1
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_e08bd75e.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_8c2ae14d.py +73 -2
- wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_900356bf.py +115 -0
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_5bfac390.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_97904ece.py +2 -2
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_813fee16.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_a5880eeb.py +1 -1
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c3db41c0.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_b6d33cf4.py +18 -45
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_e22030f3.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_c57c295b.py +89 -63
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_529fbb4a.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_cf02297d.py +1 -1
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_fcc05a0f.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_e18ac6a7.py +89 -63
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_4cdf59ce.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_e2b75ee3.py +1 -1
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_970dbe10.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_fb5fd79b.py +128 -15
- wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_fdc99132.py +2642 -0
- wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_registry.py +32 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_mc.py +6 -3
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_overrides.py +298 -172
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_term_programs.py +1 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_vs15.py +1 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_vs16.py +1 -1
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_wide.py +16 -13
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_zero.py +15 -9
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/text_sizing.py +8 -7
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/textwrap.py +17 -9
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/unicode_versions.py +1 -1
- wcwidth-0.8.2/docs/intro.rst +0 -1005
- wcwidth-0.8.2/ucs-detect/data/AbsoluteTelnetSSH.yaml +0 -789
- wcwidth-0.8.2/ucs-detect/data/_linuxfbdev.yaml +0 -50
- wcwidth-0.8.2/ucs-detect/data/_syncterm.yaml +0 -38
- wcwidth-0.8.2/ucs-detect/data/alacritty.yaml +0 -8821
- wcwidth-0.8.2/ucs-detect/data/bobcat.yaml +0 -10804
- wcwidth-0.8.2/ucs-detect/data/conemu.exe.yaml +0 -27608
- wcwidth-0.8.2/ucs-detect/data/contour.yaml +0 -21578
- wcwidth-0.8.2/ucs-detect/data/coolretroterm.yaml +0 -10734
- wcwidth-0.8.2/ucs-detect/data/emoji-test-latest.txt +0 -5518
- wcwidth-0.8.2/ucs-detect/data/emoji-variation-sequences-latest.txt +0 -757
- wcwidth-0.8.2/ucs-detect/data/emoji-zwj-sequences-latest.txt +0 -1675
- wcwidth-0.8.2/ucs-detect/data/extraterm.yaml +0 -33248
- wcwidth-0.8.2/ucs-detect/data/foot.yaml +0 -8258
- wcwidth-0.8.2/ucs-detect/data/ghostty.yaml +0 -1010
- wcwidth-0.8.2/ucs-detect/data/gnometerminal.yaml +0 -16247
- wcwidth-0.8.2/ucs-detect/data/hyper.yaml +0 -12553
- wcwidth-0.8.2/ucs-detect/data/iterm2.yaml +0 -6564
- wcwidth-0.8.2/ucs-detect/data/kitty.yaml +0 -15643
- wcwidth-0.8.2/ucs-detect/data/konsole.yaml +0 -7624
- wcwidth-0.8.2/ucs-detect/data/libvterm.yaml +0 -13536
- wcwidth-0.8.2/ucs-detect/data/lxterminal.yaml +0 -12959
- wcwidth-0.8.2/ucs-detect/data/mintty.yaml +0 -26246
- wcwidth-0.8.2/ucs-detect/data/mlterm.yaml +0 -17478
- wcwidth-0.8.2/ucs-detect/data/putty.yaml +0 -10682
- wcwidth-0.8.2/ucs-detect/data/qterminal.yaml +0 -9153
- wcwidth-0.8.2/ucs-detect/data/rio.yaml +0 -11346
- wcwidth-0.8.2/ucs-detect/data/rxvtunicode.yaml +0 -10736
- wcwidth-0.8.2/ucs-detect/data/screen.yaml +0 -19446
- wcwidth-0.8.2/ucs-detect/data/securecrt.yaml +0 -16450
- wcwidth-0.8.2/ucs-detect/data/st.yaml +0 -10669
- wcwidth-0.8.2/ucs-detect/data/tabby.yaml +0 -13641
- wcwidth-0.8.2/ucs-detect/data/teraterm.yaml +0 -6684
- wcwidth-0.8.2/ucs-detect/data/terminalapp.yaml +0 -10901
- wcwidth-0.8.2/ucs-detect/data/terminalexe.yaml +0 -3078
- wcwidth-0.8.2/ucs-detect/data/terminator.yaml +0 -15308
- wcwidth-0.8.2/ucs-detect/data/terminology.yaml +0 -31854
- wcwidth-0.8.2/ucs-detect/data/tmux.yaml +0 -8371
- wcwidth-0.8.2/ucs-detect/data/vscodeterminal.yaml +0 -11720
- wcwidth-0.8.2/ucs-detect/data/warp.yaml +0 -13297
- wcwidth-0.8.2/ucs-detect/data/westonterminal.yaml +0 -26416
- wcwidth-0.8.2/ucs-detect/data/wezterm.yaml +0 -10571
- wcwidth-0.8.2/ucs-detect/data/xfce4terminal.yaml +0 -13040
- wcwidth-0.8.2/ucs-detect/data/xterm.yaml +0 -10794
- wcwidth-0.8.2/ucs-detect/data/zellij.yaml +0 -13479
- wcwidth-0.8.2/ucs-detect/data/zutty.yaml +0 -10704
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_3d4826b8.py +0 -6462
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_8f94b404.py +0 -2581
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_fd9d4c44.py +0 -3671
- wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_registry.py +0 -32
- {wcwidth-0.8.2 → wcwidth-0.8.4}/.pylintrc +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/LICENSE +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/README.rst +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/show-sequences +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/strip-sequences +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/verify-table-integrity.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/wcwidth-browser.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/wcwidth-libc-comparator.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_override_per_terminal.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_override_table.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_registry.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_table.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/python_table.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/table_overrides.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/unicode_versions.py.j2 +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/api.rst +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/conf.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/requirements.txt +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-develop.txt +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-docs.in +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests38.in +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests38.txt +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests39.in +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests39.txt +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-update.in +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-update.txt +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/__init__.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/conftest.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip_cjk_emoji.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_emojis.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_hyperlink.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/bisearch.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/control_codes.py +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/py.typed +0 -0
- {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/wcwidth.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: wcwidth
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.4
|
|
4
4
|
Summary: Measures the displayed width of unicode strings in a terminal
|
|
5
5
|
Project-URL: Homepage, https://github.com/jquast/wcwidth
|
|
6
6
|
Author-email: Jeff Quast <contact@jeffquast.com>
|
|
@@ -29,14 +29,15 @@ Classifier: Typing :: Typed
|
|
|
29
29
|
Requires-Python: >=3.8
|
|
30
30
|
Description-Content-Type: text/x-rst
|
|
31
31
|
|
|
32
|
-
|
|
33
32
|
|pypi_downloads| |codecov| |license|
|
|
34
33
|
|
|
35
34
|
============
|
|
36
35
|
Introduction
|
|
37
36
|
============
|
|
38
37
|
|
|
39
|
-
This library is mainly for CLI/TUI programs that carefully produce output for Terminals.
|
|
38
|
+
This Python library is mainly for CLI/TUI programs that carefully produce output for Terminals.
|
|
39
|
+
|
|
40
|
+
See page libwcwidth_ about the portable C11 library.
|
|
40
41
|
|
|
41
42
|
Installation
|
|
42
43
|
------------
|
|
@@ -95,16 +96,17 @@ You may find that support *varies* for complex unicode sequences or codepoints.
|
|
|
95
96
|
|
|
96
97
|
This library may be considered to presume the terminal is enabled for DEC Private Mode 2027
|
|
97
98
|
("Grapheme Clustering") by default, which may require to be enabled by a TUI application but
|
|
98
|
-
is often the default mode for those terminals that support it
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
is often the default mode for those terminals that support it.
|
|
100
|
+
|
|
101
|
+
This library does support any specific "legacy width" measurement by API, but it does provide
|
|
102
|
+
Corrections_ for those terminals without grapheme support.
|
|
101
103
|
|
|
102
104
|
See also:
|
|
103
105
|
|
|
104
|
-
- `
|
|
105
|
-
- `
|
|
106
|
+
- `terminal-unicode-core.tex`_ (2021)
|
|
107
|
+
- `Grapheme Clusters and Terminal Emulators`_ (2023)
|
|
106
108
|
- `State of Terminal Emulators in 2025`_
|
|
107
|
-
- `Perfecting Terminal Character Width Using Correction Tables (2026)
|
|
109
|
+
- `Perfecting Terminal Character Width Using Correction Tables`_ (2026)
|
|
108
110
|
|
|
109
111
|
The `jquast/ucs-detect`_ project publishes automatic results of compliance to our standard for Wide
|
|
110
112
|
character, Languages, grapheme clustering, complex or combining scripts, emojis, zero-width joiner,
|
|
@@ -115,12 +117,6 @@ software and version. The results of the ucs-detect project create our correctio
|
|
|
115
117
|
Overview
|
|
116
118
|
========
|
|
117
119
|
|
|
118
|
-
wcwidth()
|
|
119
|
-
---------
|
|
120
|
-
|
|
121
|
-
Use function ``wcwidth()`` to determine the length of a *single unicode
|
|
122
|
-
codepoint*.
|
|
123
|
-
|
|
124
120
|
A brief overview, through examples, for all of the public API functions.
|
|
125
121
|
|
|
126
122
|
Full API Documentation at https://wcwidth.readthedocs.io/en/latest/api.html
|
|
@@ -176,7 +172,7 @@ width()
|
|
|
176
172
|
-------
|
|
177
173
|
|
|
178
174
|
Use function `width()`_ to measure a string with improved handling of ``control_codes`` and
|
|
179
|
-
measurement Corrections_ through ``term_program
|
|
175
|
+
measurement Corrections_ through ``term_program``:
|
|
180
176
|
|
|
181
177
|
.. code-block:: python
|
|
182
178
|
|
|
@@ -358,6 +354,12 @@ Use `clip()`_ to extract a substring by column positions, preserving terminal se
|
|
|
358
354
|
>>> clip('中文字', 1, 5, fillchar='.')
|
|
359
355
|
'.文.'
|
|
360
356
|
|
|
357
|
+
>>> # 'end' defaults to -1, meaning "to the end of the line"
|
|
358
|
+
>>> clip('中文字', 1)
|
|
359
|
+
' 文字'
|
|
360
|
+
>>> clip('\x1b[1;31mHello world\x1b[0m', 6)
|
|
361
|
+
'\x1b[1;31mworld\x1b[0m'
|
|
362
|
+
|
|
361
363
|
>>> # SGR codes are propagated by default - result begins with active style
|
|
362
364
|
>>> # and ends with reset if styles are active
|
|
363
365
|
>>> clip('\x1b[1;31mHello world\x1b[0m', 6, 11)
|
|
@@ -501,18 +503,17 @@ recognized names:
|
|
|
501
503
|
.. code-block:: python
|
|
502
504
|
|
|
503
505
|
>>> wcwidth.list_term_programs()
|
|
504
|
-
('alacritty', 'apple_terminal', 'bobcat', 'contour',
|
|
505
|
-
'
|
|
506
|
-
'
|
|
507
|
-
'
|
|
508
|
-
'
|
|
509
|
-
'xterm.js')
|
|
506
|
+
('absolutetelnet/ssh', 'alacritty', 'apple_terminal', 'bobcat', 'contour',
|
|
507
|
+
'extraterm', 'foot', 'ghostty', 'hyper', 'iterm.app', 'iterm2', 'kitty',
|
|
508
|
+
'konsole', 'mintty', 'mlterm', 'pterm', 'putty', 'rio', 'rxvt',
|
|
509
|
+
'rxvt-unicode-256color', 'st', 'st-256color', 'tabby', 'terminology',
|
|
510
|
+
'urxvt', 'vscode', 'vte', 'warp', 'warpterminal', 'wezterm', 'xterm',
|
|
511
|
+
'xterm-ghostty', 'xterm-kitty', 'xterm.js')
|
|
510
512
|
|
|
511
513
|
.. END_LIST_TERM_PROGRAMS
|
|
512
514
|
|
|
513
515
|
``term_program=False`` (the default for `width()`_, `ljust()`_, `rjust()`_, `center()`_,
|
|
514
|
-
`wrap()`_, and `clip()`_) disables terminal corrections.
|
|
515
|
-
``term_program=True`` for auto-detection.
|
|
516
|
+
`wrap()`_, and `clip()`_) disables terminal corrections.
|
|
516
517
|
|
|
517
518
|
For automatic tests and other purposes that require cross-environment consistency, set static values
|
|
518
519
|
or unset ``TERM`` and ``TERM_PROGRAM`` environment values, such as in ``conftest.py`` with pytest:
|
|
@@ -530,465 +531,21 @@ or unset ``TERM`` and ``TERM_PROGRAM`` environment values, such as in ``conftest
|
|
|
530
531
|
if saved_tprog is not None:
|
|
531
532
|
os.environ['TERM_PROGRAM'] = saved_tprog
|
|
532
533
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
Install wcwidth in editable mode::
|
|
538
|
-
|
|
539
|
-
pip install -e .
|
|
540
|
-
|
|
541
|
-
Execute all code generation, autoformatters, linters and unit tests using tox::
|
|
542
|
-
|
|
543
|
-
tox
|
|
544
|
-
|
|
545
|
-
Or execute individual tasks, see ``tox -lv`` for all available targets::
|
|
546
|
-
|
|
547
|
-
tox -e pylint,py36,py314
|
|
548
|
-
|
|
549
|
-
To run tests with detailed coverage reporting showing missing lines::
|
|
550
|
-
|
|
551
|
-
tox -epy314 -- --cov-report=term-missing
|
|
552
|
-
|
|
553
|
-
Updating Unicode Version
|
|
554
|
-
------------------------
|
|
555
|
-
|
|
556
|
-
Regenerate python code tables from latest Unicode Specification data files::
|
|
557
|
-
|
|
558
|
-
tox -e update
|
|
559
|
-
|
|
560
|
-
The script is located at ``bin/update-tables.py``, requires Python 3.9 or
|
|
561
|
-
later. It is recommended but not necessary to run this script with the newest
|
|
562
|
-
Python, because the newest Python has the latest ``unicodedata`` for generating
|
|
563
|
-
comments.
|
|
564
|
-
|
|
565
|
-
Building Documentation
|
|
566
|
-
----------------------
|
|
567
|
-
|
|
568
|
-
This project is using `sphinx`_ 4.5 to build documentation::
|
|
569
|
-
|
|
570
|
-
tox -e sphinx
|
|
571
|
-
|
|
572
|
-
The output will be in ``docs/_build/html/``.
|
|
573
|
-
|
|
574
|
-
Updating Requirements
|
|
575
|
-
---------------------
|
|
534
|
+
==================
|
|
535
|
+
More documentation
|
|
536
|
+
==================
|
|
576
537
|
|
|
577
|
-
|
|
538
|
+
Developer documentation, for building and contributing to this project, at
|
|
539
|
+
https://wcwidth.readthedocs.io/en/latest/developing.html
|
|
578
540
|
|
|
579
|
-
|
|
541
|
+
Projects using wcwidth, and implementations in other languages, at
|
|
542
|
+
https://wcwidth.readthedocs.io/en/latest/related.html
|
|
580
543
|
|
|
581
|
-
tox -e update_requirements_update
|
|
582
|
-
|
|
583
|
-
To upgrade requirements for testing, run::
|
|
584
|
-
|
|
585
|
-
tox -e update_requirements38,update_requirements39
|
|
586
|
-
|
|
587
|
-
To upgrade requirements for building documentation, run::
|
|
588
|
-
|
|
589
|
-
tox -e update_requirements_docs
|
|
590
|
-
|
|
591
|
-
Utilities
|
|
592
|
-
---------
|
|
593
|
-
|
|
594
|
-
Supplementary tools for browsing and testing terminals for wide unicode
|
|
595
|
-
characters are found in the `bin/`_ of this project's source code. Just ensure
|
|
596
|
-
to first ``pip install -r requirements-develop.txt`` from this projects main
|
|
597
|
-
folder. For example, an interactive browser for testing::
|
|
598
|
-
|
|
599
|
-
python ./bin/wcwidth-browser.py
|
|
600
|
-
|
|
601
|
-
====
|
|
602
|
-
Uses
|
|
603
|
-
====
|
|
604
|
-
|
|
605
|
-
This library is used in:
|
|
606
|
-
|
|
607
|
-
- `jquast/blessed`_: a thin, practical wrapper around terminal capabilities in
|
|
608
|
-
Python.
|
|
609
|
-
|
|
610
|
-
- `jquast/telix`_: A Modern telnet client especially designed for BBSs and MUDs.
|
|
611
|
-
|
|
612
|
-
- `prompt-toolkit/python-prompt-toolkit`_: a Library for building powerful
|
|
613
|
-
interactive command lines in Python.
|
|
614
|
-
|
|
615
|
-
- `urwid/urwid`_: Console user interface library for Python
|
|
616
|
-
|
|
617
|
-
- `prettytable/prettytable`_: Display tabular data in a visually appealing ASCII table format
|
|
618
|
-
|
|
619
|
-
- `leviathan0992/Pylsy`_: Pylsy is a simple python library draw tables in the Terminal. Just two
|
|
620
|
-
lines of code.
|
|
621
|
-
|
|
622
|
-
- `dbcli/pgcli`_: Postgres CLI with autocompletion and syntax highlighting.
|
|
623
|
-
|
|
624
|
-
- `thomasballinger/curtsies`_: a Curses-like terminal wrapper with a display
|
|
625
|
-
based on compositing 2d arrays of text.
|
|
626
|
-
|
|
627
|
-
- `selectel/pyte`_: Simple VTXXX-compatible linux terminal emulator.
|
|
628
|
-
|
|
629
|
-
- `astanin/python-tabulate`_: Pretty-print tabular data in Python, a library
|
|
630
|
-
and a command-line utility.
|
|
631
|
-
|
|
632
|
-
- `rspeer/python-ftfy`_: Fixes mojibake and other glitches in Unicode
|
|
633
|
-
text.
|
|
634
|
-
|
|
635
|
-
- `nbedos/termtosvg`_: Terminal recorder that renders sessions as SVG
|
|
636
|
-
animations.
|
|
637
|
-
|
|
638
|
-
- `peterbrittain/asciimatics`_: A cross platform package to do curses-like operations, plus higher
|
|
639
|
-
level APIs and widgets to create text UIs and ASCII art animations
|
|
640
|
-
|
|
641
|
-
- `python-cmd2/cmd2`_: A tool for building interactive command line apps
|
|
642
|
-
|
|
643
|
-
- `stratis-storage/stratis-cli`_: CLI for the Stratis project
|
|
644
|
-
|
|
645
|
-
- `ihabunek/toot`_: A Mastodon CLI/TUI client
|
|
646
|
-
|
|
647
|
-
- `saulpw/visidata`_: Terminal spreadsheet multitool for discovering and
|
|
648
|
-
arranging data
|
|
649
|
-
|
|
650
|
-
- `jquast/ucs-detect`_: Utility for unicode support detection.
|
|
651
|
-
|
|
652
|
-
===============
|
|
653
|
-
Other Languages
|
|
654
|
-
===============
|
|
655
|
-
|
|
656
|
-
The following libraries provide grapheme and emoji support and closely align with our
|
|
657
|
-
specification_:
|
|
658
|
-
|
|
659
|
-
- `jacobsandlund/uucode`_ Zig
|
|
660
|
-
- `contour-terminal/libunicode`_ C++20
|
|
661
|
-
|
|
662
|
-
There are similar implementations of at least the `wcwidth()`_ and `wcswidth()`_ functions in other
|
|
663
|
-
languages:
|
|
664
|
-
|
|
665
|
-
- `ridiculousfish/widecharwidth`_: Python
|
|
666
|
-
- `termux/wcwidth`_: C
|
|
667
|
-
- `powerman/wcwidth-icons`_: C
|
|
668
|
-
- `timoxley/wcwidth`_: JavaScript
|
|
669
|
-
- `janlelis/unicode-display_width`_: Ruby
|
|
670
|
-
- `alecrabbit/php-wcwidth`_: PHP
|
|
671
|
-
- `Text::CharWidth`_: Perl
|
|
672
|
-
- `bluebear94/Terminal-WCWidth`_: Perl 6
|
|
673
|
-
- `mattn/go-runewidth`_: Go
|
|
674
|
-
- `grepsuzette/wcwidth`_: Haxe
|
|
675
|
-
- `aperezdc/lua-wcwidth`_: Lua
|
|
676
|
-
- `joachimschmidt557/zig-wcwidth`_: Zig
|
|
677
|
-
- `mycoboco/wcwidth.js`_: JavaScript
|
|
678
|
-
- `ainame/swift-displaywidth`_: Swift
|
|
679
|
-
- `pmonks/clj-wcwidth`_: Clojure
|
|
680
|
-
- `fumiyas/wcwidth-cjk`_: `LD_PRELOAD` override
|
|
681
|
-
- `joshuarubin/wcwidth9`_: Unicode version 9 in C
|
|
682
|
-
- `spectreconsole/wcwidth`_: C#
|
|
683
|
-
|
|
684
|
-
=======
|
|
685
|
-
History
|
|
686
|
-
=======
|
|
687
|
-
|
|
688
|
-
0.8.2 *2026-06-29*
|
|
689
|
-
* **Bugfix** Do not raise IndexError when given legacy POSIX ``n`` argument to `wcswidth()`_ or
|
|
690
|
-
`wcstwidth()`_ exceed string length without raising IndexError
|
|
691
|
-
|
|
692
|
-
0.8.1 *2026-06-08*
|
|
693
|
-
* **Improved** `wcstwidth()`_ with new ``zeroer``, ``narrow_wider``, and ``narrow_zeroer``
|
|
694
|
-
Corrections_. `PR #226`_
|
|
695
|
-
|
|
696
|
-
0.8.0 *2026-06-05*
|
|
697
|
-
* **New** support for Variation Selector 15 Emojis as narrow, `Issue #211`_.
|
|
698
|
-
* **New** argument, ``term_program`` for `wcstwidth()`_, `width()`_, `clip()`_, `wrap()`_,
|
|
699
|
-
`ljust()`_, `rjust()`_, and `center()`_. ``False`` disables Corrections_; ``True``
|
|
700
|
-
auto-detects by ``TERM_PROGRAM`` or ``TERM``; string values accept canonical names matching
|
|
701
|
-
`list_term_programs()`_. `wcstwidth()`_ defaults to ``True``; all other functions
|
|
702
|
-
default to ``False``.
|
|
703
|
-
* **Improved** performance on Python 3.15 using standard library iter_graphemes() `PR #206`_.
|
|
704
|
-
* **Improved** memory usage and import time for Python 3.15 using lazy imports `PR #221`_.
|
|
705
|
-
* **Bugfix** Invisible_Stacker viramas now form conjuncts (Burmese, Khmer, etc.) and
|
|
706
|
-
change some Virama width calculations to match `jacobsandlund/uucode`_ (ghostty) `PR #223`_.
|
|
707
|
-
* **Updated** graphemes width maximum now 2, matching Ghostty, foot, and Windows Terminal `PR
|
|
708
|
-
#224`_.
|
|
709
|
-
|
|
710
|
-
0.7.0 *2026-05-02*
|
|
711
|
-
* **New** support for `kitty text sizing protocol`_ (OSC 66) in `width()`_ and `clip()`_.
|
|
712
|
-
* **New** `clip()`_ parameter ``control_codes='parse'``, ``'ignore'``, and ``'strict'``. `clip()`_
|
|
713
|
-
is now able to clip OSC 8 hyperlinks and OSC 66 text sizing sequences.
|
|
714
|
-
* **Improved** `clip()`_ and `width()`_ to support horizontal cursor sequences (``cub``, ``cuf``,
|
|
715
|
-
``hpa``). Cursor-left (``cub``) or backspace (``\b``) now overwrites text. ``column_address``
|
|
716
|
-
(``hpa``) and carriage return (``\r``) are now parsed, and more values conditionally raise
|
|
717
|
-
``ValueError`` when ``control_codes='strict'``.
|
|
718
|
-
|
|
719
|
-
0.6.0 *2026-02-06*
|
|
720
|
-
* **New** Parameters ``expand_tabs``, ``replace_whitespace``, ``fix_sentence_endings``,
|
|
721
|
-
``drop_whitespace``, ``max_lines``, and ``placeholder`` for `wrap()`_, completing stdlib
|
|
722
|
-
`textwrap.wrap()`_ compatibility.
|
|
723
|
-
|
|
724
|
-
0.5.3 *2026-01-30*
|
|
725
|
-
* **Bugfix** Brahmic using Virama conjunct formation. `Issue #155`_, `PR #204`_.
|
|
726
|
-
|
|
727
|
-
0.5.2 *2026-01-29*
|
|
728
|
-
* **Bugfix** Measurement of category ``Mc`` (`Spacing Combining Mark`_), approx. 443, has a more
|
|
729
|
-
nuanced specification_, and may be categorized as either zero or wide. `PR #200`_.
|
|
730
|
-
* **Bugfix** Measurement of "standalone" modifiers and regional indicators, `PR #202`_.
|
|
731
|
-
* **Updated** Data files used in some automatic tests are no longer distributed. `PR #199`_
|
|
732
|
-
|
|
733
|
-
0.5.1 *2026-01-27*
|
|
734
|
-
* **Updated** generated zero and wide code tables to length of 1 to complete the previously
|
|
735
|
-
announced removal of historical wide and zero tables. `PR #196`_.
|
|
736
|
-
|
|
737
|
-
0.5.0 *2026-01-26*
|
|
738
|
-
* **Drop Support** of many historical versions of wide and zero unicode tables. Only the latest
|
|
739
|
-
Unicode version (17.0.0) is now shipped. The related ``unicode_version='auto'`` keyword of the
|
|
740
|
-
`wcwidth()`_ family of functions are ignored. `list_versions()`_ always returns a tuple of only
|
|
741
|
-
a single element of the only unicode version supported. `PR #195`_.
|
|
742
|
-
* **Performance** improvement of most common call without version or ambiguous_width specified by
|
|
743
|
-
20%. `PR #195`_.
|
|
744
|
-
* **New** Function `propagate_sgr()`_ for applying SGR state propagation to a list of lines.
|
|
745
|
-
`PR #194`_.
|
|
746
|
-
* **Improved** `wrap()`_ and `clip()`_ with ``propagate_sgr=True``. `PR #194`_.
|
|
747
|
-
* **Bugfix** `clip()`_ zero-width characters at clipping boundaries. `PR #194`_.
|
|
748
|
-
* **Bugfix** OSC Hyperlinks when broken mid-text by `wrap()`_. `PR #193`_.
|
|
749
|
-
|
|
750
|
-
0.4.0 *2026-01-25*
|
|
751
|
-
* **New** Functions `iter_graphemes_reverse()`_, `grapheme_boundary_before()`_. `PR #192`_.
|
|
752
|
-
* **Bugfix** OSC Hyperlinks should not be broken by `wrap()`_. `PR #191`_.
|
|
753
|
-
|
|
754
|
-
0.3.5 *2026-01-24*
|
|
755
|
-
* **Bugfix** packaging of 0.3.4 contains a failing test.
|
|
756
|
-
|
|
757
|
-
0.3.4 *2026-01-24*
|
|
758
|
-
* **Bugfix** `center()`_ should match the eccentric `parity padding`_.
|
|
759
|
-
of `str.center()`_. `PR #188`_.
|
|
760
|
-
|
|
761
|
-
0.3.3 *2026-01-24*
|
|
762
|
-
* **Performance** improvement in `width()`_. `PR #185`_.
|
|
763
|
-
* **Bugfix** missing ``py.typed``, ``Typing :: Typed``. `PR #184`_.
|
|
764
|
-
|
|
765
|
-
0.3.2 *2026-01-23*
|
|
766
|
-
* **Updated** type hinting for full ``mympy --strict`` compliance. `PR #183`_.
|
|
767
|
-
|
|
768
|
-
0.3.1 *2026-01-22*
|
|
769
|
-
* **Performance** improvement up to 30% in `width()_`. `PR #181`_.
|
|
770
|
-
|
|
771
|
-
0.3.0 *2026-01-21*
|
|
772
|
-
* **Drop Support** for Python 3.6 and 3.7. `PR #156`_.
|
|
773
|
-
* **New** Function `iter_graphemes()`_. `PR #165`_.
|
|
774
|
-
* **New** Functions `width()`_ and `iter_sequences()`_. `PR #166`_.
|
|
775
|
-
* **New** Functions `ljust()`_, `rjust()`_, `center()`_. `PR #168`_.
|
|
776
|
-
* **New** Function `wrap()`_. `PR #169`_.
|
|
777
|
-
* **Performance** improvement in `wcswidth()`_. `PR #171`_.
|
|
778
|
-
* **New** argument ``ambiguous_width`` to all functions. `PR #172`_.
|
|
779
|
-
* **New** Functions `clip()`_ and `strip_sequences()`_. `PR #173`_.
|
|
780
|
-
* **Bugfix** Characters with ``Default_Ignorable_Code_Point`` property now
|
|
781
|
-
return width 0. `PR #174`_.
|
|
782
|
-
* **Bugfix** Characters with ``Prepended_Concatenation_Mark`` property now
|
|
783
|
-
return width 1. `PR #175`_.
|
|
784
|
-
|
|
785
|
-
0.2.14 *2025-09-22*
|
|
786
|
-
* **Drop Support** for Python 2.7 and 3.5. `PR #117`_.
|
|
787
|
-
* **Update** tables to include Unicode Specifications 16.0.0 and 17.0.0.
|
|
788
|
-
`PR #146`_.
|
|
789
|
-
* **Bugfix** U+00AD SOFT HYPHEN should measure as 1, versions 0.2.9 through
|
|
790
|
-
0.2.13 measured as 0. `PR #149`_.
|
|
791
|
-
|
|
792
|
-
0.2.13 *2024-01-06*
|
|
793
|
-
* **Bugfix** zero-width support for Hangul Jamo (Korean)
|
|
794
|
-
|
|
795
|
-
0.2.12 *2023-11-21*
|
|
796
|
-
* **Bugfix** Re-release to remove `.pyi` files misplaced in wheel `Issue #101`_.
|
|
797
|
-
|
|
798
|
-
0.2.11 *2023-11-20*
|
|
799
|
-
* **Updated** Include tests files in the source distribution (`PR #98`_, `PR #100`_).
|
|
800
|
-
|
|
801
|
-
0.2.10 *2023-11-13*
|
|
802
|
-
* **Bugfix** accounting of some kinds of emoji sequences using U+FE0F
|
|
803
|
-
Variation Selector 16 (`PR #97`_).
|
|
804
|
-
* **Updated** specification_.
|
|
805
|
-
|
|
806
|
-
0.2.9 *2023-10-30*
|
|
807
|
-
* **Bugfix** zero-width characters used in Emoji ZWJ sequences, Balinese,
|
|
808
|
-
Jamo, Devanagari, Tamil, Kannada and others (`PR #91`_).
|
|
809
|
-
* **Updated** to include specification_ of character measurements.
|
|
810
|
-
|
|
811
|
-
0.2.8 *2023-09-30*
|
|
812
|
-
* Include requirements files in the source distribution (`PR #82`_).
|
|
813
|
-
|
|
814
|
-
0.2.7 *2023-09-28*
|
|
815
|
-
* **Updated** tables to include Unicode Specification 15.1.0.
|
|
816
|
-
* Include ``bin``, ``docs``, and ``tox.ini`` in the source distribution
|
|
817
|
-
|
|
818
|
-
0.2.6 *2023-01-14*
|
|
819
|
-
* **Updated** tables to include Unicode Specification 14.0.0 and 15.0.0.
|
|
820
|
-
* **Changed** developer tools to use pip-compile, and to use jinja2 templates
|
|
821
|
-
for code generation in `bin/update-tables.py` to prepare for possible
|
|
822
|
-
compiler optimization release.
|
|
823
|
-
|
|
824
|
-
0.2.1 .. 0.2.5 *2020-06-23*
|
|
825
|
-
* **Repository** changes to update tests and packaging issues, and
|
|
826
|
-
begin tagging repository with matching release versions.
|
|
827
|
-
|
|
828
|
-
0.2.0 *2020-06-01*
|
|
829
|
-
* **Enhancement**: Unicode version may be selected by exporting the
|
|
830
|
-
Environment variable ``UNICODE_VERSION``, such as ``13.0``, or ``6.3.0``.
|
|
831
|
-
See the `jquast/ucs-detect`_ CLI utility for automatic detection.
|
|
832
|
-
* **Enhancement**:
|
|
833
|
-
API Documentation is published to readthedocs.io.
|
|
834
|
-
* **Updated** tables for *all* Unicode Specifications with files
|
|
835
|
-
published in a programmatically consumable format, versions 4.1.0
|
|
836
|
-
through 13.0
|
|
837
|
-
|
|
838
|
-
0.1.9 *2020-03-22*
|
|
839
|
-
* **Performance** optimization by `Avram Lubkin`_, `PR #35`_.
|
|
840
|
-
* **Updated** tables to Unicode Specification 13.0.0.
|
|
841
|
-
|
|
842
|
-
0.1.8 *2020-01-01*
|
|
843
|
-
* **Updated** tables to Unicode Specification 12.0.0. (`PR #30`_).
|
|
844
|
-
|
|
845
|
-
0.1.7 *2016-07-01*
|
|
846
|
-
* **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).
|
|
847
|
-
|
|
848
|
-
0.1.6 *2016-01-08 Production/Stable*
|
|
849
|
-
* ``LICENSE`` file now included with distribution.
|
|
850
|
-
|
|
851
|
-
0.1.5 *2015-09-13 Alpha*
|
|
852
|
-
* **Bugfix**:
|
|
853
|
-
Resolution of "combining_ character width" issue, most especially
|
|
854
|
-
those that previously returned -1 now often (correctly) return 0.
|
|
855
|
-
resolved by `Philip Craig`_ via `PR #11`_.
|
|
856
|
-
* **Deprecated**:
|
|
857
|
-
The module path ``wcwidth.table_comb`` is no longer available,
|
|
858
|
-
it has been superseded by module path ``wcwidth.table_zero``.
|
|
859
|
-
|
|
860
|
-
0.1.4 *2014-11-20 Pre-Alpha*
|
|
861
|
-
* **Feature**: ``wcswidth()`` now determines printable length
|
|
862
|
-
for (most) combining_ characters. The developer's tool
|
|
863
|
-
`bin/wcwidth-browser.py`_ is improved to display combining_
|
|
864
|
-
characters when provided the ``--combining`` option
|
|
865
|
-
(`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).
|
|
866
|
-
* **Feature**: added static analysis (prospector_) to testing
|
|
867
|
-
framework.
|
|
868
|
-
|
|
869
|
-
0.1.3 *2014-10-29 Pre-Alpha*
|
|
870
|
-
* **Bugfix**: 2nd parameter of wcswidth was not honored.
|
|
871
|
-
(`Thomas Ballinger`_, `PR #4`_).
|
|
872
|
-
|
|
873
|
-
0.1.2 *2014-10-28 Pre-Alpha*
|
|
874
|
-
* **Updated** tables to Unicode Specification 7.0.0.
|
|
875
|
-
(`Thomas Ballinger`_, `PR #3`_).
|
|
876
|
-
|
|
877
|
-
0.1.1 *2014-05-14 Pre-Alpha*
|
|
878
|
-
* Initial release to pypi, Based on Unicode Specification 6.3.0
|
|
879
|
-
|
|
880
|
-
This code was originally derived directly from C code of the same name,
|
|
881
|
-
whose latest version is available at
|
|
882
|
-
https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::
|
|
883
|
-
|
|
884
|
-
* Markus Kuhn -- 2007-05-26 (Unicode 5.0)
|
|
885
|
-
*
|
|
886
|
-
* Permission to use, copy, modify, and distribute this software
|
|
887
|
-
* for any purpose and without fee is hereby granted. The author
|
|
888
|
-
* disclaims all warranties with regard to this software.
|
|
889
|
-
|
|
890
|
-
.. _`Spacing Combining Mark`: https://www.unicode.org/versions/latest/ch04.pdf#G134153
|
|
891
544
|
.. _`specification`: https://wcwidth.readthedocs.io/en/latest/specs.html
|
|
892
|
-
.. _`tox`: https://tox.wiki/en/latest/
|
|
893
|
-
.. _`prospector`: https://github.com/landscapeio/prospector
|
|
894
|
-
.. _`combining`: https://en.wikipedia.org/wiki/Combining_character
|
|
895
|
-
.. _`bin/`: https://github.com/jquast/wcwidth/tree/master/bin
|
|
896
|
-
.. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/blob/master/bin/wcwidth-browser.py
|
|
897
|
-
.. _`Thomas Ballinger`: https://github.com/thomasballinger
|
|
898
|
-
.. _`Leta Montopoli`: https://github.com/lmontopo
|
|
899
|
-
.. _`Philip Craig`: https://github.com/philipc
|
|
900
|
-
.. _`PR #3`: https://github.com/jquast/wcwidth/pull/3
|
|
901
|
-
.. _`PR #4`: https://github.com/jquast/wcwidth/pull/4
|
|
902
|
-
.. _`PR #5`: https://github.com/jquast/wcwidth/pull/5
|
|
903
|
-
.. _`PR #11`: https://github.com/jquast/wcwidth/pull/11
|
|
904
|
-
.. _`PR #18`: https://github.com/jquast/wcwidth/pull/18
|
|
905
|
-
.. _`PR #30`: https://github.com/jquast/wcwidth/pull/30
|
|
906
|
-
.. _`PR #35`: https://github.com/jquast/wcwidth/pull/35
|
|
907
|
-
.. _`PR #82`: https://github.com/jquast/wcwidth/pull/82
|
|
908
|
-
.. _`PR #91`: https://github.com/jquast/wcwidth/pull/91
|
|
909
|
-
.. _`PR #97`: https://github.com/jquast/wcwidth/pull/97
|
|
910
|
-
.. _`PR #98`: https://github.com/jquast/wcwidth/pull/98
|
|
911
|
-
.. _`PR #100`: https://github.com/jquast/wcwidth/pull/100
|
|
912
|
-
.. _`PR #117`: https://github.com/jquast/wcwidth/pull/117
|
|
913
|
-
.. _`PR #146`: https://github.com/jquast/wcwidth/pull/146
|
|
914
|
-
.. _`PR #149`: https://github.com/jquast/wcwidth/pull/149
|
|
915
|
-
.. _`PR #156`: https://github.com/jquast/wcwidth/pull/156
|
|
916
|
-
.. _`PR #165`: https://github.com/jquast/wcwidth/pull/165
|
|
917
|
-
.. _`PR #166`: https://github.com/jquast/wcwidth/pull/166
|
|
918
|
-
.. _`PR #168`: https://github.com/jquast/wcwidth/pull/168
|
|
919
|
-
.. _`PR #169`: https://github.com/jquast/wcwidth/pull/169
|
|
920
|
-
.. _`PR #171`: https://github.com/jquast/wcwidth/pull/171
|
|
921
|
-
.. _`PR #172`: https://github.com/jquast/wcwidth/pull/172
|
|
922
|
-
.. _`PR #173`: https://github.com/jquast/wcwidth/pull/173
|
|
923
|
-
.. _`PR #174`: https://github.com/jquast/wcwidth/pull/174
|
|
924
|
-
.. _`PR #175`: https://github.com/jquast/wcwidth/pull/175
|
|
925
|
-
.. _`PR #181`: https://github.com/jquast/wcwidth/pull/181
|
|
926
|
-
.. _`PR #183`: https://github.com/jquast/wcwidth/pull/183
|
|
927
|
-
.. _`PR #184`: https://github.com/jquast/wcwidth/pull/184
|
|
928
|
-
.. _`PR #185`: https://github.com/jquast/wcwidth/pull/185
|
|
929
|
-
.. _`PR #188`: https://github.com/jquast/wcwidth/pull/188
|
|
930
|
-
.. _`PR #191`: https://github.com/jquast/wcwidth/pull/191
|
|
931
|
-
.. _`PR #192`: https://github.com/jquast/wcwidth/pull/192
|
|
932
|
-
.. _`PR #193`: https://github.com/jquast/wcwidth/pull/193
|
|
933
|
-
.. _`PR #194`: https://github.com/jquast/wcwidth/pull/194
|
|
934
|
-
.. _`PR #195`: https://github.com/jquast/wcwidth/pull/195
|
|
935
|
-
.. _`PR #196`: https://github.com/jquast/wcwidth/pull/196
|
|
936
|
-
.. _`PR #199`: https://github.com/jquast/wcwidth/pull/199
|
|
937
|
-
.. _`PR #200`: https://github.com/jquast/wcwidth/pull/200
|
|
938
|
-
.. _`PR #202`: https://github.com/jquast/wcwidth/pull/202
|
|
939
|
-
.. _`PR #204`: https://github.com/jquast/wcwidth/pull/204
|
|
940
|
-
.. _`PR #206`: https://github.com/jquast/wcwidth/pull/206
|
|
941
|
-
.. _`PR #221`: https://github.com/jquast/wcwidth/pull/221
|
|
942
|
-
.. _`PR #223`: https://github.com/jquast/wcwidth/pull/223
|
|
943
|
-
.. _`PR #224`: https://github.com/jquast/wcwidth/pull/224
|
|
944
|
-
.. _`PR #226`: https://github.com/jquast/wcwidth/pull/226
|
|
945
|
-
.. _`Issue #101`: https://github.com/jquast/wcwidth/issues/101
|
|
946
|
-
.. _`Issue #155`: https://github.com/jquast/wcwidth/issues/155
|
|
947
|
-
.. _`Issue #190`: https://github.com/jquast/wcwidth/issues/190
|
|
948
|
-
.. _`Issue #211`: https://github.com/jquast/wcwidth/issues/211
|
|
949
545
|
.. _`jquast/blessed`: https://github.com/jquast/blessed
|
|
950
|
-
.. _`jquast/telix`: https://github.com/jquast/telix
|
|
951
|
-
.. _`selectel/pyte`: https://github.com/selectel/pyte
|
|
952
|
-
.. _`thomasballinger/curtsies`: https://github.com/thomasballinger/curtsies
|
|
953
|
-
.. _`dbcli/pgcli`: https://github.com/dbcli/pgcli
|
|
954
|
-
.. _`prompt-toolkit/python-prompt-toolkit`: https://github.com/prompt-toolkit/python-prompt-toolkit
|
|
955
|
-
.. _`timoxley/wcwidth`: https://github.com/timoxley/wcwidth
|
|
956
546
|
.. _`wcwidth(3)`: https://man7.org/linux/man-pages/man3/wcwidth.3.html
|
|
957
547
|
.. _`wcswidth(3)`: https://man7.org/linux/man-pages/man3/wcswidth.3.html
|
|
958
|
-
.. _`astanin/python-tabulate`: https://github.com/astanin/python-tabulate
|
|
959
|
-
.. _`janlelis/unicode-display_width`: https://github.com/janlelis/unicode-display_width
|
|
960
|
-
.. _`rspeer/python-ftfy`: https://github.com/rspeer/python-ftfy
|
|
961
|
-
.. _`alecrabbit/php-wcwidth`: https://github.com/alecrabbit/php-wcwidth
|
|
962
|
-
.. _`Text::CharWidth`: https://metacpan.org/pod/Text::CharWidth
|
|
963
|
-
.. _`bluebear94/Terminal-WCWidth`: https://github.com/bluebear94/Terminal-WCWidth
|
|
964
|
-
.. _`mattn/go-runewidth`: https://github.com/mattn/go-runewidth
|
|
965
|
-
.. _`grepsuzette/wcwidth`: https://github.com/grepsuzette/wcwidth
|
|
966
548
|
.. _`jquast/ucs-detect`: https://github.com/jquast/ucs-detect
|
|
967
|
-
.. _`Avram Lubkin`: https://github.com/avylove
|
|
968
|
-
.. _`nbedos/termtosvg`: https://github.com/nbedos/termtosvg
|
|
969
|
-
.. _`peterbrittain/asciimatics`: https://github.com/peterbrittain/asciimatics
|
|
970
|
-
.. _`aperezdc/lua-wcwidth`: https://github.com/aperezdc/lua-wcwidth
|
|
971
|
-
.. _`joachimschmidt557/zig-wcwidth`: https://github.com/joachimschmidt557/zig-wcwidth
|
|
972
|
-
.. _`fumiyas/wcwidth-cjk`: https://github.com/fumiyas/wcwidth-cjk
|
|
973
|
-
.. _`joshuarubin/wcwidth9`: https://github.com/joshuarubin/wcwidth9
|
|
974
|
-
.. _`spectreconsole/wcwidth`: https://github.com/spectreconsole/wcwidth
|
|
975
|
-
.. _`contour-terminal/libunicode`: https://github.com/contour-terminal/libunicode
|
|
976
|
-
.. _`jacobsandlund/uucode`: https://github.com/jacobsandlund/uucode
|
|
977
|
-
.. _`ridiculousfish/widecharwidth`: https://github.com/ridiculousfish/widecharwidth
|
|
978
|
-
.. _`termux/wcwidth`: https://github.com/termux/wcwidth
|
|
979
|
-
.. _`powerman/wcwidth-icons`: https://github.com/powerman/wcwidth-icons
|
|
980
|
-
.. _`mycoboco/wcwidth.js`: https://github.com/mycoboco/wcwidth.js
|
|
981
|
-
.. _`ainame/swift-displaywidth`: https://github.com/ainame/swift-displaywidth
|
|
982
|
-
.. _`pmonks/clj-wcwidth`: https://github.com/pmonks/clj-wcwidth
|
|
983
|
-
.. _`python-cmd2/cmd2`: https://github.com/python-cmd2/cmd2
|
|
984
|
-
.. _`stratis-storage/stratis-cli`: https://github.com/stratis-storage/stratis-cli
|
|
985
|
-
.. _`ihabunek/toot`: https://github.com/ihabunek/toot
|
|
986
|
-
.. _`saulpw/visidata`: https://github.com/saulpw/visidata
|
|
987
|
-
.. _`urwid/urwid`: https://github.com/urwid/urwid
|
|
988
|
-
.. _`prettytable/prettytable`: https://github.com/prettytable/prettytable
|
|
989
|
-
.. _`leviathan0992/Pylsy`: https://github.com/leviathan0992/Pylsy
|
|
990
|
-
.. _`pip-tools`: https://pip-tools.readthedocs.io/
|
|
991
|
-
.. _`sphinx`: https://www.sphinx-doc.org/
|
|
992
549
|
.. _`textwrap.wrap()`: https://docs.python.org/3/library/textwrap.html#textwrap.wrap
|
|
993
550
|
.. _`str.ljust()`: https://docs.python.org/3/library/stdtypes.html#str.ljust
|
|
994
551
|
.. _`str.rjust()`: https://docs.python.org/3/library/stdtypes.html#str.rjust
|
|
@@ -1008,23 +565,18 @@ https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::
|
|
|
1008
565
|
.. _`wrap()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.wrap
|
|
1009
566
|
.. _`clip()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.clip
|
|
1010
567
|
.. _`strip_sequences()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.strip_sequences
|
|
1011
|
-
.. _`propagate_sgr()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.propagate_sgr
|
|
1012
|
-
.. _`TextSizing`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.TextSizing
|
|
1013
|
-
.. _`TextSizingParams`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.TextSizingParams
|
|
1014
568
|
.. _`iter_sequences()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.iter_sequences
|
|
1015
|
-
.. _`list_versions()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.list_versions
|
|
1016
569
|
.. _`list_term_programs()`: https://wcwidth.readthedocs.io/en/latest/api.html#wcwidth.list_term_programs
|
|
1017
570
|
.. _`Unicode Standard Annex #29`: https://www.unicode.org/reports/tr29/
|
|
1018
571
|
.. _`Terminal.detect_ambiguous_width()`: https://blessed.readthedocs.io/en/latest/api/terminal.html#blessed.terminal.Terminal.detect_ambiguous_width
|
|
1019
|
-
.. _`parity padding`: https://jazcap53.github.io/pythons-eccentric-strcenter.html
|
|
1020
|
-
.. _`kitty text sizing protocol`: https://sw.kovidgoyal.net/kitty/text-sizing-protocol/
|
|
1021
572
|
.. _`Grapheme Clusters and Terminal Emulators`: https://mitchellh.com/writing/grapheme-clusters-in-terminals
|
|
1022
573
|
.. _`terminal-unicode-core.tex`: https://github.com/contour-terminal/terminal-unicode-core/blob/master/spec/terminal-unicode-core.tex
|
|
1023
574
|
.. _`State of Terminal Emulators in 2025`: https://www.jeffquast.com/post/state-of-terminal-emulation-2025/
|
|
1024
|
-
.. _`Perfecting Terminal Character Width Using Correction Tables
|
|
575
|
+
.. _`Perfecting Terminal Character Width Using Correction Tables`: https://www.jeffquast.com/post/perfecting-terminal-character-width-using-correction-tables/
|
|
1025
576
|
.. _XTVERSION: https://vtdn.dev/docs/dcs/xtversion/
|
|
1026
577
|
.. _ENQ: https://documentation.help/PuTTY/config-answerback.html
|
|
1027
578
|
.. _detectable: https://ucs-detect.readthedocs.io/results.html#terminal-identification
|
|
579
|
+
.. _libwcwidth: https://wcwidth.readthedocs.io/en/latest/libwcwidth.html
|
|
1028
580
|
.. |pypi_downloads| image:: https://img.shields.io/pypi/dm/wcwidth.svg?logo=pypi
|
|
1029
581
|
:alt: Downloads
|
|
1030
582
|
:target: https://pypi.org/project/wcwidth/
|
|
@@ -1034,3 +586,4 @@ https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::
|
|
|
1034
586
|
.. |license| image:: https://img.shields.io/pypi/l/wcwidth.svg
|
|
1035
587
|
:target: https://pypi.org/project/wcwidth/
|
|
1036
588
|
:alt: MIT License
|
|
589
|
+
|