From fb050c7a7fda0a44b4b9c2b4ce97553e54b7d60f Mon Sep 17 00:00:00 2001 From: Sascha Brawer Date: Tue, 11 Aug 2015 16:45:54 +0200 Subject: [PATCH] [feaLib] Parse rules for multiple substitution (GSUB LookupType 2) --- Lib/fontTools/feaLib/parser.py | 5 +++-- Lib/fontTools/feaLib/parser_test.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/feaLib/parser.py b/Lib/fontTools/feaLib/parser.py index 45d09210f..6292edec0 100644 --- a/Lib/fontTools/feaLib/parser.py +++ b/Lib/fontTools/feaLib/parser.py @@ -219,15 +219,16 @@ class Parser(object): location = self.cur_token_location_ old_prefix, old, lookups, old_suffix = self.parse_glyph_pattern_() + new = [] if self.next_token_ == "by": keyword = self.expect_keyword_("by") - new = [self.parse_glyphclass_(accept_glyphname=True)] + while self.next_token_ != ";": + new.append(self.parse_glyphclass_(accept_glyphname=True)) elif self.next_token_ == "from": keyword = self.expect_keyword_("from") new = [self.parse_glyphclass_(accept_glyphname=False)] else: keyword = None - new = [] self.expect_symbol_(";") if len(new) is 0 and not any(lookups): raise ParserError( diff --git a/Lib/fontTools/feaLib/parser_test.py b/Lib/fontTools/feaLib/parser_test.py index 6bb8bc0de..9de5d9362 100644 --- a/Lib/fontTools/feaLib/parser_test.py +++ b/Lib/fontTools/feaLib/parser_test.py @@ -289,6 +289,16 @@ class ParserTest(unittest.TestCase): self.assertEqual(sub.new, [{"A.sc", "B.sc", "C.sc", "D.sc"}]) self.assertEqual(sub.lookups, [None]) + def test_substitute_multiple(self): # GSUB LookupType 2 + doc = self.parse("lookup Look {substitute f_f_i by f f i;} Look;") + sub = doc.statements[0].statements[0] + self.assertEqual(type(sub), ast.SubstitutionRule) + self.assertEqual(sub.old_prefix, []) + self.assertEqual(sub.old, [{"f_f_i"}]) + self.assertEqual(sub.old_suffix, []) + self.assertEqual(sub.new, [{"f"}, {"f"}, {"i"}]) + self.assertEqual(sub.lookups, [None]) + def test_substitute_from(self): # GSUB LookupType 3 doc = self.parse("feature test {" " substitute a from [a.1 a.2 a.3];"