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