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 an 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) sys.exit(1) font.save(output_font) if __name__ == "__main__": sys.exit(main())