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.
Files changed (168) hide show
  1. {wcwidth-0.8.2 → wcwidth-0.8.4}/.gitignore +4 -0
  2. {wcwidth-0.8.2 → wcwidth-0.8.4}/PKG-INFO +36 -483
  3. wcwidth-0.8.4/bin/update-docs.py +562 -0
  4. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/update-tables.py +887 -174
  5. wcwidth-0.8.4/code_templates/api_c.rst.j2 +12 -0
  6. wcwidth-0.8.4/code_templates/c_gcb_class.c.j2 +21 -0
  7. wcwidth-0.8.4/code_templates/c_table.c.j2 +18 -0
  8. wcwidth-0.8.4/code_templates/c_term_programs.c.j2 +16 -0
  9. wcwidth-0.8.4/code_templates/c_terminal_overrides.c.j2 +74 -0
  10. wcwidth-0.8.4/code_templates/grapheme_table.c.j2 +20 -0
  11. wcwidth-0.8.4/code_templates/tables.h.j2 +51 -0
  12. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/term_programs.py.j2 +3 -3
  13. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/unicode_version.rst.j2 +3 -0
  14. wcwidth-0.8.4/code_templates/wcwidth_config.h.j2 +37 -0
  15. wcwidth-0.8.4/docs/api_c.rst +1043 -0
  16. wcwidth-0.8.4/docs/developing.rst +71 -0
  17. wcwidth-0.8.4/docs/history.rst +319 -0
  18. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/index.rst +6 -1
  19. wcwidth-0.8.4/docs/intro.rst +558 -0
  20. wcwidth-0.8.4/docs/libwcwidth.rst +487 -0
  21. wcwidth-0.8.4/docs/related.rst +128 -0
  22. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/specs.rst +8 -5
  23. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/unicode_version.rst +10 -4
  24. {wcwidth-0.8.2 → wcwidth-0.8.4}/pyproject.toml +1 -4
  25. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_ambiguous.py +16 -0
  26. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_benchmarks.py +64 -0
  27. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip.py +212 -1
  28. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip_overtyping.py +88 -0
  29. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_core.py +83 -0
  30. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_grapheme.py +91 -1
  31. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_justify.py +3 -0
  32. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_sgr_state.py +33 -0
  33. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_term_overrides.py +44 -2
  34. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_text_sizing.py +5 -0
  35. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_textwrap.py +172 -3
  36. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_ucslevel.py +1 -1
  37. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_width.py +43 -0
  38. {wcwidth-0.8.2 → wcwidth-0.8.4}/tox.ini +51 -10
  39. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/__init__.py +2 -4
  40. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_clip.py +132 -60
  41. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_constants.py +13 -0
  42. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_wcswidth.py +9 -2
  43. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_wcwidth.py +7 -1
  44. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/_width.py +8 -4
  45. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/align.py +9 -9
  46. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/escape_sequences.py +19 -5
  47. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/grapheme.py +10 -78
  48. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/hyperlink.py +1 -1
  49. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/sgr_state.py +18 -2
  50. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_ambiguous.py +3 -3
  51. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_grapheme.py +65 -47
  52. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_grapheme_overrides/__init__.py +3 -3
  53. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_50bf0759.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_058c7585.py +73 -2
  54. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_da9ceb0a.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_2148ff29.py +1 -106
  55. wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_244dc88b.py +82 -0
  56. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c0a2cdbf.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_336a71a1.py +18 -45
  57. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_45d92e98.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_33ac73f2.py +1 -1
  58. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_8589765c.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_3a1895d5.py +181 -284
  59. wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_59180a0d.py +2669 -0
  60. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_27e0693f.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_65c6beb5.py +73 -2
  61. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c2157f7e.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_78f828e8.py +73 -1
  62. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_e08bd75e.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_8c2ae14d.py +73 -2
  63. wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_900356bf.py +115 -0
  64. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_5bfac390.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_97904ece.py +2 -2
  65. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_813fee16.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_a5880eeb.py +1 -1
  66. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_c3db41c0.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_b6d33cf4.py +18 -45
  67. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_e22030f3.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_c57c295b.py +89 -63
  68. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_529fbb4a.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_cf02297d.py +1 -1
  69. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_fcc05a0f.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_e18ac6a7.py +89 -63
  70. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_4cdf59ce.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_e2b75ee3.py +1 -1
  71. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_970dbe10.py → wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_fb5fd79b.py +128 -15
  72. wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_known_fdc99132.py +2642 -0
  73. wcwidth-0.8.4/wcwidth/table_grapheme_overrides/_registry.py +32 -0
  74. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_mc.py +6 -3
  75. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_overrides.py +298 -172
  76. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_term_programs.py +1 -0
  77. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_vs15.py +1 -1
  78. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_vs16.py +1 -1
  79. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_wide.py +16 -13
  80. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/table_zero.py +15 -9
  81. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/text_sizing.py +8 -7
  82. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/textwrap.py +17 -9
  83. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/unicode_versions.py +1 -1
  84. wcwidth-0.8.2/docs/intro.rst +0 -1005
  85. wcwidth-0.8.2/ucs-detect/data/AbsoluteTelnetSSH.yaml +0 -789
  86. wcwidth-0.8.2/ucs-detect/data/_linuxfbdev.yaml +0 -50
  87. wcwidth-0.8.2/ucs-detect/data/_syncterm.yaml +0 -38
  88. wcwidth-0.8.2/ucs-detect/data/alacritty.yaml +0 -8821
  89. wcwidth-0.8.2/ucs-detect/data/bobcat.yaml +0 -10804
  90. wcwidth-0.8.2/ucs-detect/data/conemu.exe.yaml +0 -27608
  91. wcwidth-0.8.2/ucs-detect/data/contour.yaml +0 -21578
  92. wcwidth-0.8.2/ucs-detect/data/coolretroterm.yaml +0 -10734
  93. wcwidth-0.8.2/ucs-detect/data/emoji-test-latest.txt +0 -5518
  94. wcwidth-0.8.2/ucs-detect/data/emoji-variation-sequences-latest.txt +0 -757
  95. wcwidth-0.8.2/ucs-detect/data/emoji-zwj-sequences-latest.txt +0 -1675
  96. wcwidth-0.8.2/ucs-detect/data/extraterm.yaml +0 -33248
  97. wcwidth-0.8.2/ucs-detect/data/foot.yaml +0 -8258
  98. wcwidth-0.8.2/ucs-detect/data/ghostty.yaml +0 -1010
  99. wcwidth-0.8.2/ucs-detect/data/gnometerminal.yaml +0 -16247
  100. wcwidth-0.8.2/ucs-detect/data/hyper.yaml +0 -12553
  101. wcwidth-0.8.2/ucs-detect/data/iterm2.yaml +0 -6564
  102. wcwidth-0.8.2/ucs-detect/data/kitty.yaml +0 -15643
  103. wcwidth-0.8.2/ucs-detect/data/konsole.yaml +0 -7624
  104. wcwidth-0.8.2/ucs-detect/data/libvterm.yaml +0 -13536
  105. wcwidth-0.8.2/ucs-detect/data/lxterminal.yaml +0 -12959
  106. wcwidth-0.8.2/ucs-detect/data/mintty.yaml +0 -26246
  107. wcwidth-0.8.2/ucs-detect/data/mlterm.yaml +0 -17478
  108. wcwidth-0.8.2/ucs-detect/data/putty.yaml +0 -10682
  109. wcwidth-0.8.2/ucs-detect/data/qterminal.yaml +0 -9153
  110. wcwidth-0.8.2/ucs-detect/data/rio.yaml +0 -11346
  111. wcwidth-0.8.2/ucs-detect/data/rxvtunicode.yaml +0 -10736
  112. wcwidth-0.8.2/ucs-detect/data/screen.yaml +0 -19446
  113. wcwidth-0.8.2/ucs-detect/data/securecrt.yaml +0 -16450
  114. wcwidth-0.8.2/ucs-detect/data/st.yaml +0 -10669
  115. wcwidth-0.8.2/ucs-detect/data/tabby.yaml +0 -13641
  116. wcwidth-0.8.2/ucs-detect/data/teraterm.yaml +0 -6684
  117. wcwidth-0.8.2/ucs-detect/data/terminalapp.yaml +0 -10901
  118. wcwidth-0.8.2/ucs-detect/data/terminalexe.yaml +0 -3078
  119. wcwidth-0.8.2/ucs-detect/data/terminator.yaml +0 -15308
  120. wcwidth-0.8.2/ucs-detect/data/terminology.yaml +0 -31854
  121. wcwidth-0.8.2/ucs-detect/data/tmux.yaml +0 -8371
  122. wcwidth-0.8.2/ucs-detect/data/vscodeterminal.yaml +0 -11720
  123. wcwidth-0.8.2/ucs-detect/data/warp.yaml +0 -13297
  124. wcwidth-0.8.2/ucs-detect/data/westonterminal.yaml +0 -26416
  125. wcwidth-0.8.2/ucs-detect/data/wezterm.yaml +0 -10571
  126. wcwidth-0.8.2/ucs-detect/data/xfce4terminal.yaml +0 -13040
  127. wcwidth-0.8.2/ucs-detect/data/xterm.yaml +0 -10794
  128. wcwidth-0.8.2/ucs-detect/data/zellij.yaml +0 -13479
  129. wcwidth-0.8.2/ucs-detect/data/zutty.yaml +0 -10704
  130. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_3d4826b8.py +0 -6462
  131. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_8f94b404.py +0 -2581
  132. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_known_fd9d4c44.py +0 -3671
  133. wcwidth-0.8.2/wcwidth/table_grapheme_overrides/_registry.py +0 -32
  134. {wcwidth-0.8.2 → wcwidth-0.8.4}/.pylintrc +0 -0
  135. {wcwidth-0.8.2 → wcwidth-0.8.4}/LICENSE +0 -0
  136. {wcwidth-0.8.2 → wcwidth-0.8.4}/README.rst +0 -0
  137. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/show-sequences +0 -0
  138. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/strip-sequences +0 -0
  139. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/verify-table-integrity.py +0 -0
  140. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/wcwidth-browser.py +0 -0
  141. {wcwidth-0.8.2 → wcwidth-0.8.4}/bin/wcwidth-libc-comparator.py +0 -0
  142. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_override_per_terminal.py.j2 +0 -0
  143. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_override_table.py.j2 +0 -0
  144. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_registry.py.j2 +0 -0
  145. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/grapheme_table.py.j2 +0 -0
  146. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/python_table.py.j2 +0 -0
  147. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/table_overrides.py.j2 +0 -0
  148. {wcwidth-0.8.2 → wcwidth-0.8.4}/code_templates/unicode_versions.py.j2 +0 -0
  149. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/api.rst +0 -0
  150. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/conf.py +0 -0
  151. {wcwidth-0.8.2 → wcwidth-0.8.4}/docs/requirements.txt +0 -0
  152. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-develop.txt +0 -0
  153. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-docs.in +0 -0
  154. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests38.in +0 -0
  155. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests38.txt +0 -0
  156. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests39.in +0 -0
  157. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-tests39.txt +0 -0
  158. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-update.in +0 -0
  159. {wcwidth-0.8.2 → wcwidth-0.8.4}/requirements-update.txt +0 -0
  160. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/__init__.py +0 -0
  161. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/conftest.py +0 -0
  162. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_clip_cjk_emoji.py +0 -0
  163. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_emojis.py +0 -0
  164. {wcwidth-0.8.2 → wcwidth-0.8.4}/tests/test_hyperlink.py +0 -0
  165. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/bisearch.py +0 -0
  166. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/control_codes.py +0 -0
  167. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/py.typed +0 -0
  168. {wcwidth-0.8.2 → wcwidth-0.8.4}/wcwidth/wcwidth.py +0 -0
