From a0a400d9c159d4abfd96a4bb2de79bbc83a9a239 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 1 Oct 2015 10:11:48 +0100 Subject: [PATCH 1/3] [name] add setName method to table__n_a_m_e If the referenced name record already exists, the string is modified in place. If it doesn't exist, a new record is created with the given IDs and string. --- Lib/fontTools/ttLib/tables/_n_a_m_e.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Lib/fontTools/ttLib/tables/_n_a_m_e.py b/Lib/fontTools/ttLib/tables/_n_a_m_e.py index aeeb3b185..662ae07c8 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e.py @@ -111,6 +111,23 @@ class table__n_a_m_e(DefaultTable.DefaultTable): else: return None + def setName(self, string, nameID, platformID, platEncID, langID): + if not hasattr(self, 'names'): + self.names = [] + namerecord = self.getName(nameID, platformID, platEncID, langID) + exists = False if namerecord is None else True + if not exists: + namerecord = NameRecord() + namerecord.nameID = nameID + namerecord.platformID = platformID + namerecord.platEncID = platEncID + namerecord.langID = langID + encoding = namerecord.getEncoding() + namerecord.string = string.encode(encoding) + if not exists: + self.names.append(namerecord) + + class NameRecord(object): def getEncoding(self, default='ascii'): From 898199f2bc9079d06fd4390b18747421f76e5001 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 1 Oct 2015 10:12:29 +0100 Subject: [PATCH 2/3] [_n_a_m_e_test] add test_setName test case --- Lib/fontTools/ttLib/tables/_n_a_m_e_test.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py b/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py index 562f8f2e3..4556e6c6b 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py @@ -28,6 +28,19 @@ class NameTableTest(unittest.TestCase): self.assertEqual("Sem Fracções", table.getDebugName(292)) self.assertEqual(None, table.getDebugName(999)) + def test_setName(self): + table = table__n_a_m_e() + table.setName("Regular", 2, 1, 0, 0) + table.setName("Version 1.000", 5, 3, 1, 0x409) + table.setName("寬鬆", 276, 1, 2, 0x13) + self.assertEqual("Regular", str(table.getName(2, 1, 0, 0))) + self.assertEqual("Version 1.000", str(table.getName(5, 3, 1, 0x409))) + self.assertEqual("寬鬆", str(table.getName(276, 1, 2, 0x13))) + self.assertTrue(len(table.names) == 3) + table.setName("緊縮", 276, 1, 2, 0x13) + self.assertEqual("緊縮", str(table.getName(276, 1, 2, 0x13))) + self.assertTrue(len(table.names) == 3) + class NameRecordTest(unittest.TestCase): From 12bde8e97afde996d0e1d70a2a9f39f4f70cf8e7 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 1 Oct 2015 11:41:46 +0100 Subject: [PATCH 3/3] [_n_a_m_e_test] use toUnicode() instead of built-in str() for py2 compat NameRecord.__str__ returns a unicode string, but on Python2 the built-in str() expects a bytestring, therefore it raises UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) We should probably change that as well. --- Lib/fontTools/ttLib/tables/_n_a_m_e_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py b/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py index 4556e6c6b..cb4f1be87 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e_test.py @@ -33,12 +33,12 @@ class NameTableTest(unittest.TestCase): table.setName("Regular", 2, 1, 0, 0) table.setName("Version 1.000", 5, 3, 1, 0x409) table.setName("寬鬆", 276, 1, 2, 0x13) - self.assertEqual("Regular", str(table.getName(2, 1, 0, 0))) - self.assertEqual("Version 1.000", str(table.getName(5, 3, 1, 0x409))) - self.assertEqual("寬鬆", str(table.getName(276, 1, 2, 0x13))) + self.assertEqual("Regular", table.getName(2, 1, 0, 0).toUnicode()) + self.assertEqual("Version 1.000", table.getName(5, 3, 1, 0x409).toUnicode()) + self.assertEqual("寬鬆", table.getName(276, 1, 2, 0x13).toUnicode()) self.assertTrue(len(table.names) == 3) table.setName("緊縮", 276, 1, 2, 0x13) - self.assertEqual("緊縮", str(table.getName(276, 1, 2, 0x13))) + self.assertEqual("緊縮", table.getName(276, 1, 2, 0x13).toUnicode()) self.assertTrue(len(table.names) == 3)