diff --git a/Lib/fontTools/voltLib/ast.py b/Lib/fontTools/voltLib/ast.py index f202d06d6..158a153f6 100644 --- a/Lib/fontTools/voltLib/ast.py +++ b/Lib/fontTools/voltLib/ast.py @@ -62,7 +62,7 @@ class FeatureDefinition(ast.Statement): class LookupDefinition(ast.Statement): def __init__(self, location, name, base, marks, process_marks, all_flag, - direction, comments, context, sub, pos): + direction, reversal, comments, context, sub, pos): ast.Statement.__init__(self, location) self.name = name self.base = base @@ -70,6 +70,7 @@ class LookupDefinition(ast.Statement): self.process_marks = process_marks self.all = all_flag self.direction = direction + self.reversal = reversal self.comments = comments self.context = context self.sub = sub diff --git a/Lib/fontTools/voltLib/parser.py b/Lib/fontTools/voltLib/parser.py index 24aa062a6..0cebf3c69 100644 --- a/Lib/fontTools/voltLib/parser.py +++ b/Lib/fontTools/voltLib/parser.py @@ -177,6 +177,10 @@ class Parser(object): self.expect_keyword_("DIRECTION") direction = self.expect_name_() assert direction in ("LTR", "RTL") + reversal = None + if self.next_token_ == "REVERSAL": + self.expect_keyword_("REVERSAL") + reversal = True comments = None if self.next_token_ == "COMMENTS": self.expect_keyword_("COMMENTS") @@ -193,7 +197,7 @@ class Parser(object): pos = self.parse_position_() def_lookup = ast.LookupDefinition( location, name, base, marks, process_marks, all_flag, direction, - comments, context, sub, pos) + reversal, comments, context, sub, pos) return def_lookup def parse_context_(self): diff --git a/Lib/fontTools/voltLib/parser_test.py b/Lib/fontTools/voltLib/parser_test.py index 0ef425627..741ea7214 100644 --- a/Lib/fontTools/voltLib/parser_test.py +++ b/Lib/fontTools/voltLib/parser_test.py @@ -429,6 +429,42 @@ class ParserTest(unittest.TestCase): (lookup.name, process_marks, all_marks), ("SomeSub", "SomeMarks", False)) + def test_substitution_no_reversal(self): + [lookup] = self.parse( + 'DEF_LOOKUP "Lookup" PROCESS_BASE PROCESS_MARKS ALL ' + 'DIRECTION LTR\n' + 'IN_CONTEXT\n' + 'RIGHT ENUM GLYPH "a" GLYPH "b" END_ENUM\n' + 'END_CONTEXT\n' + 'AS_SUBSTITUTION\n' + 'SUB GLYPH "a"\n' + 'WITH GLYPH "a.alt"\n' + 'END_SUB\n' + 'END_SUBSTITUTION' + ).statements + self.assertEqual( + (lookup.name, lookup.reversal), + ("Lookup", None) + ) + + def test_substitution_reversal(self): + [lookup] = self.parse( + 'DEF_LOOKUP "RevLookup" PROCESS_BASE PROCESS_MARKS ALL ' + 'DIRECTION LTR REVERSAL\n' + 'IN_CONTEXT\n' + 'RIGHT ENUM GLYPH "a" GLYPH "b" END_ENUM\n' + 'END_CONTEXT\n' + 'AS_SUBSTITUTION\n' + 'SUB GROUP "DFLT_Num_standardFigures"\n' + 'WITH GROUP "DFLT_Num_numerators"\n' + 'END_SUB\n' + 'END_SUBSTITUTION' + ).statements + self.assertEqual( + (lookup.name, lookup.reversal), + ("RevLookup", True) + ) + # GPOS # ATTACH_CURSIVE # ATTACH