You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
86 lines
2.6 KiB
#!/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())
|