#!/usr/bin/env python3 import argparse import logging import os import sys from fontTools.ttLib import TTFont def ProcessTable(table): found = set() for rec in table.ScriptList.ScriptRecord: if rec.ScriptTag == "DFLT" and rec.Script.LangSysCount != 0: tags = [r.LangSysTag for r in rec.Script.LangSysRecord] logging.info("Removing %d extraneous LangSys records: %s", rec.Script.LangSysCount, " ".join(tags)) rec.Script.LangSysRecord = [] rec.Script.LangSysCount = 0 found.update(tags) if not found: logging.info("All fine") return False else: for rec in table.ScriptList.ScriptRecord: tags = set([r.LangSysTag for r in rec.Script.LangSysRecord]) found -= tags if found: logging.warning("Records are missing from non-DFLT scripts: %s", " ".join(found)) return True def ProcessFont(font): found = False for tag in ("GSUB", "GPOS"): if tag in font: logging.info("Processing %s table", tag) if ProcessTable(font[tag].table): found = True else: # Unmark the table as loaded so that it is read from disk when # writing the font, to avoid any unnecessary changes caused by # decompiling then recompiling again. del font.tables[tag] return found def ProcessFiles(filenames): for filename in filenames: logging.info("Processing %s", filename) font = TTFont(filename) name, ext = os.path.splitext(filename) fixedname = name + ".fixed" + ext if ProcessFont(font): logging.info("Saving fixed font to %s\n", fixedname) font.save(fixedname) else: logging.info("Font file is fine, nothing to fix\n") def main(): parser = argparse.ArgumentParser( description="Fix LangSys records for DFLT script") parser.add_argument("files", metavar="FILE", type=str, nargs="+", help="input font to process") parser.add_argument("-s", "--silent", action='store_true', help="suppress normal messages") args = parser.parse_args() logformat = "%(levelname)s: %(message)s" if args.silent: logging.basicConfig(format=logformat, level=logging.DEBUG) else: logging.basicConfig(format=logformat, level=logging.INFO) ProcessFiles(args.files) if __name__ == "__main__": sys.exit(main())