From 6fab2a4f7b2cf81108a0098dd7f5e142a14d8e84 Mon Sep 17 00:00:00 2001 From: moyogo Date: Wed, 7 Oct 2015 23:54:04 +0100 Subject: [PATCH] [voltLib] Modify PositionAttachDefinition and parse_position to handle multiple TO coverages --- Lib/fontTools/voltLib/ast.py | 3 +-- Lib/fontTools/voltLib/parser.py | 15 +++++++++------ Lib/fontTools/voltLib/parser_test.py | 28 ++++++++++++++++++++++------ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/Lib/fontTools/voltLib/ast.py b/Lib/fontTools/voltLib/ast.py index eed8f0f87..a2f7fa3f3 100644 --- a/Lib/fontTools/voltLib/ast.py +++ b/Lib/fontTools/voltLib/ast.py @@ -63,11 +63,10 @@ class SubstitutionDefinition(ast.Statement): self.mapping = zip(src, dest) class PositionAttachDefinition(ast.Statement): - def __init__(self, location, coverage, coverage_to, anchor): + def __init__(self, location, coverage, coverage_to): ast.Statement.__init__(self, location) self.coverage = coverage self.coverage_to = coverage_to - self.anchor = anchor class PositionAdjustPairDefinition(ast.Statement): def __init__(self, location, coverages_1, coverages_2, adjust): diff --git a/Lib/fontTools/voltLib/parser.py b/Lib/fontTools/voltLib/parser.py index 73d26e234..26d1a10aa 100644 --- a/Lib/fontTools/voltLib/parser.py +++ b/Lib/fontTools/voltLib/parser.py @@ -228,14 +228,17 @@ class Parser(object): "ADJUST_SINGLE") if pos_type == "ATTACH": coverage = self.parse_coverage_() + coverage_to = [] self.expect_keyword_("TO") - coverage_to = self.parse_coverage_() - self.expect_keyword_("AT") - self.expect_keyword_("ANCHOR") - anchor_name = self.expect_string_() + while self.next_token_ != "END_ATTACH": + cov = self.parse_coverage_() + self.expect_keyword_("AT") + self.expect_keyword_("ANCHOR") + anchor_name = self.expect_string_() + coverage_to.append((cov, anchor_name)) self.expect_keyword_("END_ATTACH") - position = ast.PositionAttachDefinition(location, coverage, coverage_to, - anchor_name) + position = ast.PositionAttachDefinition(location, coverage, + coverage_to) elif pos_type == "ATTACH_CURSIVE": raise VoltLibError("ATTACH_CURSIVE not yet implemented.", location) diff --git a/Lib/fontTools/voltLib/parser_test.py b/Lib/fontTools/voltLib/parser_test.py index 16f354680..ddefac65e 100644 --- a/Lib/fontTools/voltLib/parser_test.py +++ b/Lib/fontTools/voltLib/parser_test.py @@ -229,25 +229,30 @@ class ParserTest(unittest.TestCase): [])) def test_def_attach(self): - [lookup, anchor1, anchor2] = self.parse( + [lookup, anchor1, anchor2, anchor3, anchor4] = self.parse( 'DEF_LOOKUP "anchor_top" PROCESS_BASE PROCESS_MARKS ALL ' 'DIRECTION RTL\n' 'IN_CONTEXT\n' 'END_CONTEXT\n' 'AS_POSITION\n' - 'ATTACH GLYPH "a"\n' - 'TO GLYPH "acutecomb" AT ANCHOR "top"\n' + 'ATTACH GLYPH "a" GLYPH "e"\n' + 'TO GLYPH "acutecomb" AT ANCHOR "top" ' + 'GLYPH "gravecomb" AT ANCHOR "top"\n' 'END_ATTACH\n' 'END_POSITION\n' 'DEF_ANCHOR "MARK_top" ON 120 GLYPH acutecomb COMPONENT 1 ' 'AT POS DX 0 DY 450 END_POS END_ANCHOR\n' + 'DEF_ANCHOR "MARK_top" ON 121 GLYPH gravecomb COMPONENT 1 ' + 'AT POS DX 0 DY 450 END_POS END_ANCHOR\n' 'DEF_ANCHOR "top" ON 31 GLYPH a COMPONENT 1 ' 'AT POS DX 210 DY 450 END_POS END_ANCHOR\n' + 'DEF_ANCHOR "top" ON 35 GLYPH e COMPONENT 1 ' + 'AT POS DX 215 DY 450 END_POS END_ANCHOR\n' ).statements self.assertEqual( - (lookup.name, lookup.pos.coverage, lookup.pos.coverage_to, - lookup.pos.anchor), - ("anchor_top", ['a'], ['acutecomb'], 'top') + (lookup.name, lookup.pos.coverage, lookup.pos.coverage_to), + ("anchor_top", ["a", "e"], [(["acutecomb"], "top"), + (["gravecomb"], "top")]) ) self.assertEqual( (anchor1.name, anchor1.gid, anchor1.glyph_name, anchor1.component, @@ -258,8 +263,19 @@ class ParserTest(unittest.TestCase): self.assertEqual( (anchor2.name, anchor2.gid, anchor2.glyph_name, anchor2.component, anchor2.locked, anchor2.pos), + ("MARK_top", 121, "gravecomb", 1, False, (None, 0, 450, {}, {}, + {})) + ) + self.assertEqual( + (anchor3.name, anchor3.gid, anchor3.glyph_name, anchor3.component, + anchor3.locked, anchor3.pos), ("top", 31, "a", 1, False, (None, 210, 450, {}, {}, {})) ) + self.assertEqual( + (anchor4.name, anchor4.gid, anchor4.glyph_name, anchor4.component, + anchor4.locked, anchor4.pos), + ("top", 35, "e", 1, False, (None, 215, 450, {}, {}, {})) + ) def test_adjust_pair(self): [lookup] = self.parse(