NotYAFC 1.0.0__py3-none-any.whl

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.
@@ -0,0 +1,107 @@
1
+ from fontTools.pens.cu2quPen import Cu2QuPen
2
+ from fontTools.pens.ttGlyphPen import TTGlyphPen
3
+ from fontTools.ttLib import TTFont, newTable
4
+ from fontTools.ttLib.tables._g_l_y_f import (
5
+ Glyph,
6
+ table__g_l_y_f,
7
+ )
8
+ from fontTools.ttLib.ttGlyphSet import _TTGlyphCFF
9
+
10
+ from font_converter.constants import (
11
+ T_CFF,
12
+ T_GLYF,
13
+ T_HMTX,
14
+ T_LOCA,
15
+ T_MAXP,
16
+ T_POST,
17
+ T_VORG,
18
+ )
19
+
20
+ MAXP_TABLE_VERSION = 0x00010000
21
+
22
+
23
+ def build_ttf(
24
+ font: TTFont, max_err: float = 1.0, reverse_direction: bool = True, post_format: float = 2.0
25
+ ) -> None:
26
+ """
27
+ Builds an OpenType-TT font with quadratic outlines.
28
+
29
+ :param font: The input ``TTFont`` object.
30
+ :type font: TTFont
31
+ :param max_err: The maximum approximation error, measured in UPEM.
32
+ :type max_err: float, optional
33
+ :param reverse_direction: Whether to reverse the direction of the contours.
34
+ :type reverse_direction: bool, optional
35
+ :param post_format: The format of the ``post`` table.
36
+ :type post_format: float, optional
37
+ """
38
+ glyph_order = font.getGlyphOrder()
39
+
40
+ font[T_LOCA] = newTable(T_LOCA)
41
+ font[T_GLYF] = glyf = newTable(T_GLYF)
42
+ glyf.glyphOrder = glyph_order
43
+ glyf.glyphs = glyphs_to_quadratic(
44
+ glyph_set=font.getGlyphSet(), max_err=max_err, reverse_direction=reverse_direction
45
+ )
46
+ del font[T_CFF]
47
+ if T_VORG in font:
48
+ del font[T_VORG]
49
+ glyf.compile(font)
50
+ update_hmtx(font=font, glyf=glyf)
51
+
52
+ font[T_MAXP] = maxp = newTable(T_MAXP)
53
+ maxp.tableVersion = MAXP_TABLE_VERSION
54
+ maxp.maxZones = 1
55
+ maxp.maxTwilightPoints = 0
56
+ maxp.maxStorage = 0
57
+ maxp.maxFunctionDefs = 0
58
+ maxp.maxInstructionDefs = 0
59
+ maxp.maxStackElements = 0
60
+ maxp.maxSizeOfInstructions = 0
61
+ maxp.maxComponentElements = max(
62
+ len(g.components if hasattr(g, "components") else []) for g in glyf.glyphs.values()
63
+ )
64
+ maxp.compile(font)
65
+
66
+ post = font[T_POST]
67
+ post.formatType = post_format
68
+ post.extraNames = []
69
+ post.mapping = {}
70
+ post.glyphOrder = glyph_order
71
+ try:
72
+ post.compile(font)
73
+ except OverflowError:
74
+ post.formatType = 3
75
+
76
+ font.sfntVersion = "\000\001\000\000"
77
+
78
+
79
+ def update_hmtx(font: TTFont, glyf: table__g_l_y_f) -> None:
80
+ """
81
+ Updates the ``xMin`` values in the ``hmtx`` table of a font.
82
+
83
+ :param font: The font to update the ``hmtx`` table of.
84
+ :type font: TTFont
85
+ :param glyf: The ``glyf`` table of the font.
86
+ :type glyf: table__g_l_y_f
87
+ """
88
+
89
+ hmtx = font[T_HMTX]
90
+ for glyph_name, glyph in glyf.glyphs.items():
91
+ if hasattr(glyph, "xMin"):
92
+ hmtx[glyph_name] = (hmtx[glyph_name][0], glyph.xMin)
93
+
94
+
95
+ def glyphs_to_quadratic(
96
+ glyph_set: dict[str, _TTGlyphCFF], max_err: float = 1.0, reverse_direction: bool = False
97
+ ) -> dict[str, Glyph]:
98
+ """Converts a dictionary of glyphs to quadratic outlines."""
99
+
100
+ quad_glyphs = {}
101
+ for gname in glyph_set:
102
+ glyph = glyph_set[gname]
103
+ tt_pen = TTGlyphPen(glyph_set)
104
+ cu2qu_pen = Cu2QuPen(tt_pen, max_err=max_err, reverse_direction=reverse_direction)
105
+ glyph.draw(cu2qu_pen)
106
+ quad_glyphs[gname] = tt_pen.glyph()
107
+ return quad_glyphs
@@ -0,0 +1,256 @@
1
+ Metadata-Version: 2.3
2
+ Name: NotYAFC
3
+ Version: 1.0.0
4
+ Summary: Not Yet Another Font Converter: a free and open-source font converter for desktop and command-line use, written in Python.
5
+ Author: Cesare Gilento
6
+ Author-email: Cesare Gilento <ftCLI@proton.me>
7
+ Requires-Dist: cffsubr>=0.4.0
8
+ Requires-Dist: fonttools[pathops,woff]>=4.68.0
9
+ Requires-Dist: pathvalidate>=3.3.1
10
+ Requires-Dist: pyside6>=6.8
11
+ Requires-Dist: typer==0.28.0
12
+ Requires-Dist: ttfautohint-py>=0.6.1
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+
16
+ # NotYAFC — Not Yet Another Font Converter
17
+ > A free, open-source desktop app and CLI for batch font conversion. Local, controllable, and built on trusted tools.
18
+
19
+ <p align="center">
20
+ <img src="https://raw.githubusercontent.com/ftCLI/NotYAFC/main/src/font_converter/assets/notyafc-1024.png" alt="NotYAFC logo" width="256" height="256">
21
+ </p>
22
+
23
+ <p align="center">
24
+ <a href="https://github.com/ftCLI/NotYAFC/actions/workflows/ci.yml"><img src="https://img.shields.io/github/check-runs/ftCLI/NotYAFC/main?nameFilter=Tests%20%28ubuntu-latest%29&label=Tests%20%28Linux%29" alt="Tests (Linux)"></a>
25
+ <a href="https://github.com/ftCLI/NotYAFC/actions/workflows/ci.yml"><img src="https://img.shields.io/github/check-runs/ftCLI/NotYAFC/main?nameFilter=Tests%20%28windows-latest%29&label=Tests%20%28Windows%29" alt="Tests (Windows)"></a>
26
+ <a href="https://github.com/ftCLI/NotYAFC/actions/workflows/ci.yml"><img src="https://img.shields.io/github/check-runs/ftCLI/NotYAFC/main?nameFilter=Tests%20%28macos-latest%29&label=Tests%20%28macOS%29" alt="Tests (macOS)"></a>
27
+ <a href="https://github.com/ftCLI/NotYAFC/actions/workflows/ci.yml"><img src="https://img.shields.io/github/check-runs/ftCLI/NotYAFC/main?nameFilter=Lint%20and%20type%20check&label=Lint" alt="Lint"></a>
28
+ <a href="https://pypi.org/project/notyafc/"><img src="https://img.shields.io/pypi/v/notyafc?label=PyPI" alt="PyPI version"></a>
29
+ </p>
30
+
31
+ ## Overview
32
+
33
+ NotYAFC converts fonts between formats — TrueType, PostScript, WOFF, WOFF2 — and can extract fonts from collections or export variable-font instances as static files. It runs entirely on your machine, supports batch processing, and gives you fine-grained control over every conversion parameter.
34
+
35
+ It provides two interfaces:
36
+
37
+ - **GUI** — A PySide6 desktop application with drag-and-drop, progress tracking, and per-profile options.
38
+ - **CLI** — A Typer-based command-line tool for scripting and repeatable workflows.
39
+
40
+ Both interfaces share the same conversion engine, so you get identical results regardless of how you use NotYAFC.
41
+
42
+ ## Why NotYAFC?
43
+
44
+ - **Local** — Your fonts never leave your machine. No uploads, no online services.
45
+ - **Batch-ready** — Add files or entire folders, scan recursively, and convert hundreds of fonts at once.
46
+ - **Transparent** — Built on [FontTools](https://github.com/fonttools/fonttools), `ttfautohint`, and `cffsubr`. No black-box conversion — just a practical interface around established font tools.
47
+ - **Fine-grained control** — Tune curve-conversion tolerance, target UPM, contour optimization, autohinting, subroutinization, and more.
48
+ - **Output, organized your way** — Build a custom folder structure from font properties and conversion settings, so even large batches land where you want them.
49
+ - **Batch-aware** — Pause, resume, or cancel mid-run. Incompatible fonts are explained, not silently skipped.
50
+ - **Dual interface** — Use the GUI for interactive work or the CLI for automation.
51
+
52
+ ## Installation
53
+
54
+ ### With uv (recommended)
55
+
56
+ ```console
57
+ uv tool install notyafc
58
+ notyafc
59
+ ```
60
+
61
+ Try it without installing: `uvx notyafc`. Upgrade later with `uv tool upgrade notyafc`.
62
+
63
+ The CLI is available as `notyafc-cli`. Run `notyafc-cli --help` for available commands.
64
+
65
+ ### From PyPI with pip
66
+
67
+ Install the latest release from [PyPI](https://pypi.org/project/notyafc/):
68
+
69
+ **Windows (PowerShell):**
70
+ ```powershell
71
+ py -m venv .venv
72
+ .\.venv\Scripts\Activate.ps1
73
+ python -m pip install notyafc
74
+ notyafc
75
+ ```
76
+
77
+ **macOS and Linux:**
78
+ ```console
79
+ python3 -m venv .venv
80
+ source .venv/bin/activate
81
+ python -m pip install notyafc
82
+ notyafc
83
+ ```
84
+
85
+ To upgrade an existing installation, run `python -m pip install --upgrade notyafc`.
86
+ The command-line interface is available as `notyafc-cli`; run `notyafc-cli --help` for usage.
87
+
88
+ ### From source
89
+
90
+ ```console
91
+ git clone https://github.com/ftCLI/NotYAFC.git
92
+ cd NotYAFC
93
+ uv sync
94
+ uv run notyafc
95
+ ```
96
+
97
+ ## Conversion Profiles
98
+
99
+ | Profile | Description |
100
+ |---------|-------------|
101
+ | `ttf2otf` | TrueType → PostScript (TTF → OTF) |
102
+ | `otf2ttf` | PostScript → TrueType (OTF → TTF) |
103
+ | `ft2wf` | SFNT → WOFF / WOFF2 webfonts |
104
+ | `woff2ft` | WOFF → SFNT (TTF or OTF) |
105
+ | `woff22ft` | WOFF2 → SFNT (TTF or OTF) |
106
+ | `ttc2sfnt` | TTC/OTC collection → individual fonts |
107
+ | `var2static` | Variable font → static instances |
108
+
109
+ ### Profile Options
110
+
111
+ #### TrueType → PostScript (`ttf2otf`)
112
+
113
+ - **Tolerance** (0.1–3, default 1) — Controls curve-conversion accuracy in thousandths of an em; the actual deviation scales with UPM. Lower values allow less deviation, but may increase point count and file size.
114
+ - **Target UPM** — Scale the font to a chosen units-per-em value.
115
+ - **Simplify contours** (0–3, default 0/off) — Experimental: merge neighboring smooth curves to reduce point count. Deviation is a multiple of Tolerance.
116
+ - **Subroutinize** (on by default) — Compress PostScript outlines using shared subroutines.
117
+
118
+ #### PostScript → TrueType (`otf2ttf`)
119
+
120
+ - **Tolerance** (0–3, default 1) — Controls curve-conversion accuracy in thousandths of an em; the actual deviation scales with UPM. Lower values allow less deviation, but may increase point count and file size.
121
+ - **Target UPM** — Scale the font to a chosen units-per-em value.
122
+ - **Autohint** (on by default) — Add TrueType hinting instructions via `ttfautohint`.
123
+
124
+ #### SFNT → WOFF / WOFF2 (`ft2wf`)
125
+
126
+ - **Format** — Choose WOFF, WOFF2, or both (both selected by default).
127
+ - **Obfuscate names** — Replace family, full, and PostScript names with hashes (including in the output filename).
128
+ - **Remove unused glyphs** — Drop glyphs not reachable from the character map or OpenType features.
129
+ - **Remove non-Windows names** — Strip `name` records for platforms other than Windows (platform ID 3).
130
+ - **Remove DSIG table** (WOFF only) — Remove the digital signature table.
131
+ - **Create CSS** — Write a `fonts.css` file with `@font-face` rules and classes for detected OpenType features (e.g., `.ft-liga`).
132
+
133
+ #### WOFF → SFNT (`woff2ft`) / WOFF2 → SFNT (`woff22ft`)
134
+
135
+ Converts back to the original outline type (TTF or OTF). No extra options needed.
136
+
137
+ #### TrueType Collection → SFNT (`ttc2sfnt`)
138
+
139
+ Unpacks a TTC/OTC collection into individual font files. No extra options needed.
140
+
141
+ #### Variable → Static (`var2static`)
142
+
143
+ Export named or custom variable-font instances as separate static fonts.
144
+
145
+ - **Named instances** — Pick from the font's predefined instances.
146
+ - **Custom instances** — Define your own axis values for any variable font.
147
+ - **Target UPM** — Scale the exported fonts.
148
+ - **Autohint** (TrueType) / **Subroutinize** (PostScript) — On by default when applicable.
149
+
150
+ ## Usage
151
+
152
+ ### GUI Workflow
153
+
154
+ ![NotYAFC main window](https://raw.githubusercontent.com/ftCLI/NotYAFC/main/docs/images/notyafc-main-window.png)
155
+
156
+ 1. **Add fonts** — Use *Add files…*, *Add folder…*, or drag and drop. The scanner inspects file contents, not extensions, so it finds fonts regardless of naming.
157
+ 2. **Choose a profile** — The list shows how many scanned fonts are compatible with each conversion. Select a profile before converting; you can also choose one before adding fonts.
158
+ 3. **Select fonts** — The input table shows each font's name, format, outline type, and UPM. Right-click its header to show the optional Family and Style columns; the choice is remembered, and filtering searches those fields even when hidden. Incompatibility reasons appear beside names when space permits, in tooltips, and below the table for a selected incompatible font. Use *Select compatible fonts* or *Hide incompatible* to filter.
159
+ 4. **Set output and options** — Converted files are saved next to their sources by default. Choose a separate folder, optionally organize the output, and adjust profile-specific options. Open *Save options…* in the output card for settings shared by all conversions.
160
+ 5. **Convert** — Check the profile, selection count, and destination in the action bar, then use the fixed *Convert* button or Ctrl+Enter. Monitor progress, pause, resume, or cancel mid-run. Afterward, use *View last run* to review or export logs, or *Open output folder* to open the last conversion's output.
161
+
162
+ For variable fonts, *Variable → Static* changes the input list to a tree of fonts and instances.
163
+ Select a font or instance and use *Add custom instance…*. Right-click a custom
164
+ instance (or press Shift+F10) to edit or remove it; Delete also removes the selected custom instance.
165
+ Use *View* to expand or collapse all variable fonts.
166
+
167
+ On wider windows the font list stays beside the conversion and output controls, which scroll
168
+ independently when needed. On narrower windows these sections stack vertically.
169
+ The initial theme follows the system color scheme when available; the theme toggle saves your
170
+ preference for future launches. Focus the theme toggle and press Space or Enter to switch themes.
171
+
172
+ Existing output files are preserved by default: a conflicting name gets a numbered suffix such as
173
+ `font#1.otf`. Enable **Overwrite existing files** only when replacing existing output is intended.
174
+
175
+ ### Organize your output
176
+
177
+ Big batch, tidy folders. In the GUI, **Organize output…** lets you build a folder structure from
178
+ properties such as family, output format, outline type, UPM, tolerance, and contour simplification.
179
+ The available criteria depend on the conversion profile.
180
+
181
+ Add a folder level for each directory you want, then choose one or more criteria for it. Criteria
182
+ in the same level are joined with `_`; separate levels create nested folders. For example, putting
183
+ **Format** and **Outline type** in the first level and **UPM** in the second could produce:
184
+
185
+ ```text
186
+ opentype_ps/upm_1000/font.otf
187
+ ```
188
+
189
+ Use the arrows to reorder levels or criteria, and watch the example path update as you go. The
190
+ preview also appears below the output controls when folder levels are configured. It is
191
+ illustrative: actual folder and file names depend on the fonts and conversion settings.
192
+ Each criterion can be used once; if they're all in use, remove one before adding it elsewhere.
193
+ Without folder levels, files are saved directly in the chosen output location—alongside their
194
+ sources by default.
195
+
196
+ ### CLI Usage
197
+
198
+ ![notyafc-cli.png](https://raw.githubusercontent.com/ftCLI/NotYAFC/main/docs/images/notyafc-cli.png)
199
+
200
+ ```console
201
+ # Convert all fonts in a directory to WOFF/WOFF2
202
+ notyafc-cli ft2wf ./fonts --recursive --output-dir ./converted
203
+
204
+ # Convert TTF to OTF with custom tolerance
205
+ notyafc-cli ttf2otf ./fonts --tolerance 0.5 --no-subroutinize
206
+ ```
207
+
208
+ Run `notyafc-cli --help` or `notyafc-cli <profile> --help` for full options.
209
+ Existing output files are preserved by default; use `--overwrite` to replace them explicitly.
210
+
211
+ ## Advanced Settings
212
+
213
+ Options shared by all profiles:
214
+
215
+ - **Recalculate bounding boxes** — Rebuild glyph bounds before saving (on by default).
216
+ - **Recalculate modified timestamp** — Set a fresh modification timestamp (off by default).
217
+ - **Reorder tables on save** — Use a standard table order for compatibility (on by default).
218
+
219
+ ## Requirements
220
+
221
+ - Python 3.11+
222
+ - A desktop environment supported by Qt 6 (for the GUI)
223
+
224
+ ## Development
225
+
226
+ Clone the repository and install dependencies:
227
+
228
+ ```console
229
+ git clone https://github.com/ftCLI/NotYAFC.git
230
+ cd NotYAFC
231
+ uv sync --group dev
232
+ ```
233
+
234
+ Run the test suite:
235
+
236
+ ```console
237
+ uv run pytest
238
+ ```
239
+
240
+ The project uses `ruff` for linting/formatting and `mypy` for type checking. A coverage threshold of 90% is enforced.
241
+
242
+ For future packaging, use `src/font_converter/assets/notyafc.ico` as the Windows executable icon. On macOS, create an `.icns` from the individual icon sizes using system tools, without resampling the 512px image. On Linux, point the `.desktop` file to a 256px or 512px PNG. The ICO contains the optimized sizes up to 256px; the supplied `ico.png` is 512px.
243
+
244
+ ## License
245
+
246
+ MIT — see [LICENSE](LICENSE) for details.
247
+
248
+ ## Acknowledgments
249
+
250
+ NotYAFC is built on top of excellent open-source tools:
251
+
252
+ - [FontTools](https://github.com/fonttools/fonttools) — Font parsing and writing
253
+ - [ttfautohint](https://freedesktop.org/wiki/Software/ttfautohint/) — TrueType autohinting
254
+ - [cffsubr](https://github.com/adobe-type-tools/cffsubr) — CFF subroutinization
255
+ - [Skia pathops](https://github.com/google/skia) — Contour overlap removal and winding correction
256
+ - DeepMind Sans by Colophon Foundry (SIL Open Font License 1.1) — The icon's letter “a” outline is derived from this font
@@ -0,0 +1,34 @@
1
+ font_converter/__init__.py,sha256=kxWXXSD96ZOjMzH__nNF8xBkFCMFjdkWShJUigQZxFk,116
2
+ font_converter/__main__.py,sha256=40ROCJIK5dcLpHc9XgI-feOHkYbB7uZ9bgYxW5CT1_U,1251
3
+ font_converter/assets/ico.png,sha256=_bvSZYwpikruqtr3ekdnuCO1y9a1t7PHB6PH1Lc703s,51043
4
+ font_converter/assets/notyafc-1024.png,sha256=WbxIe_a5DPd5DphkA2uCz3jH1o1ogLXkZDoP7W9mVS0,101923
5
+ font_converter/assets/notyafc.ico,sha256=2jv1xL6cboIFoVQHJHeSQvMvdMXwbwPXy2ghEpHZnY0,40929
6
+ font_converter/assets/notyafc.svg,sha256=mw4eRza5NMzaPUns1N2fXvRVWu3YnKOVyqsU6t4nkW4,9106
7
+ font_converter/cli.py,sha256=0CUCXMGnv4XRMZngW7zFCkA87n6gT9s0FwSSpeEOEB4,15430
8
+ font_converter/constants.py,sha256=kahdCXQGYKt-SQyrqOEaqvzcTUfgBdwccmfdLqTHUhw,448
9
+ font_converter/contours.py,sha256=y8jWg65IP1jig0RJ8WVuNiAzzi1p1WJcStA4tnyJvpg,11504
10
+ font_converter/css_kit.py,sha256=BJuOCE6Q0NXWuorEybdBK4zbJvIHfrHEyoPhylQWo3s,2954
11
+ font_converter/finder.py,sha256=0F2zZPn3qyFs6TVrsXngFmOiD2ntGzvJL7g72YPDBCU,7342
12
+ font_converter/font.py,sha256=_PzPjSt6BRuZtBYKLPoX8M9oj5wUlvhvEyJqTzrircI,20203
13
+ font_converter/gui/__init__.py,sha256=0NjaCD3rzjEgzXCP7bLLLEJtTXUQtwfBSj5DstbGgbc,33
14
+ font_converter/gui/conversion_dialog.py,sha256=yZlS_7sbEgcwtu2801f4ad4nXxK7F4fckf5y_gZ6H1k,3937
15
+ font_converter/gui/file_list.py,sha256=obfme36HiIaFAdr8f7ZUMZ29oausb9k3U-XtAeyD8Uc,15091
16
+ font_converter/gui/instance_tree.py,sha256=bCUU-8XpoNPnPPOv3SIDW9dajD-g--m4DU91SGd0Ydw,22693
17
+ font_converter/gui/logs.py,sha256=8fEF6q7pvopMxnAZtSWdSSsqOTmodw5F1HZroFlqJbQ,1389
18
+ font_converter/gui/organization_dialog.py,sha256=1Jqreo-JSlxREhEXTIP5SDlZb1TurlrZ6zoOEPd2ohE,17782
19
+ font_converter/gui/profile_options.py,sha256=ImLy1WPrdmsoCNZHa2Q0Kfh0fMyNaaOlzlXGKpUyuRI,13964
20
+ font_converter/gui/profiles.py,sha256=JWtL7Y9FFCA0iKbtZk_ug91vZo9jFGz-Jazs_eYjpyo,556
21
+ font_converter/gui/scanner.py,sha256=_qawYmCREUl3FDoQmPHarAkxh_3mcZyND60HryG7Two,1477
22
+ font_converter/gui/styles.py,sha256=Ty298HBrD4uxVLdv2wVcOkCblGz7tfozMO7utdEDKsQ,16712
23
+ font_converter/gui/widgets.py,sha256=DgUCnUqXkM9WOdCSk4e3a6LqXwyvjolALTADa8xx1oU,17057
24
+ font_converter/gui/window.py,sha256=NxocStVLIBbozvWOoMlnrWzJiI93S1CWLay5PRH5FmM,77217
25
+ font_converter/inspection.py,sha256=8lTdnKDKTMqsQDGKcI7cgadO8YJmYw3y4iyz4hKsc1c,5886
26
+ font_converter/merge_curves.py,sha256=UBCeOC-7RuQWV7HfOa6CdjsdWUq8kuByNxqndgTDkxE,17997
27
+ font_converter/otf_builder.py,sha256=VA-sKuTcLSnDpsj2bPfuzHSEOH4Lpie2psJIjlHUTDQ,4668
28
+ font_converter/qu2cu.py,sha256=knoK003f5HbSqZH5TVRl3Cf4DNRyCqtxrTnrDdJIRcU,4446
29
+ font_converter/service.py,sha256=xLufxNJv2JJpM4qG9PQgJ7f_z0_71NCYeK1mngly3So,29555
30
+ font_converter/ttf_builder.py,sha256=PWvj0UtHD7aWyOVAdwPZIAEthjNVfoylI9hlDIuJPEE,3160
31
+ notyafc-1.0.0.dist-info/WHEEL,sha256=MWx7psoF7KNST9G72pGtiBYuaXRXQXBk9pw5R6FzYko,80
32
+ notyafc-1.0.0.dist-info/entry_points.txt,sha256=0ByMBksDUdc9aoNyaoATDE8uZ5LOUCiGPj2769rgiic,111
33
+ notyafc-1.0.0.dist-info/METADATA,sha256=gZ-VIVwFHYnvS_751OxtzKrpSxP9b6YirDoPhduXB2s,12942
34
+ notyafc-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.13.7
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ notyafc-cli = font_converter.cli:main
3
+
4
+ [gui_scripts]
5
+ notyafc = font_converter.__main__:main
6
+