Add a snippet to remove LangSys from DFLT script
Such fonts violate the spec and OTS rejects them, this snippet should help quickly fixing such fonts.
This commit is contained in:
parent
386f16a233
commit
7bea4c66c6
85
Snippets/fix-dflt-langsys.py
Normal file
85
Snippets/fix-dflt-langsys.py
Normal file
@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
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())
|
Loading…
x
Reference in New Issue
Block a user