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)
Exemple #3
0
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)
Exemple #5
0
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)
Exemple #6
0
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
Exemple #7
0
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!")
Exemple #8
0
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
Exemple #9
0
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
Exemple #10
0
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)
Exemple #11
0
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(","))