1*e1fe3e4aSElliott Hughes#! /usr/bin/env python3 2*e1fe3e4aSElliott Hughes 3*e1fe3e4aSElliott Hughesfrom fontTools.ttLib import TTFont 4*e1fe3e4aSElliott Hughesfrom fontTools.ttLib.tables import otTables 5*e1fe3e4aSElliott Hughesimport sys 6*e1fe3e4aSElliott Hughes 7*e1fe3e4aSElliott Hughesif len(sys.argv) != 2: 8*e1fe3e4aSElliott Hughes print("usage: layout-features.py fontfile.ttf") 9*e1fe3e4aSElliott Hughes sys.exit(1) 10*e1fe3e4aSElliott Hughesfontfile = sys.argv[1] 11*e1fe3e4aSElliott Hughesif fontfile.rsplit(".", 1)[-1] == "ttx": 12*e1fe3e4aSElliott Hughes font = TTFont() 13*e1fe3e4aSElliott Hughes font.importXML(fontfile) 14*e1fe3e4aSElliott Hugheselse: 15*e1fe3e4aSElliott Hughes font = TTFont(fontfile) 16*e1fe3e4aSElliott Hughes 17*e1fe3e4aSElliott Hughesfor tag in ("GSUB", "GPOS"): 18*e1fe3e4aSElliott Hughes if not tag in font: 19*e1fe3e4aSElliott Hughes continue 20*e1fe3e4aSElliott Hughes print("Table:", tag) 21*e1fe3e4aSElliott Hughes table = font[tag].table 22*e1fe3e4aSElliott Hughes if not table.ScriptList or not table.FeatureList: 23*e1fe3e4aSElliott Hughes continue 24*e1fe3e4aSElliott Hughes featureRecords = table.FeatureList.FeatureRecord 25*e1fe3e4aSElliott Hughes for script in table.ScriptList.ScriptRecord: 26*e1fe3e4aSElliott Hughes print(" Script:", script.ScriptTag) 27*e1fe3e4aSElliott Hughes if not script.Script: 28*e1fe3e4aSElliott Hughes print(" Null script.") 29*e1fe3e4aSElliott Hughes continue 30*e1fe3e4aSElliott Hughes languages = list(script.Script.LangSysRecord) 31*e1fe3e4aSElliott Hughes if script.Script.DefaultLangSys: 32*e1fe3e4aSElliott Hughes defaultlangsys = otTables.LangSysRecord() 33*e1fe3e4aSElliott Hughes defaultlangsys.LangSysTag = "default" 34*e1fe3e4aSElliott Hughes defaultlangsys.LangSys = script.Script.DefaultLangSys 35*e1fe3e4aSElliott Hughes languages.insert(0, defaultlangsys) 36*e1fe3e4aSElliott Hughes for langsys in languages: 37*e1fe3e4aSElliott Hughes print(" Language:", langsys.LangSysTag) 38*e1fe3e4aSElliott Hughes if not langsys.LangSys: 39*e1fe3e4aSElliott Hughes print(" Null language.") 40*e1fe3e4aSElliott Hughes continue 41*e1fe3e4aSElliott Hughes features = [featureRecords[index] for index in langsys.LangSys.FeatureIndex] 42*e1fe3e4aSElliott Hughes if langsys.LangSys.ReqFeatureIndex != 0xFFFF: 43*e1fe3e4aSElliott Hughes record = featureRecords[langsys.LangSys.ReqFeatureIndex] 44*e1fe3e4aSElliott Hughes requiredfeature = otTables.FeatureRecord() 45*e1fe3e4aSElliott Hughes requiredfeature.FeatureTag = "required(%s)" % record.FeatureTag 46*e1fe3e4aSElliott Hughes requiredfeature.Feature = record.Feature 47*e1fe3e4aSElliott Hughes features.insert(0, requiredfeature) 48*e1fe3e4aSElliott Hughes for feature in features: 49*e1fe3e4aSElliott Hughes print(" Feature:", feature.FeatureTag) 50*e1fe3e4aSElliott Hughes lookups = feature.Feature.LookupListIndex 51*e1fe3e4aSElliott Hughes print(" Lookups:", ",".join(str(l) for l in lookups)) 52