[feaLib] Implement ValueRecord.asFea()

ValueRecord had a makeString() method that takes an optional “vertical”
argument, but no code outside the tests sets this argument. Renamed it
to asFea() and dropped the “vertical”, so that it consistent with the
rest of feaLib.ast classes.
This commit is contained in:
Khaled Hosny 2019-01-28 06:05:49 +02:00
parent e974ea3871
commit 354b89c068
2 changed files with 31 additions and 38 deletions

View File

@ -963,12 +963,12 @@ class PairPosStatement(Statement):
res = "enum " if self.enumerated else "" res = "enum " if self.enumerated else ""
if self.valuerecord2: if self.valuerecord2:
res += "pos {} {} {} {};".format( res += "pos {} {} {} {};".format(
self.glyphs1.asFea(), self.valuerecord1.makeString(), self.glyphs1.asFea(), self.valuerecord1.asFea(),
self.glyphs2.asFea(), self.valuerecord2.makeString()) self.glyphs2.asFea(), self.valuerecord2.asFea())
else: else:
res += "pos {} {} {};".format( res += "pos {} {} {};".format(
self.glyphs1.asFea(), self.glyphs2.asFea(), self.glyphs1.asFea(), self.glyphs2.asFea(),
self.valuerecord1.makeString()) self.valuerecord1.asFea())
return res return res
@ -1069,12 +1069,12 @@ class SinglePosStatement(Statement):
if len(self.prefix): if len(self.prefix):
res += " ".join(map(asFea, self.prefix)) + " " res += " ".join(map(asFea, self.prefix)) + " "
res += " ".join([asFea(x[0]) + "'" + ( res += " ".join([asFea(x[0]) + "'" + (
(" " + x[1].makeString()) if x[1] else "") for x in self.pos]) (" " + x[1].asFea()) if x[1] else "") for x in self.pos])
if len(self.suffix): if len(self.suffix):
res += " " + " ".join(map(asFea, self.suffix)) res += " " + " ".join(map(asFea, self.suffix))
else: else:
res += " ".join([asFea(x[0]) + " " + res += " ".join([asFea(x[0]) + " " +
(x[1].makeString() if x[1] else "") for x in self.pos]) (x[1].asFea() if x[1] else "") for x in self.pos])
res += ";" res += ";"
return res return res
@ -1120,7 +1120,7 @@ class ValueRecord(Expression):
hash(self.xPlaDevice) ^ hash(self.yPlaDevice) ^ hash(self.xPlaDevice) ^ hash(self.yPlaDevice) ^
hash(self.xAdvDevice) ^ hash(self.yAdvDevice)) hash(self.xAdvDevice) ^ hash(self.yAdvDevice))
def makeString(self, vertical=None): def asFea(self, indent=""):
if not self: if not self:
return "<NULL>" return "<NULL>"
@ -1128,8 +1128,7 @@ class ValueRecord(Expression):
xAdvance, yAdvance = self.xAdvance, self.yAdvance xAdvance, yAdvance = self.xAdvance, self.yAdvance
xPlaDevice, yPlaDevice = self.xPlaDevice, self.yPlaDevice xPlaDevice, yPlaDevice = self.xPlaDevice, self.yPlaDevice
xAdvDevice, yAdvDevice = self.xAdvDevice, self.yAdvDevice xAdvDevice, yAdvDevice = self.xAdvDevice, self.yAdvDevice
if vertical is None: vertical = self.vertical
vertical = self.vertical
# Try format A, if possible. # Try format A, if possible.
if x is None and y is None: if x is None and y is None:

View File

