From c50f38ed0e6819bd9e8a7020dbf239fb8327ab28 Mon Sep 17 00:00:00 2001 From: Olli Meier Date: Wed, 9 Feb 2022 17:06:02 +0100 Subject: [PATCH] extend name table with getFamilyName, getSubFamilyName and getNiceFullName + unittests --- .gitignore | 1 + Lib/fontTools/ttLib/tables/_n_a_m_e.py | 31 ++++++++ Tests/Snippets/rename-fonts_test.py | 50 +++++++++++++ Tests/ttLib/tables/_n_a_m_e_test.py | 97 ++++++++++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 Tests/Snippets/rename-fonts_test.py 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..b9a87e579 100644 --- a/Lib/fontTools/ttLib/tables/_n_a_m_e.py +++ b/Lib/fontTools/ttLib/tables/_n_a_m_e.py @@ -120,6 +120,37 @@ class table__n_a_m_e(DefaultTable.DefaultTable): else: return None + def getFamilyName(self): + for nameID in (21, 16, 1): + name = self.getDebugName(nameID) + if name is not None: + return name + return None + + def getSubFamilyName(self): + for nameID in (22, 17, 2): + name = self.getDebugName(nameID) + if name is not None: + return name + return None + + def getNiceFullName(self): + 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 if 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/Tests/Snippets/rename-fonts_test.py b/Tests/Snippets/rename-fonts_test.py new file mode 100644 index 000000000..86438b5df --- /dev/null +++ b/Tests/Snippets/rename-fonts_test.py @@ -0,0 +1,50 @@ +# coding=utf-8 + +""" +This test is for checking function within rename-fonts + +""" + +import unittest +from fontTools.misc.testTools import FakeFont +from fontTools.ttLib.tables._n_a_m_e import (table__n_a_m_e, NameRecord, nameRecordFormat, nameRecordSize, makeName, log) +from fonttools.Snippets.rename-fonts import get_current_family_name + + +class RenameFontsTest(unittest.TestCase): + @classmethod + def setUp(self): + self.font = FakeFont(['.nodef', 'A', 'B', 'C']) + 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), + ] + + self.font['name'] = name + + def test_get_current_family_name(self): + + result_value = get_current_family_name(self.font['name']) + self.assertEqual("Family Name ID 1", result_value) + + expected_value = "Family Name ID 16" + self.font['name'].setName(expected_value, 16, 1, 0, 0) + result_value = get_current_family_name(self.font['name']) + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 21" + self.font['name'].setName(expected_value, 21, 1, 0, 0) + result_value = get_current_family_name(self.font['name']) + self.assertEqual(expected_value, result_value) + + +if __name__ == "__main__": + import sys + sys.exit(unittest.main()) diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index 38fbfef78..93c728eb7 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.getFamilyName() + 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.getFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 21" + name.setName(expected_value, 21, 1, 0, 0) + result_value = name.getFamilyName() + 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.getSubFamilyName() + self.assertEqual("Family Name ID 2", result_value) + + expected_value = "Family Name ID 17" + name.setName(expected_value, 16, 1, 0, 0) + result_value = name.getSubFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 22" + name.setName(expected_value, 21, 1, 0, 0) + result_value = name.getSubFamilyName() + 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.getNiceFullName() + 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.getNiceFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 17', 17, 1, 0, 0) + result_value = name.getNiceFullName() + 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.getNiceFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 22', 22, 1, 0, 0) + result_value = name.getNiceFullName() + self.assertEqual("NID 21 NID 22", result_value) + + for NID in [2, 16, 17, 21, 22]: + name.removeNames(NID) + + result_value = name.getNiceFullName() + self.assertEqual("NID 4", result_value) + + name.setName('Regular', 2, 1, 0, 0) + result_value = name.getNiceFullName() + self.assertEqual("NID 1", result_value) + + if __name__ == "__main__": import sys sys.exit(unittest.main())