[voltLib] Modify PositionAttachDefinition and parse_position to handle multiple TO coverages

This commit is contained in:
moyogo 2015-10-07 23:54:04 +01:00
parent 923fd2cb4d
commit 6fab2a4f7b
3 changed files with 32 additions and 14 deletions

View File

@ -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):

View File

@ -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)

View File

@ -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(