@ -726,7 +726,7 @@ class ParserTest(unittest.TestCase):
self.assertIsInstance(pos, ast.SinglePosStatement) self.assertIsInstance(pos, ast.SinglePosStatement)
[(glyphs, value)] = pos.pos [(glyphs, value)] = pos.pos
self.assertEqual(glyphstr([glyphs]), "one") self.assertEqual(glyphstr([glyphs]), "one")
self.assertEqual(value.makeString(vertical=False), "<1 2 3 4>") self.assertEqual(value.asFea(), "<1 2 3 4>")
def test_gpos_type_1_glyphclass_horizontal(self): def test_gpos_type_1_glyphclass_horizontal(self):
doc = self.parse("feature kern {pos [one two] -300;} kern;") doc = self.parse("feature kern {pos [one two] -300;} kern;")
@ -734,7 +734,7 @@ class ParserTest(unittest.TestCase):
self.assertIsInstance(pos, ast.SinglePosStatement) self.assertIsInstance(pos, ast.SinglePosStatement)
[(glyphs, value)] = pos.pos [(glyphs, value)] = pos.pos
self.assertEqual(glyphstr([glyphs]), "[one two]") self.assertEqual(glyphstr([glyphs]), "[one two]")
self.assertEqual(value.makeString(vertical=False), "-300") self.assertEqual(value.asFea(), "-300")
def test_gpos_type_1_glyphclass_vertical(self): def test_gpos_type_1_glyphclass_vertical(self):
doc = self.parse("feature vkrn {pos [one two] -300;} vkrn;") doc = self.parse("feature vkrn {pos [one two] -300;} vkrn;")
@ -742,7 +742,7 @@ class ParserTest(unittest.TestCase):
self.assertIsInstance(pos, ast.SinglePosStatement) self.assertIsInstance(pos, ast.SinglePosStatement)
[(glyphs, value)] = pos.pos [(glyphs, value)] = pos.pos
self.assertEqual(glyphstr([glyphs]), "[one two]") self.assertEqual(glyphstr([glyphs]), "[one two]")
self.assertEqual(value.makeString(vertical=True), "-300") self.assertEqual(value.asFea(), "-300")
def test_gpos_type_1_multiple(self): def test_gpos_type_1_multiple(self):
doc = self.parse("feature f {pos one'1 two'2 [five six]'56;} f;") doc = self.parse("feature f {pos one'1 two'2 [five six]'56;} f;")
@ -750,11 +750,11 @@ class ParserTest(unittest.TestCase):
self.assertIsInstance(pos, ast.SinglePosStatement) self.assertIsInstance(pos, ast.SinglePosStatement)
[(glyphs1, val1), (glyphs2, val2), (glyphs3, val3)] = pos.pos [(glyphs1, val1), (glyphs2, val2), (glyphs3, val3)] = pos.pos
self.assertEqual(glyphstr([glyphs1]), "one") self.assertEqual(glyphstr([glyphs1]), "one")
self.assertEqual(val1.makeString(vertical=False), "1") self.assertEqual(val1.asFea(), "1")
self.assertEqual(glyphstr([glyphs2]), "two") self.assertEqual(glyphstr([glyphs2]), "two")
self.assertEqual(val2.makeString(vertical=False), "2") self.assertEqual(val2.asFea(), "2")
self.assertEqual(glyphstr([glyphs3]), "[five six]") self.assertEqual(glyphstr([glyphs3]), "[five six]")
self.assertEqual(val3.makeString(vertical=False), "56") self.assertEqual(val3.asFea(), "56")
self.assertEqual(pos.prefix, []) self.assertEqual(pos.prefix, [])
self.assertEqual(pos.suffix, []) self.assertEqual(pos.suffix, [])
@ -774,7 +774,7 @@ class ParserTest(unittest.TestCase):
self.assertIsInstance(pos, ast.SinglePosStatement) self.assertIsInstance(pos, ast.SinglePosStatement)
[(glyphs, value)] = pos.pos [(glyphs, value)] = pos.pos
self.assertEqual(glyphstr([glyphs]), "[T Y]") self.assertEqual(glyphstr([glyphs]), "[T Y]")
self.assertEqual(value.makeString(vertical=False), "20") self.assertEqual(value.asFea(), "20")
self.assertEqual(glyphstr(pos.prefix), "[A B]") self.assertEqual(glyphstr(pos.prefix), "[A B]")
self.assertEqual(glyphstr(pos.suffix), "comma") self.assertEqual(glyphstr(pos.suffix), "comma")
@ -786,10 +786,9 @@ class ParserTest(unittest.TestCase):
self.assertEqual(type(pos), ast.PairPosStatement) self.assertEqual(type(pos), ast.PairPosStatement)
self.assertFalse(pos.enumerated) self.assertFalse(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertEqual(pos.valuerecord1.makeString(vertical=False), "-60") self.assertEqual(pos.valuerecord1.asFea(), "-60")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertEqual(pos.valuerecord2.makeString(vertical=False), self.assertEqual(pos.valuerecord2.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
def test_gpos_type_2_format_a_enumerated(self): def test_gpos_type_2_format_a_enumerated(self):
doc = self.parse("feature kern {" doc = self.parse("feature kern {"
@ -799,10 +798,9 @@ class ParserTest(unittest.TestCase):
self.assertEqual(type(pos), ast.PairPosStatement) self.assertEqual(type(pos), ast.PairPosStatement)
self.assertTrue(pos.enumerated) self.assertTrue(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertEqual(pos.valuerecord1.makeString(vertical=False), "-60") self.assertEqual(pos.valuerecord1.asFea(), "-60")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertEqual(pos.valuerecord2.makeString(vertical=False), self.assertEqual(pos.valuerecord2.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
def test_gpos_type_2_format_a_with_null_first(self): def test_gpos_type_2_format_a_with_null_first(self):
doc = self.parse("feature kern {" doc = self.parse("feature kern {"
@ -813,10 +811,9 @@ class ParserTest(unittest.TestCase):
self.assertFalse(pos.enumerated) self.assertFalse(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertFalse(pos.valuerecord1) self.assertFalse(pos.valuerecord1)
self.assertEqual(pos.valuerecord1.makeString(), "<NULL>") self.assertEqual(pos.valuerecord1.asFea(), "<NULL>")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertEqual(pos.valuerecord2.makeString(vertical=False), self.assertEqual(pos.valuerecord2.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
self.assertEqual(pos.asFea(), "pos [T V] <NULL> [a b c] <1 2 3 4>;") self.assertEqual(pos.asFea(), "pos [T V] <NULL> [a b c] <1 2 3 4>;")
def test_gpos_type_2_format_a_with_null_second(self): def test_gpos_type_2_format_a_with_null_second(self):
@ -827,8 +824,7 @@ class ParserTest(unittest.TestCase):
self.assertEqual(type(pos), ast.PairPosStatement) self.assertEqual(type(pos), ast.PairPosStatement)
self.assertFalse(pos.enumerated) self.assertFalse(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertEqual(pos.valuerecord1.makeString(vertical=False), self.assertEqual(pos.valuerecord1.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertFalse(pos.valuerecord2) self.assertFalse(pos.valuerecord2)
self.assertEqual(pos.asFea(), "pos [T V] [a b c] <1 2 3 4>;") self.assertEqual(pos.asFea(), "pos [T V] [a b c] <1 2 3 4>;")
@ -841,8 +837,7 @@ class ParserTest(unittest.TestCase):
self.assertEqual(type(pos), ast.PairPosStatement) self.assertEqual(type(pos), ast.PairPosStatement)
self.assertFalse(pos.enumerated) self.assertFalse(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertEqual(pos.valuerecord1.makeString(vertical=False), self.assertEqual(pos.valuerecord1.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertIsNone(pos.valuerecord2) self.assertIsNone(pos.valuerecord2)
@ -854,8 +849,7 @@ class ParserTest(unittest.TestCase):
self.assertEqual(type(pos), ast.PairPosStatement) self.assertEqual(type(pos), ast.PairPosStatement)
self.assertTrue(pos.enumerated) self.assertTrue(pos.enumerated)
self.assertEqual(glyphstr([pos.glyphs1]), "[T V]") self.assertEqual(glyphstr([pos.glyphs1]), "[T V]")
self.assertEqual(pos.valuerecord1.makeString(vertical=False), self.assertEqual(pos.valuerecord1.asFea(), "<1 2 3 4>")
"<1 2 3 4>")
self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]") self.assertEqual(glyphstr([pos.glyphs2]), "[a b c]")
self.assertIsNone(pos.valuerecord2) self.assertIsNone(pos.valuerecord2)
@ -1442,7 +1436,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef 123 foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef 123 foo;")
self.assertEqual(value.makeString(vertical=False), "123") self.assertEqual(value.asFea(), "123")
def test_valuerecord_format_a_vertical(self): def test_valuerecord_format_a_vertical(self):
doc = self.parse("feature vkrn {valueRecordDef 123 foo;} vkrn;") doc = self.parse("feature vkrn {valueRecordDef 123 foo;} vkrn;")
@ -1457,7 +1451,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef 123 foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef 123 foo;")
self.assertEqual(value.makeString(vertical=True), "123") self.assertEqual(value.asFea(), "123")
def test_valuerecord_format_a_zero_horizontal(self): def test_valuerecord_format_a_zero_horizontal(self):
doc = self.parse("feature liga {valueRecordDef 0 foo;} liga;") doc = self.parse("feature liga {valueRecordDef 0 foo;} liga;")
@ -1472,7 +1466,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef 0 foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef 0 foo;")
self.assertEqual(value.makeString(vertical=False), "0") self.assertEqual(value.asFea(), "0")
def test_valuerecord_format_a_zero_vertical(self): def test_valuerecord_format_a_zero_vertical(self):
doc = self.parse("feature vkrn {valueRecordDef 0 foo;} vkrn;") doc = self.parse("feature vkrn {valueRecordDef 0 foo;} vkrn;")
@ -1487,7 +1481,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef 0 foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef 0 foo;")
self.assertEqual(value.makeString(vertical=True), "0") self.assertEqual(value.asFea(), "0")
def test_valuerecord_format_a_vertical_contexts_(self): def test_valuerecord_format_a_vertical_contexts_(self):
for tag in "vkrn vpal vhal valt".split(): for tag in "vkrn vpal vhal valt".split():
@ -1511,7 +1505,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef <1 2 3 4> foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef <1 2 3 4> foo;")
self.assertEqual(value.makeString(vertical=False), "<1 2 3 4>") self.assertEqual(value.asFea(), "<1 2 3 4>")
def test_valuerecord_format_b_zero(self): def test_valuerecord_format_b_zero(self):
doc = self.parse("feature liga {valueRecordDef <0 0 0 0> foo;} liga;") doc = self.parse("feature liga {valueRecordDef <0 0 0 0> foo;} liga;")
@ -1526,7 +1520,7 @@ class ParserTest(unittest.TestCase):
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertIsNone(value.yAdvDevice) self.assertIsNone(value.yAdvDevice)
self.assertEqual(valuedef.asFea(), "valueRecordDef <0 0 0 0> foo;") self.assertEqual(valuedef.asFea(), "valueRecordDef <0 0 0 0> foo;")
self.assertEqual(value.makeString(vertical=False), "<0 0 0 0>") self.assertEqual(value.asFea(), "<0 0 0 0>")
def test_valuerecord_format_c(self): def test_valuerecord_format_c(self):
doc = self.parse( doc = self.parse(
@ -1548,7 +1542,7 @@ class ParserTest(unittest.TestCase):
self.assertEqual(value.yPlaDevice, ((11, 111), (12, 112))) self.assertEqual(value.yPlaDevice, ((11, 111), (12, 112)))
self.assertIsNone(value.xAdvDevice) self.assertIsNone(value.xAdvDevice)
self.assertEqual(value.yAdvDevice, ((33, -113), (44, -114), (55, 115))) self.assertEqual(value.yAdvDevice, ((33, -113), (44, -114), (55, 115)))
self.assertEqual(value.makeString(vertical=False), self.assertEqual(value.asFea(),
"<1 2 3 4 <device 8 88> <device 11 111, 12 112>" "<1 2 3 4 <device 8 88> <device 11 111, 12 112>"
" <device NULL> <device 33 -113, 44 -114, 55 115>>") " <device NULL> <device 33 -113, 44 -114, 55 115>>")
@ -1556,7 +1550,7 @@ class ParserTest(unittest.TestCase):
doc = self.parse("feature test {valueRecordDef <NULL> foo;} test;") doc = self.parse("feature test {valueRecordDef <NULL> foo;} test;")
value = doc.statements[0].statements[0].value value = doc.statements[0].statements[0].value
self.assertFalse(value) self.assertFalse(value)
self.assertEqual(value.makeString(), "<NULL>") self.assertEqual(value.asFea(), "<NULL>")
def test_valuerecord_named(self): def test_valuerecord_named(self):
doc = self.parse("valueRecordDef <1 2 3 4> foo;" doc = self.parse("valueRecordDef <1 2 3 4> foo;"