| from fontTools.ttLib import TTFont |
| from fontTools.feaLib.builder import addOpenTypeFeatures, Builder |
| from fontTools.feaLib.error import FeatureLibError |
| from fontTools import configLogger |
| from fontTools.misc.cliTools import makeOutputFileName |
| import sys |
| import argparse |
| import logging |
| |
| |
| log = logging.getLogger("fontTools.feaLib") |
| |
| |
| def main(args=None): |
| """Add features from a feature file (.fea) into a OTF font""" |
| parser = argparse.ArgumentParser( |
| description="Use fontTools to compile OpenType feature files (*.fea)." |
| ) |
| parser.add_argument( |
| "input_fea", metavar="FEATURES", help="Path to the feature file" |
| ) |
| parser.add_argument( |
| "input_font", metavar="INPUT_FONT", help="Path to the input font" |
| ) |
| parser.add_argument( |
| "-o", |
| "--output", |
| dest="output_font", |
| metavar="OUTPUT_FONT", |
| help="Path to the output font.", |
| ) |
| parser.add_argument( |
| "-t", |
| "--tables", |
| metavar="TABLE_TAG", |
| choices=Builder.supportedTables, |
| nargs="+", |
| help="Specify the table(s) to be built.", |
| ) |
| parser.add_argument( |
| "-d", |
| "--debug", |
| action="store_true", |
| help="Add source-level debugging information to font.", |
| ) |
| parser.add_argument( |
| "-v", |
| "--verbose", |
| help="increase the logger verbosity. Multiple -v " "options are allowed.", |
| action="count", |
| default=0, |
| ) |
| parser.add_argument( |
| "--traceback", help="show traceback for exceptions.", action="store_true" |
| ) |
| options = parser.parse_args(args) |
| |
| levels = ["WARNING", "INFO", "DEBUG"] |
| configLogger(level=levels[min(len(levels) - 1, options.verbose)]) |
| |
| output_font = options.output_font or makeOutputFileName(options.input_font) |
| log.info("Compiling features to '%s'" % (output_font)) |
| |
| font = TTFont(options.input_font) |
| try: |
| addOpenTypeFeatures( |
| font, options.input_fea, tables=options.tables, debug=options.debug |
| ) |
| except FeatureLibError as e: |
| if options.traceback: |
| raise |
| log.error(e) |
| font.save(output_font) |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |