[feaLib] allow to build from pre-parsed ast.FeatureFile object

This commit is contained in:
Cosimo Lupo 2018-01-25 09:53:42 -08:00
parent 9ae0ccaa31
commit 241384ab21
No known key found for this signature in database
GPG Key ID: 59D54DB0C9976482
2 changed files with 16 additions and 3 deletions

View File

@ -5,6 +5,7 @@ from fontTools.misc import sstruct
from fontTools.misc.textTools import binary2num, safeEval
from fontTools.feaLib.error import FeatureLibError
from fontTools.feaLib.parser import Parser
from fontTools.feaLib.ast import FeatureFile
from fontTools.otlLib import builder as otl
from fontTools.ttLib import newTable, getTableModule
from fontTools.ttLib.tables import otBase, otTables
@ -45,7 +46,12 @@ class Builder(object):
def __init__(self, font, featurefile):
self.font = font
self.file = featurefile
# 'featurefile' can be either a path or file object (in which case we
# parse it into an AST), or a pre-parsed AST instance
if isinstance(featurefile, FeatureFile):
self.parseTree, self.file = featurefile, None
else:
self.parseTree, self.file = None, featurefile
self.glyphMap = font.getReverseGlyphMap()
self.default_language_systems_ = set()
self.script_ = None
@ -58,7 +64,6 @@ class Builder(object):
self.cur_feature_name_ = None
self.lookups_ = []
self.features_ = {} # ('latn', 'DEU ', 'smcp') --> [LookupBuilder*]
self.parseTree = None
self.required_features_ = {} # ('latn', 'DEU ') --> 'scmp'
# for feature 'aalt'
self.aalt_features_ = [] # [(location, featureName)*], for 'aalt'
@ -92,7 +97,8 @@ class Builder(object):
self.vhea_ = {}
def build(self, tables=None):
self.parseTree = Parser(self.file, self.glyphMap).parse()
if self.parseTree is None:
self.parseTree = Parser(self.file, self.glyphMap).parse()
self.parseTree.build(self)
# by default, build all the supported tables
if tables is None:

View File

@ -495,6 +495,13 @@ class BuilderTest(unittest.TestCase):
def test_build_unsupported_tables(self):
self.assertRaises(AssertionError, self.build, "", tables={"FOO"})
def test_build_pre_parsed_ast_featurefile(self):
f = UnicodeIO("feature liga {sub f i by f_i;} liga;")
tree = Parser(f).parse()
font = makeTTFont()
addOpenTypeFeatures(font, tree)
assert "GSUB" in font
def generate_feature_file_test(name):
return lambda self: self.check_feature_file(name)