Headless FontLab

FakeLab installs a fakelab command line script that allows running (something like) FontLab Studio without GUI, and basically offers two different modes of operation.

This is the help for the fakelab command:

% fakelab -h
usage: fakelab [-h] [-o OUT_PATH] [-d] [-r] [-s SCRIPT [SCRIPT ...]] [-v] [vfb ...]

FontLab 5 external scripting

positional arguments:
vfb                   Path(s) to VFB file(s) to operate on. The last file will be the current font

options:
-h, --help            show this help message and exit
-o, --out-path OUT_PATH
                        Save files to output path instead of overwriting the original files
-d, --no-decompile    When roundtripping, don't decompile entries in JSON file
-r, --roundtrip       Roundtrip specified VFB file(s) through FakeLab, then exit
-s, --script SCRIPT [SCRIPT ...]
                        Path(s) to Python script(s) to run on the VFB file(s). The program exits after running the script(s)
-v, --verbose         Verbose output

The –no-decompile and –roundtrip options are of limited utility, they can be used for debugging, i.e. comparing the input and output files to see if the data is handled correctly.

Running external Python scripts

When one or more -s/–script arguments are present, fakelab is run in “script mode”. That means, any specified VFBs are opened, the Python script(s) at the path(s) are loaded and executed, and the program exits.

Note

I think I planned to auto-save the VFBs on exit, either overwriting the originals, or, when the -o/–out-path arguments are specified, saving them in that path. This is not implemented yet, so if you want to keep your changes, you need to save the VFBs yourself using Font().Save(path_to_vfb) on each modified font.

Interactive console

If no external script is specified, the program runs as an interactive console. That means, it opens the specified VFB file(s) (if any) and shows you a prompt that you can use to interact with the app using Python commands.

When the fakelab package has been installed with the repl extra, or ptpython or ipython is installed in the environment, they are used to improve the console experience with autocompletion, history, and other niceties. If both are installed, ptpython is preferred.

See ptpython or ipython for more information on those packages.

Limitations

Did I mention that only a small part of all FontLab Studio 5 Python API methods is implemented? I plan to add them as needed, or you can help with that.

Generating fonts

When FakeLab is installed with the generate extra, or the ufo2ft package is installed in the Python environment, FakeLab can generate actual fonts.

This is achieved by converting the internal Font object to UFO(s) using the VfbToUfoBuilder from vfbLib, and then generating binary fonts with compileOTF or compileTTF from ufo2ft.

Note that those generated fonts won’t be binary-compatible with those generated from the actual FLS5.

  • FontLab’s high-level TrueType commands are not compiled to TrueType bytecode, which ufo2ft would pick up

  • ufo2ft does not output PostScript hinting present in the UFO

  • Interpolation is not supported

  • OpenType layout features are compiled by fontTools.feaLib instead of the AFDKO.