blob: a9cc8696957455c913c628c1d664694857c21a7d [file] [log] [blame]
#!/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())