# chws_tool **Repository Path**: mirrors_googlefonts/chws_tool ## Basic Information - **Project Name**: chws_tool - **Description**: Add OpenType chws/vchw features to fonts. - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-27 - **Last Updated**: 2026-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![Continuous Test + Deploy](https://github.com/googlefonts/chws_tool/actions/workflows/ci.yml/badge.svg)](https://github.com/googlefonts/chws_tool/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/chws-tool.svg)](https://pypi.org/project/chws-tool/) [![Dependencies](https://badgen.net/github/dependabot/googlefonts/chws_tool)](https://github.com/googlefonts/chws_tool/network/updates) # chws_tool This tool adds the OpenType [`chws`], [`vchw`], [`halt`], and [`vhal`] features to OpenType/TrueType fonts when any of these features are missing. Please see [east-asian-spacing] for details of these features. This tool uses the [east-asian-spacing] package as its core engine, and has following advantages: * Simpler API and command line options. * Supports CJK fonts at [fonts.google.com] in its built-in [config]. To add new fonts to the supported font list, please see the [Adding Fonts] section below. [east-asian-spacing]: https://github.com/kojiishi/east_asian_spacing [`chws`]: https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#tag-chws [`halt`]: https://docs.microsoft.com/en-us/typography/opentype/spec/features_fj#tag-halt [`vchw`]: https://docs.microsoft.com/en-us/typography/opentype/spec/features_uz#tag-vchw [`vhal`]: https://docs.microsoft.com/en-us/typography/opentype/spec/features_uz#tag-vhal [fonts.google.com]: https://fonts.google.com/ ## Install You can install this tool by [pipx] or [uv]. ```shell-session pipx install chws-tool ``` ```shell-session uv tool install chws-tool ``` Using [pip] is also supported, but please be aware that, if you install with [pip] in the global environment, its dependencies may cause conflicts with other packages. If all what you need is the command line tool, [pipx] or [uv] can install it globally while still isolating it in a virtual environment. ```shell-session pip install chws-tool ``` [pip]: https://pip.pypa.io/en/latest/ [pipx]: https://pipxproject.github.io/pipx/ [uv]: https://docs.astral.sh/uv/ ## Command Line Usage The following example adds the features to `input.otf` and saves it to the `build` directory. If the argument is a directory, the tool expands it to all fonts in the directory recursively. ```shell-session add-chws input.otf ``` Use the `-o` option to change the output directory, or the `--help` option for the full list of options. ```shell-session add-chws input_dir -o output_dir ``` ## API The following example creates a font with the features in the "`build`" directory if the features are applicable: ```python import chws_tool def main(): output_path = chws_tool.add_chws("fonts/input.otf", "build") if output_path: print(f"Success! saved to {output_path}") else: print("Skipped") ``` If you prefer to overwrite existing fonts, you can omit the output directory. ```python import chws_tool def main(): chws_tool.add_chws("fonts/input.otf") ``` If your program uses [asyncio]: ```python import asyncio import chws_tool async def main_async(): output_path = await chws_tool.add_chws_async("fonts/input.otf", "build") if output_path: print(f"Success! saved to {output_path}") else: print("Skipped") asyncio.run(main_async()) ``` [asyncio]: https://docs.python.org/3/library/asyncio.html ## Advanced Topics ### Clone and Install If you want to clone the repository and install in the [editable mode] with the development packages, using [uv]: ```shell-session git clone https://github.com/googlefonts/chws_tool.git cd chws_tool uv sync . .venv/bin/activate uv tool install -e . ``` If you prefer using [pip]: ```shell-session git clone https://github.com/googlefonts/chws_tool.git cd chws_tool pip install -e '.[dev]' ``` [editable mode]: https://pip.pypa.io/en/stable/cli/pip_install/#install-editable ### Adding Fonts [adding fonts]: #adding-fonts This package has a built-in list of supported fonts in its [config]. Fonts not in the known list are still processed with the default configuration, but this package shows a warning message. When adding new fonts to the known font list, the following process is recommended: 1. Find the font names. Running the `add-chws` with `--print-name` option can print them. 2. Add them to the [config]. 3. (Optional) Build the font and run the [Visual Test]. This step is optional because this package automatically avoids glyph collisions by computing glyph outlines. 4. (Optional) Tweak the [config] if needed. [config]: src/chws_tool/config.py ### Visual Test [Visual Test]: #visual-test The primary purpose of this process is to find too tight spacings or glyph collisions caused by the kernings. This tool has heuristic rules to determine the applicability of the spacings using the glyph metrics, but assumes that full-width punctuation glyphs have enough internal spacings according to linguistic conventions as in [UAX#50](http://unicode.org/reports/tr50/#vertical_alternates) or in [CLREQ](https://w3c.github.io/clreq/#h-punctuation_adjustment_space). Unfortunately, not all fonts follow the conventions. To run the visual test: 1. Add the test font to the font list in the top `