The FEZ language: Font Engineering made eaZy
Project description
FEZ — Font Engineering made eaZy
I wear a fez now. Fezzes are cool.
The FEZ language is implemented via a Python library, fontFeatures
. This format improves over Adobe FEA (.fea
) in several important ways, and compiles to FEA or to raw GPOS/GSUB binary tables.
FEZ Quickstart
Class definition is a time consuming element of writing FEA code. FEZ allows regular expressions to be used to define classes; each glyph name in the font is tested against the regular expression, and the glyphs added:
DefineClass @sc = /\.sc$/;
Ran as:
fez2fea tests/LibertinusSans-Regular.otf test.fez
Results in:
@sc = [parenleft.sc parenright.sc bracketleft.sc bracketright.sc ...];
Simple replacement can be done as easily as:
DefineClass @sc = /\.sc$/;
DefineClass @sc_able = @sc~sc;
Feature smcp {
Substitute @sc_able -> @sc;
};
Quite complex classes can be built. All the glyphs which have a smallcap and alternate form:
DefineClass @sc_and_alt_able = /.*/ and hasglyph(/$/ .alt) and hasglyph(/$/ .sc);
Returning:
@sc_and_alt_able = [h y germandbls];
FEZ can even do substitutions impossible in FEA. For example:
DefineClass @digits = U+0031=>U+0039; # this is range(U+0031, U+0039) inclusive
DefineClass @encircled = U+2474=>U+247C;
# Un-CJK parenthesize
Feature ss01 {
Substitute @encircled -> parenleft @digits parenright;
};
Gives us:
feature ss01 {
lookup Routine_1 {
sub uni2474 by parenleft one parenright;
sub uni2475 by parenleft two parenright;
sub uni2476 by parenleft three parenright;
sub uni2477 by parenleft four parenright;
sub uni2478 by parenleft five parenright;
sub uni2479 by parenleft six parenright;
sub uni247A by parenleft seven parenright;
sub uni247B by parenleft eight parenright;
sub uni247C by parenleft nine parenright;
} Routine_1;
} ss01;
FEZ can do much more; see the plugins documentation. Writing your own plugins is as simple as defining its grammar, verb, and adding a class with an action()
method.
Contributors
See the CONTRIBUTORS.txt file for the full list of contributors. Major contributions are described below:
- FEZ was originally written by Simon Cozens
- Fred Brennan contributed a new parser and documentation updates
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file fez-language-1.3.0.tar.gz
.
File metadata
- Download URL: fez-language-1.3.0.tar.gz
- Upload date:
- Size: 38.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fe6c234633a675bd6d386559dcc1995961faa5d5c4cc73e39504f44756a424fe |
|
MD5 | 4a115a42bc404e85170f53ed886bd16a |
|
BLAKE2b-256 | 3dc91d78cfd8ceb8c4075940b6850b6d38ffe99528a4c8598f88efc614f95623 |
File details
Details for the file fez_language-1.3.0-py3-none-any.whl
.
File metadata
- Download URL: fez_language-1.3.0-py3-none-any.whl
- Upload date:
- Size: 48.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7dc1efcdf8b2f5ce4ba01ba0b53248eea7d5cf3ec4e80126d38958a35655b7cc |
|
MD5 | 8c9e01f48269194d15667843e11d640d |
|
BLAKE2b-256 | 9cbd9c4a9a3671fc9f1799123d7f605fe722420322f4bf77e4c10a4b66fb08c8 |