227 lines
7.3 KiB
ReStructuredText
227 lines
7.3 KiB
ReStructuredText
.. image:: https://img.shields.io/travis/jquast/wcwidth.svg
|
|
:target: https://travis-ci.org/jquast/wcwidth
|
|
:alt: Travis Continous Integration
|
|
|
|
.. image:: https://img.shields.io/coveralls/jquast/wcwidth.svg
|
|
:target: https://coveralls.io/r/jquast/wcwidth
|
|
:alt: Coveralls Code Coverage
|
|
|
|
.. image:: https://img.shields.io/pypi/v/wcwidth.svg
|
|
:target: https://pypi.python.org/pypi/wcwidth/
|
|
:alt: Latest Version
|
|
|
|
.. image:: https://img.shields.io/github/license/jquast/wcwidth.svg
|
|
:target: https://pypi.python.org/pypi/wcwidth/
|
|
:alt: License
|
|
|
|
.. image:: https://img.shields.io/pypi/wheel/wcwidth.svg
|
|
:alt: Wheel Status
|
|
|
|
.. image:: https://img.shields.io/pypi/dm/wcwidth.svg
|
|
:target: https://pypi.python.org/pypi/wcwidth/
|
|
:alt: Downloads
|
|
|
|
============
|
|
Introduction
|
|
============
|
|
|
|
This Library is mainly for those implementing a Terminal Emulator, or programs
|
|
that carefully produce output to be interpreted by one.
|
|
|
|
**Problem Statement**: When printed to the screen, the length of the string is
|
|
usually equal to the number of cells it occupies. However, there are
|
|
categories of characters that occupy 2 cells (full-wide), and others that
|
|
occupy 0.
|
|
|
|
|
|
**Solution**: POSIX.1-2001 and POSIX.1-2008 conforming systems provide
|
|
`wcwidth(3)`_ and `wcswidth(3)`_ C functions of which this python module's
|
|
functions precisely copy. *These functions return the number of cells a
|
|
unicode string is expected to occupy.*
|
|
|
|
This library aims to be forward-looking, portable, and most correct. The most
|
|
current release of this API is based on the Unicode Standard release files:
|
|
|
|
``DerivedGeneralCategory-9.0.0.txt``
|
|
*Date: 2016-06-01, 10:34:26 GMT*
|
|
© 2016 Unicode®, Inc.
|
|
|
|
``EastAsianWidth-9.0.0.txt``
|
|
*Date: 2016-05-27, 17:00:00 GMT [KW, LI]*
|
|
© 2016 Unicode®, Inc.
|
|
|
|
|
|
Installation
|
|
------------
|
|
|
|
The stable version of this package is maintained on pypi, install using pip::
|
|
|
|
pip install wcwidth
|
|
|
|
Example
|
|
-------
|
|
|
|
To Display ``u'コンニチハ'`` right-adjusted on screen of 80 columns::
|
|
|
|
>>> from wcwidth import wcswidth
|
|
>>> text = u'コンニチハ'
|
|
>>> text_len = wcswidth(text)
|
|
>>> print(u' ' * (80 - text_len) + text)
|
|
|
|
wcwidth, wcswidth
|
|
-----------------
|
|
Use function ``wcwidth()`` to determine the length of a *single unicode
|
|
character*, and ``wcswidth()`` to determine the length of a several, or a
|
|
*string of unicode characters*.
|
|
|
|
Briefly, return values of function ``wcwidth()`` are:
|
|
|
|
``-1``
|
|
Indeterminate (not printable).
|
|
|
|
``0``
|
|
Does not advance the cursor, such as NULL or Combining.
|
|
|
|
``2``
|
|
Characters of category East Asian Wide (W) or East Asian
|
|
Full-width (F) which are displayed using two terminal cells.
|
|
|
|
``1``
|
|
All others.
|
|
|
|
Function ``wcswidth()`` simply returns the sum of all values for each character
|
|
along a string, or ``-1`` when it occurs anywhere along a string.
|
|
|
|
More documentation is available using pydoc::
|
|
|
|
$ pydoc wcwidth
|
|
|
|
=======
|
|
Caveats
|
|
=======
|
|
|
|
This library attempts to determine the printable width by an unknown targeted
|
|
terminal emulator. It does not provide any ability to discern what the target
|
|
emulator software, version, of level of support is. Results may vary!
|
|
|
|
A `crude method
|
|
<http://blessed.readthedocs.org/en/latest/examples.html#detect-multibyte-py>`_
|
|
of determining the level of unicode support by the target emulator may be
|
|
performed using the VT100 Query Cursor Position sequence.
|
|
|
|
The libc version of `wcwidth(3)`_ is often several unicode releases behind,
|
|
and therefor several levels of support lower than this python library. You
|
|
may determine an exacting list of these discrepancies using the project
|
|
file `wcwidth-libc-comparator.py
|
|
<https://github.com/jquast/wcwidth/tree/master/bin/wcwidth-libc-comparator.py>`_.
|
|
|
|
|
|
==========
|
|
Developing
|
|
==========
|
|
|
|
Install wcwidth in editable mode::
|
|
|
|
pip install -e.
|
|
|
|
Install developer requirements::
|
|
|
|
pip install -r requirements-develop.txt
|
|
|
|
Execute unit tests using tox::
|
|
|
|
tox
|
|
|
|
Updating Tables
|
|
---------------
|
|
|
|
The command ``python setup.py update`` will fetch the following resources:
|
|
|
|
- http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
|
|
- http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt
|
|
|
|
And generates the table files:
|
|
|
|
- `wcwidth/table_wide.py <https://github.com/jquast/wcwidth/tree/master/wcwidth/table_wide.py>`_
|
|
- `wcwidth/table_zero.py <https://github.com/jquast/wcwidth/tree/master/wcwidth/table_zero.py>`_
|
|
|
|
Uses
|
|
----
|
|
|
|
This library is used in:
|
|
|
|
- `jquast/blessed`_, a simplified wrapper around curses.
|
|
|
|
- `jonathanslenders/python-prompt-toolkit`_, a Library for building powerful
|
|
interactive command lines in Python.
|
|
|
|
Additional tools for displaying and testing wcwidth are found in the `bin/
|
|
<https://github.com/jquast/wcwidth/tree/master/bin>`_ folder of this project's
|
|
source code. They are not distributed.
|
|
|
|
=======
|
|
History
|
|
=======
|
|
|
|
0.1.7 *2016-07-01*
|
|
* **Updated** tables to Unicode Specification 9.0.0. (`PR #18`_).
|
|
|
|
0.1.6 *2016-01-08 Production/Stable*
|
|
* ``LICENSE`` file now included with distribution.
|
|
|
|
0.1.5 *2015-09-13 Alpha*
|
|
* **Bugfix**:
|
|
Resolution of "combining_ character width" issue, most especially
|
|
those that previously returned -1 now often (correctly) return 0.
|
|
resolved by `Philip Craig`_ via `PR #11`_.
|
|
* **Deprecated**:
|
|
The module path ``wcwidth.table_comb`` is no longer available,
|
|
it has been superseded by module path ``wcwidth.table_zero``.
|
|
|
|
0.1.4 *2014-11-20 Pre-Alpha*
|
|
* **Feature**: ``wcswidth()`` now determines printable length
|
|
for (most) combining_ characters. The developer's tool
|
|
`bin/wcwidth-browser.py`_ is improved to display combining_
|
|
characters when provided the ``--combining`` option
|
|
(`Thomas Ballinger`_ and `Leta Montopoli`_ `PR #5`_).
|
|
* **Feature**: added static analysis (prospector_) to testing
|
|
framework.
|
|
|
|
0.1.3 *2014-10-29 Pre-Alpha*
|
|
* **Bugfix**: 2nd parameter of wcswidth was not honored.
|
|
(`Thomas Ballinger`_, `PR #4`_).
|
|
|
|
0.1.2 *2014-10-28 Pre-Alpha*
|
|
* **Updated** tables to Unicode Specification 7.0.0.
|
|
(`Thomas Ballinger`_, `PR #3`_).
|
|
|
|
0.1.1 *2014-05-14 Pre-Alpha*
|
|
* Initial release to pypi, Based on Unicode Specification 6.3.0
|
|
|
|
This code was originally derived directly from C code of the same name,
|
|
whose latest version is available at
|
|
http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c::
|
|
|
|
* Markus Kuhn -- 2007-05-26 (Unicode 5.0)
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software
|
|
* for any purpose and without fee is hereby granted. The author
|
|
* disclaims all warranties with regard to this software.
|
|
|
|
.. _`prospector`: https://github.com/landscapeio/prospector
|
|
.. _`combining`: https://en.wikipedia.org/wiki/Combining_character
|
|
.. _`bin/wcwidth-browser.py`: https://github.com/jquast/wcwidth/tree/master/bin/wcwidth-browser.py
|
|
.. _`Thomas Ballinger`: https://github.com/thomasballinger
|
|
.. _`Leta Montopoli`: https://github.com/lmontopo
|
|
.. _`Philip Craig`: https://github.com/philipc
|
|
.. _`PR #3`: https://github.com/jquast/wcwidth/pull/3
|
|
.. _`PR #4`: https://github.com/jquast/wcwidth/pull/4
|
|
.. _`PR #5`: https://github.com/jquast/wcwidth/pull/5
|
|
.. _`PR #11`: https://github.com/jquast/wcwidth/pull/11
|
|
.. _`PR #18`: https://github.com/jquast/wcwidth/pull/18
|
|
.. _`jquast/blessed`: https://github.com/jquast/blessed
|
|
.. _`jonathanslenders/python-prompt-toolkit`: https://github.com/jonathanslenders/python-prompt-toolkit
|
|
.. _`wcwidth(3)`: http://man7.org/linux/man-pages/man3/wcwidth.3.html
|
|
.. _`wcswidth(3)`: http://man7.org/linux/man-pages/man3/wcswidth.3.html
|
|
|
|
|