@@ -1,5 +1,6 @@
1
1
  __pycache__
2
2
  .coverage
3
+ *,cover
3
4
  .cache
4
5
  .tox
5
6
  *.egg-info
@@ -7,6 +8,9 @@ __pycache__
7
8
  *.pyc
8
9
  *.swp
9
10
  build
11
+ /libwcwidth/build-cmake
12
+ /libwcwidth/core
13
+ *.so
10
14
  dist
11
15
  docs/_build
12
16
  htmlcov
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: wcwidth
3
- Version: 0.8.2
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: Windows Terminal, WezTerm, ghostty,
99
- contour, and foot. This library does support any specific "legacy width" measurement, but does
100
- provide Corrections_ for those terminals without grapheme support.
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
- - `Grapheme Clusters and Terminal Emulators`_
105
- - `terminal-unicode-core.tex`_
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', 'extraterm', 'foot',
505
- 'ghostty', 'hyper', 'iterm.app', 'iterm2', 'kitty', 'konsole', 'mintty',
506
- 'mlterm', 'pterm', 'putty', 'rio', 'rxvt', 'rxvt-unicode-256color', 'st',
507
- 'st-256color', 'tabby', 'terminology', 'urxvt', 'vscode', 'vte', 'warp',
508
- 'warpterminal', 'wezterm', 'xterm', 'xterm-ghostty', 'xterm-kitty',
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. `wcstwidth()`_ defaults to
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
- Developing
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
- This project is using `pip-tools`_ to manage requirements.
538
+ Developer documentation, for building and contributing to this project, at
539
+ https://wcwidth.readthedocs.io/en/latest/developing.html
578
540
 
579
- To upgrade requirements for updating unicode version, run::
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 (2026)`: https://www.jeffquast.com/post/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
+