diff --git a/Lib/fontTools/voltLib/ast.py b/Lib/fontTools/voltLib/ast.py index a2f7fa3f3..489756e6f 100644 --- a/Lib/fontTools/voltLib/ast.py +++ b/Lib/fontTools/voltLib/ast.py @@ -91,3 +91,9 @@ class AnchorDefinition(ast.Statement): self.component = component self.locked = locked self.pos = pos + +class SettingDefinition(ast.Statement): + def __init__(self, location, name, value): + ast.Statement.__init__(self, location) + self.name = name + self.value = value diff --git a/Lib/fontTools/voltLib/parser.py b/Lib/fontTools/voltLib/parser.py index 26d1a10aa..c8872faef 100644 --- a/Lib/fontTools/voltLib/parser.py +++ b/Lib/fontTools/voltLib/parser.py @@ -32,6 +32,14 @@ class Parser(object): statements.append(self.parse_def_lookup_()) elif self.is_cur_keyword_("DEF_ANCHOR"): statements.append(self.parse_def_anchor_()) + elif self.cur_token_ in ("GRID_PPEM", "PRESENTATION_PPEM", + "PPOSITIONING_PPEM"): + statements.append(self.parse_ppem_()) + elif self.cur_token_ in ("COMPILER_USEEXTENSIONLOOKUPS", + "COMPILER_USEPAIRPOSFORMAT2"): + statements.append(self.parse_compiler_flag_()) + elif self.is_cur_keyword_("CMAP_FORMAT"): + statements.append(self.parse_cmap_format()) elif self.is_cur_keyword_("END"): if self.next_token_type_ is not None: raise VoltLibError("Expected the end of the file", @@ -39,7 +47,11 @@ class Parser(object): return self.doc_ else: raise VoltLibError("Expected DEF_GLYPH, DEF_GROUP, " - "DEF_SCRIPT, DEF_LOOKUP, DEF_ANCHOR", + "DEF_SCRIPT, DEF_LOOKUP, DEF_ANCHOR, " + "GRID_PPEM, PRESENTATION_PPEM, " + "PPOSITIONING_PPEM, " + "COMPILER_USEEXTENSIONLOOKUPS, " + "COMPILER_USEPAIRPOSFORMAT2, CMAP_FORMAT", self.cur_token_location_) return self.doc_ @@ -363,6 +375,28 @@ class Parser(object): coverage.append((start, end)) return coverage + def parse_ppem_(self): + location = self.cur_token_location_ + ppem_name = self.cur_token_ + value = self.expect_number_() + setting = ast.SettingDefinition(location, ppem_name, value) + return setting + + def parse_compiler_flag_(self): + location = self.cur_token_location_ + flag_name = self.cur_token_ + value = True + setting = ast.SettingDefinition(location, flag_name, value) + return setting + + def parse_cmap_format(self): + location = self.cur_token_location_ + name = self.cur_token_ + value = (self.expect_number_(), self.expect_number_(), + self.expect_number_()) + setting = ast.SettingDefinition(location, name, value) + return setting + def is_cur_keyword_(self, k): return (self.cur_token_type_ is Lexer.NAME) and (self.cur_token_ == k) diff --git a/Lib/fontTools/voltLib/parser_test.py b/Lib/fontTools/voltLib/parser_test.py index ddefac65e..cc026d5cc 100644 --- a/Lib/fontTools/voltLib/parser_test.py +++ b/Lib/fontTools/voltLib/parser_test.py @@ -313,6 +313,47 @@ class ParserTest(unittest.TestCase): {})) ) + def test_ppem(self): + [grid_ppem, pres_ppem, ppos_ppem] = self.parse( + 'GRID_PPEM 20\n' + 'PRESENTATION_PPEM 72\n' + 'PPOSITIONING_PPEM 144\n' + ).statements + self.assertEqual( + ((grid_ppem.name, grid_ppem.value), + (pres_ppem.name, pres_ppem.value), + (ppos_ppem.name, ppos_ppem.value)), + (("GRID_PPEM", 20), ("PRESENTATION_PPEM", 72), + ("PPOSITIONING_PPEM", 144)) + ) + + def test_compiler_flags(self): + [setting1, setting2] = self.parse( + 'COMPILER_USEEXTENSIONLOOKUPS\n' + 'COMPILER_USEPAIRPOSFORMAT2\n' + ).statements + self.assertEqual( + ((setting1.name, setting1.value), + (setting2.name, setting2.value)), + (("COMPILER_USEEXTENSIONLOOKUPS", True), + ("COMPILER_USEPAIRPOSFORMAT2", True)) + ) + + def test_cmap(self): + [cmap_format1, cmap_format2, cmap_format3] = self.parse( + 'CMAP_FORMAT 0 3 4\n' + 'CMAP_FORMAT 1 0 6\n' + 'CMAP_FORMAT 3 1 4\n' + ).statements + self.assertEqual( + ((cmap_format1.name, cmap_format1.value), + (cmap_format2.name, cmap_format2.value), + (cmap_format3.name, cmap_format3.value)), + (("CMAP_FORMAT", (0, 3, 4)), + ("CMAP_FORMAT", (1, 0, 6)), + ("CMAP_FORMAT", (3, 1, 4))) + ) + def setUp(self): self.tempdir = None self.num_tempfiles = 0