[feaLib] allow to build from pre-parsed ast.FeatureFile object
This commit is contained in:
parent
9ae0ccaa31
commit
241384ab21
@ -5,6 +5,7 @@ from fontTools.misc import sstruct
|
|||||||
from fontTools.misc.textTools import binary2num, safeEval
|
from fontTools.misc.textTools import binary2num, safeEval
|
||||||
from fontTools.feaLib.error import FeatureLibError
|
from fontTools.feaLib.error import FeatureLibError
|
||||||
from fontTools.feaLib.parser import Parser
|
from fontTools.feaLib.parser import Parser
|
||||||
|
from fontTools.feaLib.ast import FeatureFile
|
||||||
from fontTools.otlLib import builder as otl
|
from fontTools.otlLib import builder as otl
|
||||||
from fontTools.ttLib import newTable, getTableModule
|
from fontTools.ttLib import newTable, getTableModule
|
||||||
from fontTools.ttLib.tables import otBase, otTables
|
from fontTools.ttLib.tables import otBase, otTables
|
||||||
@ -45,7 +46,12 @@ class Builder(object):
|
|||||||
|
|
||||||
def __init__(self, font, featurefile):
|
def __init__(self, font, featurefile):
|
||||||
self.font = font
|
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.glyphMap = font.getReverseGlyphMap()
|
||||||
self.default_language_systems_ = set()
|
self.default_language_systems_ = set()
|
||||||
self.script_ = None
|
self.script_ = None
|
||||||
@ -58,7 +64,6 @@ class Builder(object):
|
|||||||
self.cur_feature_name_ = None
|
self.cur_feature_name_ = None
|
||||||
self.lookups_ = []
|
self.lookups_ = []
|
||||||
self.features_ = {} # ('latn', 'DEU ', 'smcp') --> [LookupBuilder*]
|
self.features_ = {} # ('latn', 'DEU ', 'smcp') --> [LookupBuilder*]
|
||||||
self.parseTree = None
|
|
||||||
self.required_features_ = {} # ('latn', 'DEU ') --> 'scmp'
|
self.required_features_ = {} # ('latn', 'DEU ') --> 'scmp'
|
||||||
# for feature 'aalt'
|
# for feature 'aalt'
|
||||||
self.aalt_features_ = [] # [(location, featureName)*], for 'aalt'
|
self.aalt_features_ = [] # [(location, featureName)*], for 'aalt'
|
||||||
@ -92,7 +97,8 @@ class Builder(object):
|
|||||||
self.vhea_ = {}
|
self.vhea_ = {}
|
||||||
|
|
||||||
def build(self, tables=None):
|
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)
|
self.parseTree.build(self)
|
||||||
# by default, build all the supported tables
|
# by default, build all the supported tables
|
||||||
if tables is None:
|
if tables is None:
|
||||||
|
@ -495,6 +495,13 @@ class BuilderTest(unittest.TestCase):
|
|||||||
def test_build_unsupported_tables(self):
|
def test_build_unsupported_tables(self):
|
||||||
self.assertRaises(AssertionError, self.build, "", tables={"FOO"})
|
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):
|
def generate_feature_file_test(name):
|
||||||
return lambda self: self.check_feature_file(name)
|
return lambda self: self.check_feature_file(name)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user