human-friendly font operations.
Project description
python-fontbro
friendly font operations. :billed_cap:
Index
Installation
pip install python-fontbro
Usage
Just import the font class:
from fontbro import Font
font = Font('fonts/MyFont.ttf')
Methods
get_characters
get_characters_count
get_features
get_format
get_name
get_names
get_script_by_character
get_script_by_code
get_scripts
get_style_flags
get_ttfont
get_variable_axes
get_variable_axis_by_tag
get_variable_axes_tags
get_variable_instances
get_variable_instance_closest_to_coordinates
get_weight
get_width
is_static
is_variable
save
save_as_woff
save_as_woff2
set_name
set_names
set_style_flags
subset
to_sliced_variable
to_static
-
get_characters
"""
Gets the font characters.
:returns: The characters.
:rtype: generator of dicts
"""
chars = font.get_characters()
-
get_characters_count
"""
Gets the font characters count.
:returns: The characters count.
:rtype: int
"""
chars_count = font.get_characters_count()
-
get_features
"""
Gets the font opentype features.
:returns: The features.
:rtype: list of dict
"""
features = font.get_features()
-
get_format
"""
Gets the font format: otf, ttf, woff, woff2.
:param ignore_flavor: If True, the original format without compression will be returned.
:type ignore_flavor: bool
:returns: The format.
:rtype: str or None
"""
format = font.get_format(ignore_flavor=False)
-
get_name
"""
Gets the name by its identifier from the font name table.
:param key: The name id or key (eg. 'family_name')
:type key: int or str
:returns: The name.
:rtype: str or None
:raises KeyError: if the key is not a valid name key/id
"""
family_name = font.get_name(key=Font.NAME_FAMILY_NAME)
-
get_names
"""
Gets the names records mapped by their property name.
:returns: The names.
:rtype: dict
"""
names = font.get_names()
-
get_script_by_character
"""
Gets the script by character.
:param char: The character
:type char: str
:returns: The script by character.
:rtype: dict
"""
script = font.get_script_by_character(char='a')
-
get_script_by_code
"""
Gets the script by unicode code point.
:param code: The code
:type code: int
:returns: The script by code.
:rtype: dict
"""
script = font.get_script_by_code(code=34)
-
get_scripts
"""
Gets the scripts supported by the font.
:returns: The scripts.
:rtype: list of dict
"""
scripts = font.get_scripts()
-
get_style_flags
"""
Gets the style flags reading OS/2 and macStyle tables.
:returns: The dict representing the style flags.
:rtype: dict
"""
flags = font.get_style_flags()
-
get_ttfont
"""
Gets the wrapped TTFont instance.
:returns: The TTFont instance.
:rtype: TTFont
"""
ttfont = font.get_ttfont()
-
get_variable_axes
"""
Gets the font variable axes.
:returns: The list of axes if the font is a variable font otherwise None.
:rtype: list of dict or None
"""
axes = font.get_variable_axes()
-
get_variable_axis_by_tag
"""
Gets a variable axis by tag.
:param tag: The tag
:type tag: string
:returns: The variable axis by tag.
:rtype: dict or None
"""
axis = font.get_variable_axis_by_tag(tag='wght')
-
get_variable_axes_tags
"""
Gets the variable axes tags.
:returns: The variable axis tags.
:rtype: list or None
"""
axes_tags = font.get_variable_axes_tags()
-
get_variable_instances
"""
Gets the variable instances.
:returns: The list of instances if the font is a variable font otherwise None.
:rtype: list of dict or None
"""
instances = font.get_variable_instances()
-
get_variable_instance_closest_to_coordinates
"""
Gets the variable instance closest to coordinates.
eg. coordinates = {'wght': 1000, 'slnt': 815, 'wdth': 775}
:param coordinates: The coordinates
:type coordinates: dict
:returns: The variable instance closest to coordinates.
:rtype: dict or None
"""
instance = font.get_variable_instance_closest_to_coordinates(coordinates={'wght': 1000, 'slnt': 815, 'wdth': 775})
-
get_weight
"""
Gets the font weight value and name.
:returns: The weight name and value.
:rtype: dict or None
"""
weight = font.get_weight()
-
get_width
"""
Gets the font width value and name.
:returns: The width name and value.
:rtype: dict or None
"""
width = font.get_width()
-
is_static
"""
Determines if the font is a static font.
:returns: True if static font, False otherwise.
:rtype: bool
"""
static = font.is_static()
-
is_variable
"""
Determines if the font is a variable font.
:returns: True if variable font, False otherwise.
:rtype: bool
"""
variable = font.is_variable()
-
save
"""
Saves the font at filepath.
:param filepath: The filepath, if None the source filepath will be used
:type filepath: str or None
:param overwrite: The overwrite, if True the source font file can be overwritten
:type overwrite: bool
:returns: The filepath where the font has been saved to.
:rtype: str
:raises ValueError: If the filepath is the same of the source font and overwrite is not allowed.
"""
saved_font_path = font.save(filepath=None, overwrite=False)
-
save_as_woff
"""
Saves font as woff.
:param filepath: The filepath
:type filepath: str
:param overwrite: The overwrite, if True the source font file can be overwritten
:type overwrite: bool
:returns: The filepath where the font has been saved to.
:rtype: str
"""
saved_font_path = font.save_as_woff()
-
save_as_woff2
"""
Saves font as woff2.
:param filepath: The filepath
:type filepath: str
:param overwrite: The overwrite, if True the source font file can be overwritten
:type overwrite: bool
:returns: The filepath where the font has been saved to.
:rtype: str
"""
saved_font_path = font.save_as_woff2()
-
set_name
"""
Sets the name by its identifier in the font name table.
:param key: The name id or key (eg. 'family_name')
:type key: int or str
:param value: The value
:type value: str
:raises KeyError: if the key is not a valid name key/id
"""
font.set_name(Font.NAME_FAMILY_NAME, 'Family Name Renamed')
-
set_names
"""
Sets the names by their identifier in the name table.
:param names: The names
:type names: dict
"""
font.set_names(names={
Font.NAME_FAMILY_NAME: 'Family Name Renamed',
Font.NAME_SUBFAMILY_NAME: 'Regular Renamed',
})
-
set_style_flags
"""
Sets the style flags, flags set to None will be ignored.
:param bold: The bold flag value.
:type bold: bool or None
:param italic: The italic flag value.
:type italic: bool or None
:param underline: The underline flag value.
:type underline: bool or None
:param outline: The outline flag value.
:type outline: bool or None
"""
font.set_style_flags(regular=None, bold=None, italic=None, outline=None, underline=None)
-
subset
"""
Subsets the font using the given options (unicodes or glyphs or text),
it is possible to pass also subsetter options, more info here:
https://github.com/fonttools/fonttools/blob/main/Lib/fontTools/subset/__init__.py
:param unicodes: The unicodes
:type unicodes: str or list
:param glyphs: The glyphs
:type glyphs: list
:param text: The text
:type text: str
:param options: The subsetter options
:type options: dict
"""
font.subset(unicodes='', glyphs=[], text='', **options)
-
to_sliced_variable
"""
Converts the variable font to a partial one slicing the variable axes at the given coordinates.
If an axis value is not specified, the axis will be left untouched.
If an axis min and max values are equal, the axis will be pinned.
:param coordinates: The coordinates dictionary, each item value must be tuple/list/dict (with min and max keys) for slicing or float/int for pinning, eg.
{'wdth':100, 'wght':(100,600), 'ital':(30,70)} or
{'wdth':100, 'wght':[100,600], 'ital':[30,70]} or
{'wdth':100, 'wght':{'min':100,'max':600}, 'ital':{'min':30,'max':70}}
:type coordinates: dict
:param options: The options for the fontTools.varLib.instancer
:type options: dictionary
:raises TypeError: If the font is not a variable font
:raises ValueError: If the coordinates are not defined (empty)
:raises ValueError: If the coordinates axes are all pinned
"""
font.to_sliced_variable(coordinates, **options)
-
to_static
"""
Converts the variable font to a static one pinning the variable axes at the given coordinates.
If an axis value is not specified, the axis will be pinned at its default value.
If coordinates are not specified each axis will be pinned at its default value.
:param coordinates: The coordinates, eg. {'wght':500, 'ital':50}
:type coordinates: dict or None
:param options: The options for the fontTools.varLib.instancer
:type options: dictionary
:raises TypeError: If the font is not a variable font
:raises ValueError: If the coordinates axes are not all pinned
"""
font.to_static(coordinates=None, **options)
Testing
# create python virtual environment
virtualenv testing_fontbro
# activate virtualenv
cd testing_fontbro && . bin/activate
# clone repo
git clone https://github.com/fabiocaccamo/python-fontbro.git src && cd src
# install requirements
pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-test.txt
# run tests using tox
tox
# or run tests using unittest
python -m unittest
# or run tests using setuptools
python setup.py test
License
Released under MIT License.
See also
python-benedict
- dict subclass with keylist/keypath support, I/O shortcuts (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) and many utilities. 📘python-fsutil
- file-system utilities for lazy devs. 🧟♂️
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
python-fontbro-0.1.0.tar.gz
(18.4 kB
view details)
Built Distribution
File details
Details for the file python-fontbro-0.1.0.tar.gz
.
File metadata
- Download URL: python-fontbro-0.1.0.tar.gz
- Upload date:
- Size: 18.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/56.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1338ce3d0d1217911684500ce98407dfaadc1d9e5d323e5b17f52a8186b0472a |
|
MD5 | 93935b9582b021b7ceb05256be8a2aa3 |
|
BLAKE2b-256 | b6dd32a856c4b118c661766a2c8d50427e2a3ab117d311b1a079a381898bfb35 |
File details
Details for the file python_fontbro-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: python_fontbro-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/56.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c8410690343c9a27ad17699c815a32ddd77fc03584e3114b33397bc8d7719afc |
|
MD5 | 6a78981625dbfeecac579c5b24518cf6 |
|
BLAKE2b-256 | 98d7591d3961df656bd37b95fdddbf1a216de3e09a7722af679d3b899cc13c50 |