diff --git a/.gitignore b/.gitignore index eba633edf..9c564fd54 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ dist/ *.egg-info/ *.egg MANIFEST +.idea # Installer logs pip-log.txt diff --git a/Lib/fontTools/ttLib/tables/_n_a_m_e.py b/Lib/fontTools/ttLib/tables/_n_a_m_e.py index b51e1b725..9558addbb 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e.py @@ -120,6 +120,44 @@ class table__n_a_m_e(DefaultTable.DefaultTable): else: return None + def getFirstDebugName(self, nameIDs): + for nameID in nameIDs: + name = self.getDebugName(nameID) + if name is not None: + return name + return None + + def getBestFamilyName(self): + # 21 = WWS Family Name + # 16 = Typographic Family Name + # 1 = Family Name + return self.getFirstDebugName((21, 16, 1)) + + def getBestSubFamilyName(self): + # 22 = WWS SubFamily Name + # 17 = Typographic SubFamily Name + # 2 = SubFamily Name + return self.getFirstDebugName((22, 17, 2)) + + def getBestFullName(self): + # 4 = Full Name + # 6 = PostScript Name + for nameIDs in ((21, 22), (16, 17), (1, 2), (4, ), (6, )): + if len(nameIDs) == 2: + name_fam = self.getDebugName(nameIDs[0]) + name_subfam = self.getDebugName(nameIDs[1]) + if None in [name_fam, name_subfam]: + continue # if any is None, skip + name = f"{name_fam} {name_subfam}" + if name_subfam.lower() == 'regular': + name = f"{name_fam}" + return name + else: + name = self.getDebugName(nameIDs[0]) + if name is not None: + return name + return None + def setName(self, string, nameID, platformID, platEncID, langID): """ Set the 'string' for the name record identified by 'nameID', 'platformID', 'platEncID' and 'langID'. If a record with that nameID doesn't exist, create it diff --git a/README.rst b/README.rst index 6a35807cf..fdff24334 100644 --- a/README.rst +++ b/README.rst @@ -248,7 +248,7 @@ Simon Daniels, Peter Dekkers, Behdad Esfahbod, Behnam Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Takaaki Fuji, Yannis Haralambous, Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca, Werner Lemberg, Tal -Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura, Dave Opstad, +Leming, Peter Lofting, Cosimo Lupo, Olli Meier, Masaya Nakamura, Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg Seifert, Chris Simpkins, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index 38fbfef78..a9a641dd8 100644 --- a/Tests/ttLib/tables/_n_a_m_e_test.py +++ b/Tests/ttLib/tables/_n_a_m_e_test.py @@ -450,6 +450,103 @@ class NameRecordTest(unittest.TestCase): self.assertEqual(name.getEncoding(None), None) self.assertEqual(name.getEncoding(default=None), None) + def test_get_family_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("Copyright", 0, 1, 0, 0), + makeName("Family Name ID 1", 1, 1, 0, 0), + makeName("SubFamily Name ID 2", 2, 1, 0, 0), + makeName("Unique Name ID 3", 3, 1, 0, 0), + makeName("Full Name ID 4", 4, 1, 0, 0), + makeName("PS Name ID 6", 6, 1, 0, 0), + makeName("Version Name ID 5", 5, 1, 0, 0), + makeName("Trademark Name ID 7", 7, 1, 0, 0), + ] + + result_value = name.getBestFamilyName() + self.assertEqual("Family Name ID 1", result_value) + + expected_value = "Family Name ID 16" + name.setName(expected_value, 16, 1, 0, 0) + result_value = name.getBestFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 21" + name.setName(expected_value, 21, 1, 0, 0) + result_value = name.getBestFamilyName() + self.assertEqual(expected_value, result_value) + + def test_get_subfamily_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("Copyright", 0, 1, 0, 0), + makeName("Family Name ID 1", 1, 1, 0, 0), + makeName("SubFamily Name ID 2", 2, 1, 0, 0), + makeName("Unique Name ID 3", 3, 1, 0, 0), + makeName("Full Name ID 4", 4, 1, 0, 0), + makeName("PS Name ID 6", 6, 1, 0, 0), + makeName("Version Name ID 5", 5, 1, 0, 0), + makeName("Trademark Name ID 7", 7, 1, 0, 0), + ] + + result_value = name.getBestSubFamilyName() + self.assertEqual("SubFamily Name ID 2", result_value) + + expected_value = "Family Name ID 17" + name.setName(expected_value, 17, 1, 0, 0) + result_value = name.getBestSubFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 22" + name.setName(expected_value, 22, 1, 0, 0) + result_value = name.getBestSubFamilyName() + self.assertEqual(expected_value, result_value) + + def test_get_nice_full_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("NID 1", 1, 1, 0, 0), + makeName("NID 2", 2, 1, 0, 0), + makeName("NID 4", 4, 1, 0, 0), + makeName("NID 6", 6, 1, 0, 0), + ] + + result_value = name.getBestFullName() + self.assertEqual("NID 1 NID 2", result_value) + + expected_value = "NID 1 NID 2" + # expection is still NID 1 NID 2, + # because name ID 17 is missing + name.setName("NID 16", 16, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 17', 17, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 16 NID 17", result_value) + + expected_value = "NID 16 NID 17" + # expection is still NID 16 NID 17, + # because name ID 21 is missing + name.setName('NID 21', 21, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 22', 22, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 21 NID 22", result_value) + + for NID in [2, 16, 17, 21, 22]: + name.removeNames(NID) + + result_value = name.getBestFullName() + self.assertEqual("NID 4", result_value) + + name.setName('Regular', 2, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 1", result_value) + + if __name__ == "__main__": import sys sys.exit(unittest.main())