METADATA 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. Metadata-Version: 2.4
  2. Name: wcwidth
  3. Version: 0.2.14
  4. Summary: Measures the displayed width of unicode strings in a terminal
  5. Home-page: https://github.com/jquast/wcwidth
  6. Author: Jeff Quast
  7. Author-email: contact@jeffquast.com
  8. License: MIT
  9. Keywords: cjk,combining,console,eastasian,emoji,emulator,terminal,unicode,wcswidth,wcwidth,xterm
  10. Classifier: Intended Audience :: Developers
  11. Classifier: Natural Language :: English
  12. Classifier: Development Status :: 5 - Production/Stable
  13. Classifier: Environment :: Console
  14. Classifier: License :: OSI Approved :: MIT License
  15. Classifier: Operating System :: POSIX
  16. Classifier: Programming Language :: Python :: 3.6
  17. Classifier: Programming Language :: Python :: 3.7
  18. Classifier: Programming Language :: Python :: 3.8
  19. Classifier: Programming Language :: Python :: 3.9
  20. Classifier: Programming Language :: Python :: 3.10
  21. Classifier: Programming Language :: Python :: 3.11
  22. Classifier: Programming Language :: Python :: 3.12
  23. Classifier: Programming Language :: Python :: 3.13
  24. Classifier: Programming Language :: Python :: 3.14
  25. Classifier: Topic :: Software Development :: Libraries
  26. Classifier: Topic :: Software Development :: Localization
  27. Classifier: Topic :: Software Development :: Internationalization
  28. Classifier: Topic :: Terminals
  29. Requires-Python: >=3.6
  30. License-File: LICENSE
  31. Dynamic: author
  32. Dynamic: author-email
  33. Dynamic: classifier
  34. Dynamic: description
  35. Dynamic: home-page
  36. Dynamic: keywords
  37. Dynamic: license
  38. Dynamic: license-file
  39. Dynamic: requires-python
  40. Dynamic: summary
  41. |pypi_downloads| |codecov| |license|
  42. ============
  43. Introduction
  44. ============
  45. This library is mainly for CLI programs that carefully produce output for
  46. Terminals, or make pretend to be an emulator.
  47. **Problem Statement**: The printable length of *most* strings are equal to the
  48. number of cells they occupy on the screen ``1 character : 1 cell``. However,
  49. there are categories of characters that *occupy 2 cells* (full-wide), and
  50. others that *occupy 0* cells (zero-width).
  51. **Solution**: POSIX.1-2001 and POSIX.1-2008 conforming systems provide
  52. `wcwidth(3)`_ and `wcswidth(3)`_ C functions of which this python module's
  53. functions precisely copy. *These functions return the number of cells a
  54. unicode string is expected to occupy.*
  55. Installation
  56. ------------
  57. The stable version of this package is maintained on pypi, install using pip::
  58. pip install wcwidth
  59. Example
  60. -------
  61. **Problem**: given the following phrase (Japanese),
  62. >>> text = u'コンニチハ'
  63. Python **incorrectly** uses the *string length* of 5 codepoints rather than the
  64. *printable length* of 10 cells, so that when using the `rjust` function, the
  65. output length is wrong::
  66. >>> print(len('コンニチハ'))
  67. 5
  68. >>> print('コンニチハ'.rjust(20, '_'))
  69. _______________コンニチハ
  70. By defining our own "rjust" function that uses wcwidth, we can correct this::
  71. >>> def wc_rjust(text, length, padding=' '):
  72. ... from wcwidth import wcswidth
  73. ... return padding * max(0, (length - wcswidth(text))) + text
  74. ...
  75. Our **Solution** uses wcswidth to determine the string length correctly::
  76. >>> from wcwidth import wcswidth
  77. >>> print(wcswidth('コンニチハ'))
  78. 10
  79. >>> print(wc_rjust('コンニチハ', 20, '_'))
  80. __________コンニチハ
  81. Choosing a Version
  82. ------------------
  83. Export an environment variable, ``UNICODE_VERSION``. This should be done by
  84. *terminal emulators* or those developers experimenting with authoring one of
  85. their own, from shell::
  86. $ export UNICODE_VERSION=13.0
  87. If unspecified, the latest version is used. If your Terminal Emulator does not
  88. export this variable, you can use the `jquast/ucs-detect`_ utility to
  89. automatically detect and export it to your shell.
  90. wcwidth, wcswidth
  91. -----------------
  92. Use function ``wcwidth()`` to determine the length of a *single unicode
  93. character*, and ``wcswidth()`` to determine the length of many, a *string
  94. of unicode characters*.
  95. Briefly, return values of function ``wcwidth()`` are:
  96. ``-1``
  97. Indeterminate (not printable).
  98. ``0``
  99. Does not advance the cursor, such as NULL or Combining.
  100. ``2``
  101. Characters of category East Asian Wide (W) or East Asian
  102. Full-width (F) which are displayed using two terminal cells.
  103. ``1``
  104. All others.
  105. Function ``wcswidth()`` simply returns the sum of all values for each character
  106. along a string, or ``-1`` when it occurs anywhere along a string.
  107. Full API Documentation at https://wcwidth.readthedocs.io
  108. ==========
  109. Developing
  110. ==========
  111. Install wcwidth in editable mode::
  112. pip install -e .
  113. Execute unit tests using tox_ for all supported Python versions::
  114. tox -e py36,py37,py38,py39,py310,py311,py312,py313,py314
  115. Updating Unicode Version
  116. ------------------------
  117. Regenerate python code tables from latest Unicode Specification data files::
  118. tox -e update
  119. The script is located at ``bin/update-tables.py``, requires Python 3.9 or
  120. later. It is recommended but not necessary to run this script with the newest
  121. Python, because the newest Python has the latest ``unicodedata`` for generating
  122. comments.
  123. Building Documentation
  124. ----------------------
  125. This project is using `sphinx`_ 4.5 to build documentation::
  126. tox -e sphinx
  127. The output will be in ``docs/_build/html/``.
  128. Updating Requirements
  129. ---------------------
  130. This project is using `pip-tools`_ to manage requirements.
  131. To upgrade requirements for updating unicode version, run::
  132. tox -e update_requirements_update
  133. To upgrade requirements for testing, run::
  134. tox -e update_requirements37,update_requirements39
  135. To upgrade requirements for building documentation, run::
  136. tox -e update_requirements_docs
  137. Utilities
  138. ---------
  139. Supplementary tools for browsing and testing terminals for wide unicode
  140. characters are found in the `bin/`_ of this project's source code. Just ensure
  141. to first ``pip install -r requirements-develop.txt`` from this projects main
  142. folder. For example, an interactive browser for testing::
  143. python ./bin/wcwidth-browser.py
  144. ====
  145. Uses
  146. ====
  147. This library is used in:
  148. - `jquast/blessed`_: a thin, practical wrapper around terminal capabilities in
  149. Python.
  150. - `prompt-toolkit/python-prompt-toolkit`_: a Library for building powerful
  151. interactive command lines in Python.
  152. - `dbcli/pgcli`_: Postgres CLI with autocompletion and syntax highlighting.
  153. - `thomasballinger/curtsies`_: a Curses-like terminal wrapper with a display
  154. based on compositing 2d arrays of text.
  155. - `selectel/pyte`_: Simple VTXXX-compatible linux terminal emulator.
  156. - `astanin/python-tabulate`_: Pretty-print tabular data in Python, a library
  157. and a command-line utility.
  158. - `rspeer/python-ftfy`_: Fixes mojibake and other glitches in Unicode
  159. text.
  160. - `nbedos/termtosvg`_: Terminal recorder that renders sessions as SVG
  161. animations.
  162. - `peterbrittain/asciimatics`_: Package to help people create full-screen text
  163. UIs.
  164. - `python-cmd2/cmd2`_: A tool for building interactive command line apps
  165. - `stratis-storage/stratis-cli`_: CLI for the Stratis project
  166. - `ihabunek/toot`_: A Mastodon CLI/TUI client
  167. - `saulpw/visidata`_: Terminal spreadsheet multitool for discovering and
  168. arranging data
  169. ===============
  170. Other Languages
  171. ===============
  172. - `timoxley/wcwidth`_: JavaScript
  173. - `janlelis/unicode-display_width`_: Ruby
  174. - `alecrabbit/php-wcwidth`_: PHP
  175. - `Text::CharWidth`_: Perl
  176. - `bluebear94/Terminal-WCWidth`_: Perl 6
  177. - `mattn/go-runewidth`_: Go
  178. - `grepsuzette/wcwidth`_: Haxe
  179. - `aperezdc/lua-wcwidth`_: Lua
  180. - `joachimschmidt557/zig-wcwidth`_: Zig
  181. - `fumiyas/wcwidth-cjk`_: `LD_PRELOAD` override
  182. - `joshuarubin/wcwidth9`_: Unicode version 9 in C
  183. =======
  184. History
  185. =======
  186. 0.2.14 *2025-09-22*
  187. * **Drop Support** for Python 2.7 and 3.5. `PR #117`_.
  188. * **Update** tables to include Unicode Specifications 16.0.0 and 17.0.0.
  189. `PR #146`_.
  190. * **Bugfix** U+00AD SOFT HYPHEN should measure as 1, versions 0.2.9 through
  191. 0.2.13 measured as 0. `PR #149`_.
  192. 0.2.13 *2024-01-06*
  193. * **Bugfix** zero-width support for Hangul Jamo (Korean)
  194. 0.2.12 *2023-11-21*
  195. * re-release to remove .pyi file misplaced in wheel files `Issue #101`_.
  196. 0.2.11 *2023-11-20*
  197. * Include tests files in the source distribution (`PR #98`_, `PR #100`_).
  198. 0.2.10 *2023-11-13*
  199. * **Bugfix** accounting of some kinds of emoji sequences using U+FE0F
  200. Variation Selector 16 (`PR #97`_).
  201. * **Updated** `Specification <Specification_from_pypi_>`_.
  202. 0.2.9 *2023-10-30*
  203. * **Bugfix** zero-width characters used in Emoji ZWJ sequences, Balinese,
  204. Jamo, Devanagari, Tamil, Kannada and others (`PR #91`_).
  205. * **Updated** to include `Specification <Specification_from_pypi_>`_ of
  206. character measurements.
  207. 0.2.8 *2023-09-30*
  208. * Include requirements files in the source distribution (`PR #82`_).
  209. 0.2.7 *2023-09-28*
  210. * **Updated** tables to include Unicode Specification 15.1.0.
  211. * Include ``bin``, ``docs``, and ``tox.ini`` in the source distribution
  212. 0.2.6 *2023-01-14*
  213. * **Updated** tables to include Unicode Specification 14.0.0 and 15.0.0.
  214. * **Changed** developer tools to use pip-compile, and to use jinja2 templates
  215. for code generation in `bin/update-tables.py` to prepare for possible
  216. compiler optimization release.
  217. 0.2.1 .. 0.2.5 *2020-06-23*
  218. * **Repository** changes to update tests and packaging issues, and
  219. begin tagging repository with matching release versions.
  220. 0.2.0 *2020-06-01*
  221. * **Enhancement**: Unicode version may be selected by exporting the
  222. Environment variable ``UNICODE_VERSION``, such as ``13.0``, or ``6.3.0``.
  223. See the `jquast/ucs-detect`_ CLI utility for automatic detection.
  224. * **Enhancement**:
  225. API Documentation is published to readthedocs.io.
  226. * **Updated** tables for *all* Unicode Specifications with files
  227. published in a programmatically consumable format, versions 4.1.0
  228. through 13.0
  229. 0.1.9 *2020-03-22*
  230. * **Performance** optimization by `Avram Lubkin`_, `PR #35`_.
  231. * **Updated** tables to Unicode Specification 13.0.0.
  232. 0.1.8 *2020-01-01*
  233. * **Updated** tables to Unicode Specification 12.0.0. (`PR #30`_).
  234. 0.1.7 *2016-07-01*
  235. * **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).
  236. 0.1.6 *2016-01-08 Production/Stable*
  237. * ``LICENSE`` file now included with distribution.
  238. 0.1.5 *2015-09-13 Alpha*
  239. * **Bugfix**:
  240. Resolution of "combining_ character width" issue, most especially
  241. those that previously returned -1 now often (correctly) return 0.
  242. resolved by `Philip Craig`_ via `PR #11`_.
  243. * **Deprecated**:
  244. The module path ``wcwidth.table_comb`` is no longer available,
  245. it has been superseded by module path ``wcwidth.table_zero``.
  246. 0.1.4 *2014-11-20 Pre-Alpha*
  247. * **Feature**: ``wcswidth()`` now determines printable length
  248. for (most) combining_ characters. The developer's tool
  249. `bin/wcwidth-browser.py`_ is improved to display combining_
  250. characters when provided the ``--combining`` option
  251. (`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).
  252. * **Feature**: added static analysis (prospector_) to testing
  253. framework.
  254. 0.1.3 *2014-10-29 Pre-Alpha*
  255. * **Bugfix**: 2nd parameter of wcswidth was not honored.
  256. (`Thomas Ballinger`_, `PR #4`_).
  257. 0.1.2 *2014-10-28 Pre-Alpha*
  258. * **Updated** tables to Unicode Specification 7.0.0.
  259. (`Thomas Ballinger`_, `PR #3`_).
  260. 0.1.1 *2014-05-14 Pre-Alpha*
  261. * Initial release to pypi, Based on Unicode Specification 6.3.0
  262. This code was originally derived directly from C code of the same name,
  263. whose latest version is available at
  264. https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::
  265. * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
  266. *
  267. * Permission to use, copy, modify, and distribute this software
  268. * for any purpose and without fee is hereby granted. The author
  269. * disclaims all warranties with regard to this software.
  270. .. _`Specification_from_pypi`: https://wcwidth.readthedocs.io/en/latest/specs.html
  271. .. _`tox`: https://tox.wiki/en/latest/
  272. .. _`prospector`: https://github.com/landscapeio/prospector
  273. .. _`combining`: https://en.wikipedia.org/wiki/Combining_character
  274. .. _`bin/`: https://github.com/jquast/wcwidth/tree/master/bin
  275. .. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/blob/master/bin/wcwidth-browser.py
  276. .. _`Thomas Ballinger`: https://github.com/thomasballinger
  277. .. _`Leta Montopoli`: https://github.com/lmontopo
  278. .. _`Philip Craig`: https://github.com/philipc
  279. .. _`PR #3`: https://github.com/jquast/wcwidth/pull/3
  280. .. _`PR #4`: https://github.com/jquast/wcwidth/pull/4
  281. .. _`PR #5`: https://github.com/jquast/wcwidth/pull/5
  282. .. _`PR #11`: https://github.com/jquast/wcwidth/pull/11
  283. .. _`PR #18`: https://github.com/jquast/wcwidth/pull/18
  284. .. _`PR #30`: https://github.com/jquast/wcwidth/pull/30
  285. .. _`PR #35`: https://github.com/jquast/wcwidth/pull/35
  286. .. _`PR #82`: https://github.com/jquast/wcwidth/pull/82
  287. .. _`PR #91`: https://github.com/jquast/wcwidth/pull/91
  288. .. _`PR #97`: https://github.com/jquast/wcwidth/pull/97
  289. .. _`PR #98`: https://github.com/jquast/wcwidth/pull/98
  290. .. _`PR #100`: https://github.com/jquast/wcwidth/pull/100
  291. .. _`PR #117`: https://github.com/jquast/wcwidth/pull/117
  292. .. _`PR #146`: https://github.com/jquast/wcwidth/pull/146
  293. .. _`PR #149`: https://github.com/jquast/wcwidth/pull/149
  294. .. _`Issue #101`: https://github.com/jquast/wcwidth/issues/101
  295. .. _`jquast/blessed`: https://github.com/jquast/blessed
  296. .. _`selectel/pyte`: https://github.com/selectel/pyte
  297. .. _`thomasballinger/curtsies`: https://github.com/thomasballinger/curtsies
  298. .. _`dbcli/pgcli`: https://github.com/dbcli/pgcli
  299. .. _`prompt-toolkit/python-prompt-toolkit`: https://github.com/prompt-toolkit/python-prompt-toolkit
  300. .. _`timoxley/wcwidth`: https://github.com/timoxley/wcwidth
  301. .. _`wcwidth(3)`: https://man7.org/linux/man-pages/man3/wcwidth.3.html
  302. .. _`wcswidth(3)`: https://man7.org/linux/man-pages/man3/wcswidth.3.html
  303. .. _`astanin/python-tabulate`: https://github.com/astanin/python-tabulate
  304. .. _`janlelis/unicode-display_width`: https://github.com/janlelis/unicode-display_width
  305. .. _`rspeer/python-ftfy`: https://github.com/rspeer/python-ftfy
  306. .. _`alecrabbit/php-wcwidth`: https://github.com/alecrabbit/php-wcwidth
  307. .. _`Text::CharWidth`: https://metacpan.org/pod/Text::CharWidth
  308. .. _`bluebear94/Terminal-WCWidth`: https://github.com/bluebear94/Terminal-WCWidth
  309. .. _`mattn/go-runewidth`: https://github.com/mattn/go-runewidth
  310. .. _`grepsuzette/wcwidth`: https://github.com/grepsuzette/wcwidth
  311. .. _`jquast/ucs-detect`: https://github.com/jquast/ucs-detect
  312. .. _`Avram Lubkin`: https://github.com/avylove
  313. .. _`nbedos/termtosvg`: https://github.com/nbedos/termtosvg
  314. .. _`peterbrittain/asciimatics`: https://github.com/peterbrittain/asciimatics
  315. .. _`aperezdc/lua-wcwidth`: https://github.com/aperezdc/lua-wcwidth
  316. .. _`joachimschmidt557/zig-wcwidth`: https://github.com/joachimschmidt557/zig-wcwidth
  317. .. _`fumiyas/wcwidth-cjk`: https://github.com/fumiyas/wcwidth-cjk
  318. .. _`joshuarubin/wcwidth9`: https://github.com/joshuarubin/wcwidth9
  319. .. _`python-cmd2/cmd2`: https://github.com/python-cmd2/cmd2
  320. .. _`stratis-storage/stratis-cli`: https://github.com/stratis-storage/stratis-cli
  321. .. _`ihabunek/toot`: https://github.com/ihabunek/toot
  322. .. _`saulpw/visidata`: https://github.com/saulpw/visidata
  323. .. _`pip-tools`: https://pip-tools.readthedocs.io/
  324. .. _`sphinx`: https://www.sphinx-doc.org/
  325. .. |pypi_downloads| image:: https://img.shields.io/pypi/dm/wcwidth.svg?logo=pypi
  326. :alt: Downloads
  327. :target: https://pypi.org/project/wcwidth/
  328. .. |codecov| image:: https://codecov.io/gh/jquast/wcwidth/branch/master/graph/badge.svg
  329. :alt: codecov.io Code Coverage
  330. :target: https://app.codecov.io/gh/jquast/wcwidth/
  331. .. |license| image:: https://img.shields.io/pypi/l/wcwidth.svg
  332. :target: https://pypi.org/project/wcwidth/
  333. :alt: MIT License