#! /usr/bin/env python3

from fontTools.ttLib import TTFont
from fontTools.ttLib.tables import otTables
import sys

if len(sys.argv) != 2:
	print("usage: layout-features.py fontfile.ttf")
	sys.exit(1)
fontfile = sys.argv[1]
if fontfile.rsplit(".", 1)[-1] == "ttx":
	font = TTFont()
	font.importXML(fontfile)
else:
	font = TTFont(fontfile)

for tag in ('GSUB', 'GPOS'):
	if not tag in font: continue
	print("Table:", tag)
	table = font[tag].table
	if not table.ScriptList or not table.FeatureList: continue
	featureRecords = table.FeatureList.FeatureRecord
	for script in table.ScriptList.ScriptRecord:
		print("  Script:", script.ScriptTag)
		if not script.Script:
			print ("    Null script.")
			continue
		languages = list(script.Script.LangSysRecord)
		if script.Script.DefaultLangSys:
			defaultlangsys = otTables.LangSysRecord()
			defaultlangsys.LangSysTag = "default"
			defaultlangsys.LangSys = script.Script.DefaultLangSys
			languages.insert(0, defaultlangsys)
		for langsys in languages:
			print("    Language:", langsys.LangSysTag)
			if not langsys.LangSys:
				print ("    Null language.")
				continue
			features = [featureRecords[index] for index in langsys.LangSys.FeatureIndex]
			if langsys.LangSys.ReqFeatureIndex != 0xFFFF:
				record = featureRecords[langsys.LangSys.ReqFeatureIndex]
				requiredfeature = otTables.FeatureRecord()
				requiredfeature.FeatureTag = 'required(%s)' % record.FeatureTag
				requiredfeature.Feature = record.Feature
				features.insert(0, requiredfeature)
			for feature in features:
				print("      Feature:", feature.FeatureTag)
				lookups = feature.Feature.LookupListIndex
				print("        Lookups:", ','.join(str(l) for l in lookups))
