|GitHub Actions status| |PyPI Version| |Codecov| |Gitter Chat|
ufo2ft
======
ufo2ft ("UFO to FontTools") is a fork of
`ufo2fdk <https://github.com/typesupply/ufo2fdk>`__ whose goal is to
generate OpenType font binaries from UFOs without the FDK dependency.
The library provides two functions, ``compileOTF`` and ``compileTTF``,
which work exactly the same way:
.. code:: python
from defcon import Font
from ufo2ft import compileOTF
ufo = Font('MyFont-Regular.ufo')
otf = compileOTF(ufo)
otf.save('MyFont-Regular.otf')
In most cases, the behavior of ufo2ft should match that of ufo2fdk, whose
documentation is retained further below (and hopefully is still accurate).
Modifying the behavior of ufo2ft
--------------------------------
ufo2ft by default tries to do little more than what the UFO specification
demands. Popular font design applications that came after the specification was
made and specific workflows however may demand more. ufo2ft obeys certain keys
in a UFO's "lib", i.e. key-value pairs in the UFO's ``lib.plist`` file.
Filters (lib key: ``com.github.googlei18n.ufo2ft.filters``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Filters can modify glyphs before ("pre" = True) or after ("pre" = False)
decomposition of composite glyphs. The default is running filters after
decomposition ("pre" = False).
Example
^^^^^^^
You would insert the following into a UFO's ``lib.plist``:
.. code:: xml
<key>com.github.googlei18n.ufo2ft.filters</key>
<array>
<dict>
<key>name</key>
<string>propagateAnchors</key>
<key>pre</key>
<true />
<!-- Optionally, specify a list of glyphs to in- or exclude for
this filter (the default is to include all glyphs). "include"
and "exclude" are mutually exclusive. -->
<key>include</key>
<array>
<string>a</string>
<string>b</string>
</array>
</dict>
</array>
Or in code:
.. code:: python
from defcon import Font
from ufo2ft import compileOTF
ufo = Font("MyFont-Regular.ufo")
ufo.lib["com.github.googlei18n.ufo2ft.filters"] = [
{"name": "propagateAnchors", "pre": True, "include": ["a", "b"]}
]
otf = compileOTF(ufo)
otf.save("MyFont-Regular.otf")
Using code allows you to define an inclusion function (not available for exclusion), like so:
.. code:: python
from defcon import Font
from ufo2ft import compileOTF
def my_filter_function(glyph):
"""Include all glyphs with a Unicode value between U+007F and U+00FF."""
if glyph.unicode:
return 0x007F < glyph.unicode < 0x00FF
return False
ufo = Font("MyFont-Regular.ufo")
ufo.lib["com.github.googlei18n.ufo2ft.filters"] = [
{"name": "propagateAnchors", "pre": True, "include": my_filter_function}
]
otf = compileOTF(ufo)
otf.save("MyFont-Regular.otf")
``cubicToQuadratic``
^^^^^^^^^^^^^^^^^^^^
Converts outlines from cubic (PostScript flavor) to quadratic (TrueType flavor).
It is run by default when producing TrueType-flavored OpenType fonts. Honors the
UFO's ``com.github.googlei18n.cu2qu.curve_type`` lib key.
.. code:: xml
<key>com.github.googlei18n.ufo2ft.filters</key>
<array>
<dict>
<key>name</key>
<string>cubicToQuadratic</key>
<!-- Optionally, the filter can save the result of the conversion
to the UFO's lib key "com.github.googlei18n.cu2qu.curve_type",
which can be either "cubic" or "quadratic". Turn this off if
you want to run the filter multiple times. You can also
manually set the lib key to "quadratic" if your font is made
using quadratic curves, which saves you further explicit
configuration. -->
<key>rememberCurveType</key>
<true /> <!-- The default. -->
<!-- The conversion process is necessarily an approximation. Set
the acceptable error here, expressed in the maximum distance
between the original and converted curve, and it's relative
to the UPM of the font (default: 1/1000 or 0.001) -->
<key>conversionError</key>
<real>0.001</real> <!-- The default. -->
<!-- Cubic (PostScript flavored) curves are typically oriented
counter-clockwise, quadratic (TrueType flavored) curves are
typically oriented clockwise. Reversing the direction is
recommended. -->
<key>reverseDirection</key>
<true /> <!-- The default. -->
</dict>
</array>
When to modify the filter settings:
* You want fine-grained control over the conversion error.
* Your font is or some glyphs are drawn using quadratic curves and you want to
prevent contour direction reversal.
``decomposeComponents``
^^^^^^^^^^^^^^^^^^^^^^^
What it does...
Example...
When to use...
When not to use...
``flattenComponents``
^^^^^^^^^^^^^^^^^^^^^
What it does...
Example...
When to use...
When not to use...
``propagateAnchors``
^^^^^^^^^^^^^^^^^^^^
What it does...
Example...
When to use...
When not to use...
``removeOverlaps``
^^^^^^^^^^^^^^^^^^
What it does...
Example...
When to use...
When not to use...
``transformations``
^^^^^^^^^^^^^^^^^^^
What it does...
Example...
When to use...
When not to use...
Naming Data
-----------
As with any OpenType compiler, you have to set the font naming data to a
particular standard for your naming to be set correctly. In ufo2fdk, you
can get away with setting *two* naming attributes in your font.info
object for simple fonts:
- familyName: The name for your family. For example, "My Garamond".
- styleName: The style name for this particular font. For example,
"Display Light Italic"
ufo2fdk will create all of the other naming data based on thse two
fields. If you want to use the fully automatic naming system, all of the
other name attributes should be set to ``None`` in your font. However,
if you want to override the automated system at any level, you can
specify particular naming attributes and ufo2fdk will honor your
settings. You don't have to set *all* of the attributes, just the ones
you don't want to be automated. For example, in the family "My Garamond"
you have eight weights. It would be nice to style map the italics to the
romans for each weight. To do this, in the individual romans and
italics, you need to set the style mapping data. This is done through
the ``styleMapFamilyName`` and ``styleMapStyleName`` attributes. In each
of your roman and italic pairs you would do this:
**My Garamond-Light.ufo**
- familyName = "My Garamond"
- styleName = "Light"
- styleMapFamilyName = "My Garamond Display Light"
- styleMapStyleName = "regular"
**My Garamond-Light Italic.ufo**
- familyName = "My Garamond"
- styleName = "Display Light Italic"
- styleMapFamilyName = "My Garamond Display Light"
- styleMapStyleName = "italic"
**My Garamond-Book.ufo**
- familyName = "My Garamond"
- styleName = "Book"
- styleMapFamilyName = "My Garamond Display Book"
- styleMapStyleName = "regular"
**My Garamond-Book Italic.ufo**
- familyName = "My Garamond"
- styleName = "Display Book Italic"
- styleMapFamilyName = "My Garamond Display Book"
- styleMapStyleName = "italic"
**etc.**
Additionally, if you have defined any naming data, or any data for that
matter, in table definitions within your font's features that data will
be honored.
Feature generation
------------------
If your font's features do not contain kerning/mark/mkmk features,
ufo2ft will create them based on your font's kerning/anchor data.
In addition to
`Adobe OpenType feature files <http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html>`__,
ufo2ft also supports the
`MTI/Monotype format <http://monotype.github.io/OpenType_Table_Source/otl_source.html>`__.
For example, a GPOS table in this format would be stored within the UFO at
``data/com.github.googlei18n.ufo2ft.mtiFeatures/GPOS.mti``.
Fallbacks
---------
Most of the fallbacks have static values. To see what is set for these,
look at ``fontInfoData.py`` in the source code.
In some cases, the fallback values are dynamically generated from other
data in the info object. These are handled internally with functions.
Merging TTX
-----------
If the UFO data directory has a ``com.github.fonttools.ttx`` folder with TTX
files ending with ``.ttx``, these will be merged in the generated font.
The index TTX (generated when using using ``ttx -s``) is not required.
.. |GitHub Actions status| image:: https://github.com/googlefonts/ufo2ft/workflows/Test%20+%20Deploy/badge.svg
.. |PyPI Version| image:: https://img.shields.io/pypi/v/ufo2ft.svg
:target: https://pypi.org/project/ufo2ft/
.. |Codecov| image:: https://codecov.io/gh/googlefonts/ufo2ft/branch/master/graph/badge.svg
:target: https://codecov.io/gh/googlefonts/ufo2ft
.. |Gitter Chat| image:: https://badges.gitter.im/fonttools-dev/ufo2ft.svg
:alt: Join the chat at https://gitter.im/fonttools-dev/ufo2ft
:target: https://gitter.im/fonttools-dev/ufo2ft?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
Color fonts
~~~~~~~~~~~
ufo2ft supports building ``COLR`` and ``CPAL`` tables.
If there is ``com.github.googlei18n.ufo2ft.colorPalettes`` key in font lib, and
``com.github.googlei18n.ufo2ft.colorLayerMapping`` key in the font or
in any of the glyphs lib, then ufo2ft will build ``CPAL`` table from the color
palettes, and ``COLR`` table from the color layers.
``colorPalettes`` is a array of palettes, each palette is a array of colors and
each color is a array of floats representing RGBA colors. For example:
.. code:: xml
<key>com.github.googlei18n.ufo2ft.colorPalettes</key>
<array>
<array>
<array>
<real>0.26</real>
<real>0.0</real>
<real>0.23</real>
<real>1.0</real>
</array>
<array>
<real>0.86</real>
<real>0.73</real>
<real>0.28</real>
<real>1.0</real>
</array>
</array>
</array>
``colorLayerMapping`` is a array of color layers, each color layer is a array of
layer name and palette color index. It is a per-glyph key, but if present in
the font lib then it will be used for all glyphs that lack it. For example:
.. code:: xml
<key>com.github.googlei18n.ufo2ft.colorLayerMapping</key>
<array>
<array>
<string>color.1</string>
<integer>1</integer>
</array>
<array>
<string>color.2</string>
<integer>0</integer>
</array>
</array>
With these this key present, ufo2ft will copy the color layers into individual
glyphs and setup ``COLR`` table.
Alternatively, if the color layers are already separate UFO glyphs, the
``com.github.googlei18n.ufo2ft.colorLayers`` font lib key can be used. It uses
a table keyed by base glyph, and the value is an array of color layers, each
color layer is an array of glyph name and palette color index. For example:
.. code:: xml
<key>com.github.googlei18n.ufo2ft.colorLayers</key>
<dict>
<key>alef-ar</key>
<array>
<array>
<string>alef-ar.color0</string>
<integer>2</integer>
</array>
</array>
<key>alefHamzaabove-ar</key>
<array>
<array>
<string>alefHamzaabove-ar.color0</string>
<integer>1</integer>
</array>
<array>
<string>alefHamzaabove-ar.color1</string>
<integer>2</integer>
</array>
</array>
<dict>
Setup Notes
~~~~~~~~~~~
If you are installing ufo2ft from source, note that the strict dependency versions in `requirements.txt` are
for testing, see `setup.py`'s install_requires and extras_requires for more relaxed dependency requirements.
Raw data
{
"_id": null,
"home_page": "https://github.com/googlefonts/ufo2ft",
"name": "ufo2ft",
"maintainer": "Cosimo Lupo",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "cosimo@anthrotype.com",
"keywords": null,
"author": "Tal Leming, James Godfrey-Kittle",
"author_email": "tal@typesupply.com",
"download_url": "https://files.pythonhosted.org/packages/3c/2b/2191f6c828e714dd8f01b3ec5a2d45433256956501aa16131b48d4d19430/ufo2ft-3.6.0.tar.gz",
"platform": null,
"description": "|GitHub Actions status| |PyPI Version| |Codecov| |Gitter Chat|\n\nufo2ft\n======\n\nufo2ft (\"UFO to FontTools\") is a fork of\n`ufo2fdk <https://github.com/typesupply/ufo2fdk>`__ whose goal is to\ngenerate OpenType font binaries from UFOs without the FDK dependency.\n\nThe library provides two functions, ``compileOTF`` and ``compileTTF``,\nwhich work exactly the same way:\n\n.. code:: python\n\n from defcon import Font\n from ufo2ft import compileOTF\n ufo = Font('MyFont-Regular.ufo')\n otf = compileOTF(ufo)\n otf.save('MyFont-Regular.otf')\n\nIn most cases, the behavior of ufo2ft should match that of ufo2fdk, whose\ndocumentation is retained further below (and hopefully is still accurate).\n\nModifying the behavior of ufo2ft\n--------------------------------\n\nufo2ft by default tries to do little more than what the UFO specification\ndemands. Popular font design applications that came after the specification was\nmade and specific workflows however may demand more. ufo2ft obeys certain keys\nin a UFO's \"lib\", i.e. key-value pairs in the UFO's ``lib.plist`` file.\n\nFilters (lib key: ``com.github.googlei18n.ufo2ft.filters``)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFilters can modify glyphs before (\"pre\" = True) or after (\"pre\" = False)\ndecomposition of composite glyphs. The default is running filters after\ndecomposition (\"pre\" = False).\n\nExample\n^^^^^^^\n\nYou would insert the following into a UFO's ``lib.plist``:\n\n.. code:: xml\n\n <key>com.github.googlei18n.ufo2ft.filters</key>\n <array>\n <dict>\n <key>name</key>\n <string>propagateAnchors</key>\n <key>pre</key>\n <true />\n <!-- Optionally, specify a list of glyphs to in- or exclude for\n this filter (the default is to include all glyphs). \"include\"\n and \"exclude\" are mutually exclusive. -->\n <key>include</key>\n <array>\n <string>a</string>\n <string>b</string>\n </array>\n </dict>\n </array>\n\nOr in code:\n\n.. code:: python\n\n from defcon import Font\n from ufo2ft import compileOTF\n\n ufo = Font(\"MyFont-Regular.ufo\")\n ufo.lib[\"com.github.googlei18n.ufo2ft.filters\"] = [\n {\"name\": \"propagateAnchors\", \"pre\": True, \"include\": [\"a\", \"b\"]}\n ]\n otf = compileOTF(ufo)\n otf.save(\"MyFont-Regular.otf\")\n\nUsing code allows you to define an inclusion function (not available for exclusion), like so:\n\n.. code:: python\n\n from defcon import Font\n from ufo2ft import compileOTF\n\n def my_filter_function(glyph):\n \"\"\"Include all glyphs with a Unicode value between U+007F and U+00FF.\"\"\"\n if glyph.unicode:\n return 0x007F < glyph.unicode < 0x00FF\n return False\n\n ufo = Font(\"MyFont-Regular.ufo\")\n ufo.lib[\"com.github.googlei18n.ufo2ft.filters\"] = [\n {\"name\": \"propagateAnchors\", \"pre\": True, \"include\": my_filter_function}\n ]\n otf = compileOTF(ufo)\n otf.save(\"MyFont-Regular.otf\")\n\n``cubicToQuadratic``\n^^^^^^^^^^^^^^^^^^^^\n\nConverts outlines from cubic (PostScript flavor) to quadratic (TrueType flavor).\nIt is run by default when producing TrueType-flavored OpenType fonts. Honors the\nUFO's ``com.github.googlei18n.cu2qu.curve_type`` lib key.\n\n.. code:: xml\n\n <key>com.github.googlei18n.ufo2ft.filters</key>\n <array>\n <dict>\n <key>name</key>\n <string>cubicToQuadratic</key>\n <!-- Optionally, the filter can save the result of the conversion\n to the UFO's lib key \"com.github.googlei18n.cu2qu.curve_type\",\n which can be either \"cubic\" or \"quadratic\". Turn this off if\n you want to run the filter multiple times. You can also\n manually set the lib key to \"quadratic\" if your font is made\n using quadratic curves, which saves you further explicit\n configuration. -->\n <key>rememberCurveType</key>\n <true /> <!-- The default. -->\n <!-- The conversion process is necessarily an approximation. Set\n the acceptable error here, expressed in the maximum distance\n between the original and converted curve, and it's relative\n to the UPM of the font (default: 1/1000 or 0.001) -->\n <key>conversionError</key>\n <real>0.001</real> <!-- The default. -->\n <!-- Cubic (PostScript flavored) curves are typically oriented\n counter-clockwise, quadratic (TrueType flavored) curves are\n typically oriented clockwise. Reversing the direction is\n recommended. -->\n <key>reverseDirection</key>\n <true /> <!-- The default. -->\n </dict>\n </array>\n\nWhen to modify the filter settings: \n\n* You want fine-grained control over the conversion error.\n* Your font is or some glyphs are drawn using quadratic curves and you want to\n prevent contour direction reversal.\n\n``decomposeComponents``\n^^^^^^^^^^^^^^^^^^^^^^^\n\nWhat it does...\n\nExample...\n\nWhen to use...\n\nWhen not to use...\n\n``flattenComponents``\n^^^^^^^^^^^^^^^^^^^^^\n\nWhat it does...\n\nExample...\n\nWhen to use...\n\nWhen not to use...\n\n``propagateAnchors``\n^^^^^^^^^^^^^^^^^^^^\n\nWhat it does...\n\nExample...\n\nWhen to use...\n\nWhen not to use...\n\n``removeOverlaps``\n^^^^^^^^^^^^^^^^^^\n\nWhat it does...\n\nExample...\n\nWhen to use...\n\nWhen not to use...\n\n``transformations``\n^^^^^^^^^^^^^^^^^^^\n\nWhat it does...\n\nExample...\n\nWhen to use...\n\nWhen not to use...\n\nNaming Data\n-----------\n\nAs with any OpenType compiler, you have to set the font naming data to a\nparticular standard for your naming to be set correctly. In ufo2fdk, you\ncan get away with setting *two* naming attributes in your font.info\nobject for simple fonts:\n\n- familyName: The name for your family. For example, \"My Garamond\".\n- styleName: The style name for this particular font. For example,\n \"Display Light Italic\"\n\nufo2fdk will create all of the other naming data based on thse two\nfields. If you want to use the fully automatic naming system, all of the\nother name attributes should be set to ``None`` in your font. However,\nif you want to override the automated system at any level, you can\nspecify particular naming attributes and ufo2fdk will honor your\nsettings. You don't have to set *all* of the attributes, just the ones\nyou don't want to be automated. For example, in the family \"My Garamond\"\nyou have eight weights. It would be nice to style map the italics to the\nromans for each weight. To do this, in the individual romans and\nitalics, you need to set the style mapping data. This is done through\nthe ``styleMapFamilyName`` and ``styleMapStyleName`` attributes. In each\nof your roman and italic pairs you would do this:\n\n**My Garamond-Light.ufo**\n\n- familyName = \"My Garamond\"\n- styleName = \"Light\"\n- styleMapFamilyName = \"My Garamond Display Light\"\n- styleMapStyleName = \"regular\"\n\n**My Garamond-Light Italic.ufo**\n\n- familyName = \"My Garamond\"\n- styleName = \"Display Light Italic\"\n- styleMapFamilyName = \"My Garamond Display Light\"\n- styleMapStyleName = \"italic\"\n\n**My Garamond-Book.ufo**\n\n- familyName = \"My Garamond\"\n- styleName = \"Book\"\n- styleMapFamilyName = \"My Garamond Display Book\"\n- styleMapStyleName = \"regular\"\n\n**My Garamond-Book Italic.ufo**\n\n- familyName = \"My Garamond\"\n- styleName = \"Display Book Italic\"\n- styleMapFamilyName = \"My Garamond Display Book\"\n- styleMapStyleName = \"italic\"\n\n**etc.**\n\nAdditionally, if you have defined any naming data, or any data for that\nmatter, in table definitions within your font's features that data will\nbe honored.\n\n\nFeature generation\n------------------\n\nIf your font's features do not contain kerning/mark/mkmk features,\nufo2ft will create them based on your font's kerning/anchor data.\n\nIn addition to\n`Adobe OpenType feature files <http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html>`__,\nufo2ft also supports the\n`MTI/Monotype format <http://monotype.github.io/OpenType_Table_Source/otl_source.html>`__.\nFor example, a GPOS table in this format would be stored within the UFO at\n``data/com.github.googlei18n.ufo2ft.mtiFeatures/GPOS.mti``.\n\n\nFallbacks\n---------\n\nMost of the fallbacks have static values. To see what is set for these,\nlook at ``fontInfoData.py`` in the source code.\n\nIn some cases, the fallback values are dynamically generated from other\ndata in the info object. These are handled internally with functions.\n\nMerging TTX\n-----------\n\nIf the UFO data directory has a ``com.github.fonttools.ttx`` folder with TTX\nfiles ending with ``.ttx``, these will be merged in the generated font.\nThe index TTX (generated when using using ``ttx -s``) is not required.\n\n.. |GitHub Actions status| image:: https://github.com/googlefonts/ufo2ft/workflows/Test%20+%20Deploy/badge.svg\n.. |PyPI Version| image:: https://img.shields.io/pypi/v/ufo2ft.svg\n :target: https://pypi.org/project/ufo2ft/\n.. |Codecov| image:: https://codecov.io/gh/googlefonts/ufo2ft/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/googlefonts/ufo2ft\n.. |Gitter Chat| image:: https://badges.gitter.im/fonttools-dev/ufo2ft.svg\n :alt: Join the chat at https://gitter.im/fonttools-dev/ufo2ft\n :target: https://gitter.im/fonttools-dev/ufo2ft?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n\nColor fonts\n~~~~~~~~~~~\n\nufo2ft supports building ``COLR`` and ``CPAL`` tables.\n\nIf there is ``com.github.googlei18n.ufo2ft.colorPalettes`` key in font lib, and\n``com.github.googlei18n.ufo2ft.colorLayerMapping`` key in the font or\nin any of the glyphs lib, then ufo2ft will build ``CPAL`` table from the color\npalettes, and ``COLR`` table from the color layers.\n\n``colorPalettes`` is a array of palettes, each palette is a array of colors and\neach color is a array of floats representing RGBA colors. For example:\n\n.. code:: xml\n\n <key>com.github.googlei18n.ufo2ft.colorPalettes</key>\n <array>\n <array>\n <array>\n <real>0.26</real>\n <real>0.0</real>\n <real>0.23</real>\n <real>1.0</real>\n </array>\n <array>\n <real>0.86</real>\n <real>0.73</real>\n <real>0.28</real>\n <real>1.0</real>\n </array>\n </array>\n </array>\n\n\n``colorLayerMapping`` is a array of color layers, each color layer is a array of\nlayer name and palette color index. It is a per-glyph key, but if present in\nthe font lib then it will be used for all glyphs that lack it. For example:\n\n.. code:: xml\n\n <key>com.github.googlei18n.ufo2ft.colorLayerMapping</key>\n <array>\n <array>\n <string>color.1</string>\n <integer>1</integer>\n </array>\n <array>\n <string>color.2</string>\n <integer>0</integer>\n </array>\n </array>\n\nWith these this key present, ufo2ft will copy the color layers into individual\nglyphs and setup ``COLR`` table.\n\nAlternatively, if the color layers are already separate UFO glyphs, the\n``com.github.googlei18n.ufo2ft.colorLayers`` font lib key can be used. It uses\na table keyed by base glyph, and the value is an array of color layers, each\ncolor layer is an array of glyph name and palette color index. For example:\n\n.. code:: xml\n\n <key>com.github.googlei18n.ufo2ft.colorLayers</key>\n <dict>\n <key>alef-ar</key>\n <array>\n <array>\n <string>alef-ar.color0</string>\n <integer>2</integer>\n </array>\n </array>\n <key>alefHamzaabove-ar</key>\n <array>\n <array>\n <string>alefHamzaabove-ar.color0</string>\n <integer>1</integer>\n </array>\n <array>\n <string>alefHamzaabove-ar.color1</string>\n <integer>2</integer>\n </array>\n </array>\n <dict>\n\nSetup Notes\n~~~~~~~~~~~\n\nIf you are installing ufo2ft from source, note that the strict dependency versions in `requirements.txt` are\nfor testing, see `setup.py`'s install_requires and extras_requires for more relaxed dependency requirements.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A bridge between UFOs and FontTools.",
"version": "3.6.0",
"project_urls": {
"Homepage": "https://github.com/googlefonts/ufo2ft"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c4d2f6bd6937870db2117a354541400cd640c6404386b4e874aa7e63052504f2",
"md5": "e5c612c5d275c84e5fb4af169326b607",
"sha256": "0a1781eeb3236d06f4a69a27bedc4ef61024a06a5930bb47bd9908c1ae22047f"
},
"downloads": -1,
"filename": "ufo2ft-3.6.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "e5c612c5d275c84e5fb4af169326b607",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.9",
"size": 163375,
"upload_time": "2025-07-25T16:38:26",
"upload_time_iso_8601": "2025-07-25T16:38:26.472459Z",
"url": "https://files.pythonhosted.org/packages/c4/d2/f6bd6937870db2117a354541400cd640c6404386b4e874aa7e63052504f2/ufo2ft-3.6.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3c2b2191f6c828e714dd8f01b3ec5a2d45433256956501aa16131b48d4d19430",
"md5": "451bea138970691987813a54a4daec3f",
"sha256": "84aa938c3f1c4e0cb11d99daa233c04f9258d75a24bcb88d3a77a6a142e7a66c"
},
"downloads": -1,
"filename": "ufo2ft-3.6.0.tar.gz",
"has_sig": false,
"md5_digest": "451bea138970691987813a54a4daec3f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 435545,
"upload_time": "2025-07-25T16:38:28",
"upload_time_iso_8601": "2025-07-25T16:38:28.222248Z",
"url": "https://files.pythonhosted.org/packages/3c/2b/2191f6c828e714dd8f01b3ec5a2d45433256956501aa16131b48d4d19430/ufo2ft-3.6.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-25 16:38:28",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "googlefonts",
"github_project": "ufo2ft",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [
{
"name": "fonttools",
"specs": [
[
"==",
"4.58.5"
]
]
},
{
"name": "defcon",
"specs": [
[
"==",
"0.10.3"
]
]
},
{
"name": "compreffor",
"specs": [
[
"==",
"0.5.6"
]
]
},
{
"name": "booleanOperations",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "cffsubr",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "skia-pathops",
"specs": [
[
"==",
"0.8.0.post2"
]
]
},
{
"name": "fontMath",
"specs": [
[
"==",
"0.9.4"
]
]
},
{
"name": "ufoLib2",
"specs": [
[
"==",
"0.17.1"
]
]
}
],
"tox": true,
"lcname": "ufo2ft"
}