Metadata-Version: 2.1
Name: fez-language
Version: 1.3.4
Summary: The FEZ language: Font Engineering made eaZy
Home-page: https://github.com/simoncozens/fez
Author: Simon Cozens
Author-email: simon@simon-cozens.org
License: MIT
Platform: UNKNOWN
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Development Status :: 4 - Beta
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: AUTHORS.txt

# FEZ — Font Engineering made eaZy

![fez](fez.png)

*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:

```sh
fez2fea tests/LibertinusSans-Regular.otf test.fez
```

Results in:

```fea
@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:

```fea
@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:

```fea
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 [standard verbs documentation](https://fez.readthedocs.io/en/latest/syntax.html#standard-verbs) and the [optional plugins](https://fez.readthedocs.io/en/latest/optionalverbs.html). Writing your own plugins is as simple as [defining its grammar, verb, and adding a class with an `action()` method](https://fez.readthedocs.io/en/latest/plugins.html).

## Contributors

See the [CONTRIBUTORS.txt](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


