def main(args=None): configLogger(logger=log) parser = argparse.ArgumentParser() parser.add_argument("input", nargs='+', metavar="INPUT") parser.add_argument("-o", "--output") parser.add_argument("-e", "--max-error", type=float, default=MAX_ERR) parser.add_argument("--post-format", type=float, default=POST_FORMAT) parser.add_argument("--keep-direction", dest='reverse_direction', action='store_false') parser.add_argument("--face-index", type=int, default=0) parser.add_argument("--overwrite", action='store_true') options = parser.parse_args(args) if options.output and len(options.input) > 1: if not os.path.isdir(options.output): parser.error("-o/--output option must be a directory when " "processing multiple fonts") for path in options.input: if options.output and not os.path.isdir(options.output): output = options.output else: output = makeOutputFileName(path, outputDir=options.output, extension='.ttf', overWrite=options.overwrite) font = TTFont(path, fontNumber=options.face_index) otf_to_ttf(font, post_format=options.post_format, max_err=options.max_error, reverse_direction=options.reverse_direction) font.save(output)
def run(path, options): try: font = TTFont(path, fontNumber=options.face_index) extension = '.ttf' except TTLibError: font = TTCollection(path) extension = '.ttc' if options.output and not os.path.isdir(options.output): output = options.output else: output = makeOutputFileName(path, outputDir=options.output, extension=extension, overWrite=options.overwrite) try: otf_to_ttf(font, post_format=options.post_format, max_err=options.max_error, reverse_direction=options.reverse_direction) except TTLibError as warn: log.warning(f'"{path}" cannot be converted since it is {warn}.') else: font.save(output)
def main(args=None): configLogger(logger=log) parser = argparse.ArgumentParser() parser.add_argument("input", nargs='+', metavar="INPUT") parser.add_argument("-o", "--output") parser.add_argument("-e", "--max-error", type=float, default=MAX_ERR) parser.add_argument("--post-format", type=float, default=POST_FORMAT) parser.add_argument( "--keep-direction", dest='reverse_direction', action='store_false') parser.add_argument("--face-index", type=int, default=0) parser.add_argument("--overwrite", action='store_true') options = parser.parse_args(args) if options.output and len(options.input) > 1: if not os.path.isdir(options.output): parser.error("-o/--output option must be a directory when " "processing multiple fonts") for path in options.input: if options.output and not os.path.isdir(options.output): output = options.output else: output = makeOutputFileName(path, outputDir=options.output, extension='.ttf', overWrite=options.overwrite) font = TTFont(path, fontNumber=options.face_index) otf_to_ttf(font, post_format=options.post_format, max_err=options.max_error, reverse_direction=options.reverse_direction) font.save(output)
def main(args=None): 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( "-v", "--verbose", help="increase the logger verbosity. Multiple -v " "options are allowed.", action="count", default=0) 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) addOpenTypeFeatures(font, options.input_fea, tables=options.tables) font.save(output_font)
def processIO(paths): if not os.path.exists(paths.inputFile): print("ERROR: Input font file does not exist.", file = sys.stderr) sys.exit(2) elif getFontType(paths.inputFile) is None: print("ERROR: Invalid font file. Only TTF and OTF are supported.", file = sys.stderr) sys.exit(1) else: pass if paths.configFile and not os.path.exists(paths.configFile): print("ERROR: Config TOML file does not exist.", file = sys.stderr) sys.exit(2) if paths.outputFile is None: paths.outputFile = makeOutputFileName(paths.inputFile) elif not os.path.exists(os.path.dirname(os.path.realpath(paths.outputFile))): print("ERROR: Output location does not exist.", file = sys.stderr) sys.exit(2) else: paths.outputFile = makeOutputFileName(paths.outputFile) return
def main(args=None): parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument("-s", "--suffix", required=True) parser.add_argument("input_fonts", metavar="FONTFILE", nargs="+") output_group = parser.add_mutually_exclusive_group() output_group.add_argument("-i", "--inplace", action="store_true") output_group.add_argument("-d", "--output-dir") output_group.add_argument("-o", "--output-file") parser.add_argument("-R", "--rename-files", action="store_true") parser.add_argument("-v", "--verbose", action="count", default=0) options = parser.parse_args(args) if not options.verbose: level = "WARNING" elif options.verbose == 1: level = "INFO" else: level = "DEBUG" logging.basicConfig(level=level, format="%(message)s") if options.output_file and len(options.input_fonts) > 1: parser.error( "argument -o/--output-file can't be used with multiple inputs") if options.rename_files and (options.inplace or options.output_file): parser.error("argument -R not allowed with arguments -i or -o") for input_name in options.input_fonts: logger.info("Renaming font: '%s'", input_name) font = TTFont(input_name) family_name = add_family_suffix(font, options.suffix) if options.inplace: output_name = input_name elif options.output_file: output_name = options.output_file else: if options.rename_files: input_name = rename_file(input_name, family_name, options.suffix) output_name = makeOutputFileName(input_name, options.output_dir) font.save(output_name) logger.info("Saved font: '%s'", output_name) font.close() del font logger.info("Done!")
def parseOptions(args): rawOptions, files = getopt.getopt(args, "ld:o:fvqht:x:sgim:z:baey:", [ 'unicodedata=', "recalc-timestamp", "no-recalc-timestamp", 'flavor=', 'version', 'with-zopfli', 'newline=' ]) options = Options(rawOptions, len(files)) jobs = [] if not files: raise getopt.GetoptError('Must specify at least one input file') for input in files: if not os.path.isfile(input): raise getopt.GetoptError('File not found: "%s"' % input) tp = guessFileType(input) if tp in ("OTF", "TTF", "TTC", "WOFF", "WOFF2"): extension = ".ttx" if options.listTables: action = ttList else: action = ttDump elif tp == "TTX": extension = "." + options.flavor if options.flavor else ".ttf" action = ttCompile elif tp == "OTX": extension = "." + options.flavor if options.flavor else ".otf" action = ttCompile else: raise getopt.GetoptError('Unknown file type: "%s"' % input) if options.outputFile: output = options.outputFile else: output = makeOutputFileName(input, options.outputDir, extension, options.overWrite) # 'touch' output file to avoid race condition in choosing file names if action != ttList: open(output, 'a').close() jobs.append((action, input, output)) return jobs, options
def parseOptions(args): rawOptions, files = getopt.getopt(args, "ld:o:fvqht:x:sgim:z:baey:", ['unicodedata=', "recalc-timestamp", "no-recalc-timestamp", 'flavor=', 'version', 'with-zopfli', 'newline=']) options = Options(rawOptions, len(files)) jobs = [] if not files: raise getopt.GetoptError('Must specify at least one input file') for input in files: if not os.path.isfile(input): raise getopt.GetoptError('File not found: "%s"' % input) tp = guessFileType(input) if tp in ("OTF", "TTF", "TTC", "WOFF", "WOFF2"): extension = ".ttx" if options.listTables: action = ttList else: action = ttDump elif tp == "TTX": extension = "."+options.flavor if options.flavor else ".ttf" action = ttCompile elif tp == "OTX": extension = "."+options.flavor if options.flavor else ".otf" action = ttCompile else: raise getopt.GetoptError('Unknown file type: "%s"' % input) if options.outputFile: output = options.outputFile else: output = makeOutputFileName(input, options.outputDir, extension, options.overWrite) # 'touch' output file to avoid race condition in choosing file names if action != ttList: open(output, 'a').close() jobs.append((action, input, output)) return jobs, options
def run(path, options): with open(path, 'rb') as f: header = f.read(4) if header == b'ttcf' and options.face_index == -1: extension = '.ttc' font = TTCollection(path) else: extension = '.ttf' font = TTFont(path, fontNumber=options.face_index) if options.output and not os.path.isdir(options.output): output = options.output else: output = makeOutputFileName(path, outputDir=options.output, extension=extension, overWrite=options.overwrite) otf_to_ttf(font, post_format=options.post_format, max_err=options.max_error, reverse_direction=options.reverse_direction) font.save(output)
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)
parser = argparse.ArgumentParser(description="Filter a UFO file") parser.add_argument("--output", "-o", metavar="OUTPUT", help="output file name") include_group = parser.add_mutually_exclusive_group(required=False) include_group.add_argument( "--include", metavar="GLYPHS", help="comma-separated list of glyphs to filter" ) include_group.add_argument( "--exclude", metavar="GLYPHS", help="comma-separated list of glyphs to not filter" ) parser.add_argument("ufo", metavar="UFO", help="UFO file") parser.add_argument("filters", metavar="FILTER", nargs="+", help="filter name") args = parser.parse_args() if not args.output: args.output = makeOutputFileName(args.ufo) ufo = loader(args.ufo) include = None if args.include: include_set = set(args.include.split(",")) def include(g): return g.name in include_set elif args.exclude: exclude_set = set(args.exclude.split(","))