Spaces:
Paused
Paused
| import sys | |
| from fontTools.ttLib import TTLibError, TTLibFileIsCollectionError | |
| from fontTools.ttLib.ttFont import * | |
| from fontTools.ttLib.ttCollection import TTCollection | |
| def main(args=None): | |
| """Open/save fonts with TTFont() or TTCollection() | |
| ./fonttools ttLib [-oFILE] [-yNUMBER] files... | |
| If multiple files are given on the command-line, | |
| they are each opened (as a font or collection), | |
| and added to the font list. | |
| If -o (output-file) argument is given, the font | |
| list is then saved to the output file, either as | |
| a single font, if there is only one font, or as | |
| a collection otherwise. | |
| If -y (font-number) argument is given, only the | |
| specified font from collections is opened. | |
| The above allow extracting a single font from a | |
| collection, or combining multiple fonts into a | |
| collection. | |
| If --lazy or --no-lazy are give, those are passed | |
| to the TTFont() or TTCollection() constructors. | |
| """ | |
| from fontTools import configLogger | |
| if args is None: | |
| args = sys.argv[1:] | |
| import argparse | |
| parser = argparse.ArgumentParser( | |
| "fonttools ttLib", | |
| description="Open/save fonts with TTFont() or TTCollection()", | |
| epilog=""" | |
| If multiple files are given on the command-line, | |
| they are each opened (as a font or collection), | |
| and added to the font list. | |
| The above, when combined with -o / --output, | |
| allows for extracting a single font from a | |
| collection, or combining multiple fonts into a | |
| collection. | |
| """, | |
| ) | |
| parser.add_argument("font", metavar="font", nargs="*", help="Font file.") | |
| parser.add_argument( | |
| "-t", "--table", metavar="table", nargs="*", help="Tables to decompile." | |
| ) | |
| parser.add_argument( | |
| "-o", "--output", metavar="FILE", default=None, help="Output file." | |
| ) | |
| parser.add_argument( | |
| "-y", metavar="NUMBER", default=-1, help="Font number to load from collections." | |
| ) | |
| parser.add_argument( | |
| "--lazy", action="store_true", default=None, help="Load fonts lazily." | |
| ) | |
| parser.add_argument( | |
| "--no-lazy", dest="lazy", action="store_false", help="Load fonts immediately." | |
| ) | |
| parser.add_argument( | |
| "--flavor", | |
| dest="flavor", | |
| default=None, | |
| help="Flavor of output font. 'woff' or 'woff2'.", | |
| ) | |
| options = parser.parse_args(args) | |
| fontNumber = int(options.y) if options.y is not None else None | |
| outFile = options.output | |
| lazy = options.lazy | |
| flavor = options.flavor | |
| tables = options.table if options.table is not None else ["*"] | |
| fonts = [] | |
| for f in options.font: | |
| try: | |
| font = TTFont(f, fontNumber=fontNumber, lazy=lazy) | |
| fonts.append(font) | |
| except TTLibFileIsCollectionError: | |
| collection = TTCollection(f, lazy=lazy) | |
| fonts.extend(collection.fonts) | |
| if lazy is False: | |
| for font in fonts: | |
| for table in tables if "*" not in tables else font.keys(): | |
| font[table] # Decompiles | |
| if outFile is not None: | |
| if len(fonts) == 1: | |
| fonts[0].flavor = flavor | |
| fonts[0].save(outFile) | |
| else: | |
| if flavor is not None: | |
| raise TTLibError("Cannot set flavor for collections.") | |
| collection = TTCollection() | |
| collection.fonts = fonts | |
| collection.save(outFile) | |
| if __name__ == "__main__": | |
| sys.exit(main()) | |