def test_names_sort_bytes_str_encoding_error(self): table = table__n_a_m_e() table.names = [ makeName("Test寬", 25, 1, 0, 0), makeName("Test鬆鬆", 25, 1, 0, 0), ] with self.assertRaises(TypeError): table.names.sort()
def test_names_sort_bytes_str(self): # Corner case: If a user appends a name record directly to `names`, the # `__lt__` method on NameRecord may run into duplicate name records where # one `string` is a str and the other one bytes, leading to an exception. table = table__n_a_m_e() table.names = [ makeName("Test", 25, 3, 1, 0x409), makeName("Test".encode("utf-16be"), 25, 3, 1, 0x409), ] table.compile(None)
def test_getDebugName(self): table = table__n_a_m_e() table.names = [ makeName("Bold", 258, 1, 0, 0), # Mac, MacRoman, English makeName("Gras", 258, 1, 0, 1), # Mac, MacRoman, French makeName("Fett", 258, 1, 0, 2), # Mac, MacRoman, German makeName("Sem Fracções", 292, 1, 0, 8) # Mac, MacRoman, Portuguese ] self.assertEqual("Bold", table.getDebugName(258)) self.assertEqual("Sem Fracções", table.getDebugName(292)) self.assertEqual(None, table.getDebugName(999))
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_encoding_macroman_misc(self): name = makeName('', 123, 1, 0, 17) # Mac Turkish self.assertEqual(name.getEncoding(), "mac_turkish") name.langID = 37 self.assertEqual(name.getEncoding(), "mac_romanian") name.langID = 45 # Other self.assertEqual(name.getEncoding(), "mac_roman")
def test_toXML_unknownPlatEncID_ASCII(self): name = makeName(b"Barli", 333, 1, 9876, 7) # Unknown Mac encodingID self.assertEqual([ '<namerecord nameID="333" platformID="1" platEncID="9876" langID="0x7" unicode="True">', ' Barli', '</namerecord>' ], self.toXML(name))
def test_toXML_macroman_actual_utf16be(self): name = makeName("\0F\0o\0o", 222, 1, 0, 7) self.assertEqual([ '<namerecord nameID="222" platformID="1" platEncID="0" langID="0x7" unicode="True">', ' Foo', '</namerecord>' ], self.toXML(name))
def test_toXML_macroman(self): name = makeName("Foo Italic", 222, 1, 0, 7) # MacRoman self.assertEqual([ '<namerecord nameID="222" platformID="1" platEncID="0" langID="0x7" unicode="True">', ' Foo Italic', '</namerecord>' ], self.toXML(name))
def test_toXML_utf16be_double_encoded(self): name = makeName(b"\0\0\0F\0\0\0o", 111, 0, 2, 7) self.assertEqual([ '<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">', ' Fo', '</namerecord>' ], self.toXML(name))
def test_toXML_utf16be_odd_length2(self): name = makeName(b"\0Fooz", 111, 0, 2, 7) self.assertEqual([ '<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">', ' Fooz', '</namerecord>' ], self.toXML(name))
def test_toXML_utf16be(self): name = makeName("Foo Bold", 111, 0, 2, 7) self.assertEqual([ '<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">', ' Foo Bold', '</namerecord>' ], self.toXML(name))
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)
def test_extended_mac_encodings_errors(self): s = "汉仪彩云体简" name = makeName(s.encode("x_mac_simp_chinese_ttx"), 123, 1, 25, 0) # first check we round-trip with 'strict' self.assertEqual(name.toUnicode(errors="strict"), s) # append an incomplete invalid sequence and check that we handle # errors with the requested error handler name.string += b"\xba" self.assertEqual(name.toUnicode(errors="backslashreplace"), s + "\\xba") self.assertEqual(name.toUnicode(errors="replace"), s + "�")
def test_extended_mac_encodings(self): name = makeName(b'\xfe', 123, 1, 1, 0) # Mac Japanese self.assertEqual(name.toUnicode(), chr(0x2122))
def makeOneInstanceFromVF(family, loca): family = "".join(family.split(" ")) # print(family) path, folder = getFile(".designspace", family) ds = openDesignSpace(path) axesName = dict() ax = dict() maps = dict() for a in ds.axes: ax[a.tag] = a.name axesName[a.name] = a.tag if a.map: maps[a.name] = a.map locaStyleName, familyName = stockDSstylename(ds) location = str(loca) ##### READ THE MAP ##### for tag in loca: print(">>> Now creating the", loca, "instance of " + family) name = ax[tag] if name in maps: for i in maps[name]: if int(loca[tag]) == int(i[1]): locationValue = i[0] loca[tag] = round(locationValue) else: pass for i in ax: location = location.replace(i, ax[i]) styleName = locaStyleName[location] destination = folder + "/fonts/static/" if not os.path.exists(destination): os.makedirs(destination) varFontPath = folder + "/fonts/VAR/" + family + "-VF.ttf" if not os.path.exists(varFontPath): print("\nMake Variable first") makeVariableFonts(family) varFont = TTFont(varFontPath) revision = varFont['head'].fontRevision V_major = str(revision).split(".")[0] V_minor = str(revision).split(".")[1] fontName = '-'.join( [familyName.replace(" ", ""), styleName.replace(" ", "")]) + '.ttf' # familyName = instance.familyName static = instantiateVariableFont(varFont, loca, inplace=False) # print(static['name'].names) #<NameRecord NameID=14; PlatformID=3; LanguageID=1033> for namerecord in static['name'].names: if namerecord.nameID == 1: if styleName in ["Bold", "Regular", "Italic", "Bold Italic"]: namerecord.string = familyName else: namerecord.string = familyName + " " + styleName n16_p3 = makeName(familyName, 16, 3, 1, 0x409) n16_p1 = makeName(familyName, 16, 1, 0, 0x0) static['name'].names.append(n16_p3) static['name'].names.append(n16_p1) n17_p3 = (makeName(styleName, 17, 3, 1, 0x409)) n17_p1 = (makeName(styleName, 17, 1, 0, 0x0)) static['name'].names.append(n17_p3) static['name'].names.append(n17_p1) if namerecord.nameID == 2: if styleName in ["Bold", "Regular", "Italic", "Bold Italic"]: namerecord.string = styleName elif "Italic" in styleName: namerecord.string = "Italic" else: namerecord.string = "Regular" if namerecord.nameID == 5: namerecord.string = 'Version %s.%s' % (V_major, V_minor) if namerecord.nameID == 3: PSName = ''.join(familyName.split(' ')) + '-' + ''.join( styleName.split(' ')) namerecord.string = '%s.%s' % (V_major, V_minor) + ';' + '%s' % PSName + ';' if namerecord.nameID == 4: namerecord.string = familyName + " " + styleName if namerecord.nameID == 6: namerecord.string = ''.join(familyName.split(' ')) + '-' + ''.join( styleName.split(' ')) if namerecord.nameID == 16: namerecord.string = familyName if namerecord.nameID == 17: namerecord.string = styleName static.save(os.path.join(destination, fontName))
def test_toUnicode_singleChar(self): # https://github.com/fonttools/fonttools/issues/1997 name = makeName("A", 256, 3, 1, 0x409) self.assertEqual(name.toUnicode(), "A")
def test_toUnicode_UnicodeDecodeError(self): name = makeName(b"\1", 111, 0, 2, 7) self.assertEqual("utf_16_be", name.getEncoding()) self.assertRaises(UnicodeDecodeError, name.toUnicode)
def test_toUnicode_macromanian(self): name = makeName(b"Foo Italic\xfb", 222, 1, 0, 37) # Mac Romanian self.assertEqual("mac_romanian", name.getEncoding()) self.assertEqual("Foo Italic" + chr(0x02DA), name.toUnicode())
def test_toUnicode_utf16be(self): name = makeName("Foo Bold", 111, 0, 2, 7) self.assertEqual("utf_16_be", name.getEncoding()) self.assertEqual("Foo Bold", name.toUnicode())
def test_toUnicode_macroman(self): name = makeName("Foo Italic", 222, 1, 0, 7) # MacRoman self.assertEqual("mac_roman", name.getEncoding()) self.assertEqual("Foo Italic", name.toUnicode())
def test_toUnicode_macromanian(self): name = makeName(b"Foo Italic\xfb", 222, 1, 0, 37) # Mac Romanian self.assertEqual("mac_romanian", name.getEncoding()) self.assertEqual("Foo Italic"+unichr(0x02DA), name.toUnicode())
def test_extended_mac_encodings(self): name = makeName(b'\xfe', 123, 1, 1, 0) # Mac Japanese self.assertEqual(name.toUnicode(), unichr(0x2122))
def test_extended_unknown(self): name = makeName(b'\xfe', 123, 10, 11, 12) self.assertEqual(name.getEncoding(), "ascii") self.assertEqual(name.getEncoding(None), None) self.assertEqual(name.getEncoding(default=None), None)
def renamer(self): if "." in self.version: vMaj = self.version.split(".")[0] vMin = self.version.split(".")[1] else: vMaj, vMin = self.version, "000" isThere17 = False isThere16 = False if self.newName: renamedFont = self.font for namerecord in renamedFont["name"].names: namerecord.string = namerecord.toUnicode() if namerecord.nameID == 1: name = namerecord.string if namerecord.nameID == 2: WeightName = namerecord.string if namerecord.nameID == 16: name = namerecord.string if namerecord.nameID == 17: WeightName = namerecord.string WeightName = self.tempStyle for namerecord in renamedFont["name"].names: namerecord.string = namerecord.toUnicode() # Create the naming of the font Family + style if the style is non RBIBI if namerecord.nameID == 1: if WeightName in [ "Bold", "Regular", "Italic", "Bold Italic" ]: namerecord.string = self.newName else: namerecord.string = self.newName + " " + WeightName if namerecord.nameID == 2: if self.italicName == "Italic": if WeightName not in ["Bold", "Bold Italic"]: namerecord.string = "Italic" elif WeightName == "Bold": namerecord.string = "Bold Italic" elif WeightName == "Bold": namerecord.string = "Bold" else: namerecord.string = "Regular" if namerecord.nameID == 3: if self.italicName == "Italic": if WeightName == "Regular": WeightName = "Italic" else: WeightName = (WeightName.replace("Italic", "") + " " + self.italicName) unicID = namerecord.string.split(";") newUnicID = (self.version + ";" + unicID[1] + ";" + "".join(self.newName.split(" ")) + "-" + "".join(WeightName.split(" "))) namerecord.string = newUnicID if namerecord.nameID == 4: namerecord.string = self.newName + " " + WeightName if namerecord.nameID == 5: namerecord.string = "Version " + self.version if namerecord.nameID == 6: namerecord.string = ("".join(self.newName.split(" ")) + "-" + "".join(WeightName.split(" "))) if namerecord.nameID == 16: namerecord.string = self.newName isThere16 = True if namerecord.nameID == 17: namerecord.string = WeightName isThere17 = True if isThere17 is False: if WeightName not in [ "Italic", "Regular", "Bold", "Bold Italic" ]: n17_p3 = makeName(WeightName, 17, 3, 1, 0x409) renamedFont["name"].names.append(n17_p3) if isThere16 is False: if WeightName not in [ "Italic", "Regular", "Bold", "Bold Italic" ]: n16_p3 = makeName(self.newName, 16, 3, 1, 0x409) renamedFont["name"].names.append(n16_p3) renamedFont['head'].fontRevision = float(self.version) return renamedFont
def makeTTFInstancesFromVF(family): axesName = dict() path, folder = getFile(".designspace", family) designSpace = openDesignSpace(path) loca = dict() maps = dict() for a in designSpace.axes: if a.map: maps[a.name] = a.map varFontPath = folder + "/fonts/VAR/" + family + "-VF.ttf" if not os.path.exists(varFontPath): print("Make Variable first") makeVariableFonts(family) varFont = TTFont(varFontPath) revision = varFont['head'].fontRevision V_major = str(revision).split(".")[0] V_minor = str(revision).split(".")[1] #store axis name and axis tag in a dict for correspondance for a in designSpace.axes: axesName[a.name] = a.tag # read the location of instance and put in a new dict the tag # corresponding to the axis name as k and the location value as v for instance in designSpace.instances: location = dict(instance.location) for name in location: if name in maps: for i in maps[name]: if int(location[name]) == int(i[1]): locationValue = i[0] loca[axesName[name]] = round(locationValue) else: loca[axesName[name]] = int(location[name]) print(instance.name, loca) # ''.join(instance.familyName.split(' ')) fontName = '-'.join([''.join(instance.familyName.split(' ')), \ instance.styleName.replace(" ", "")]) + '.ttf' fi = instantiateVariableFont(varFont, loca, inplace=False) #build name table entries styleName = instance.styleName familyName = instance.familyName for namerecord in fi['name'].names: if namerecord.nameID == 1: if styleName in ["Bold", "Regular", "Italic", "Bold Italic"]: namerecord.string = familyName else: namerecord.string = familyName + " " + styleName n16 = makeName(familyName, 16, 3, 1, 0x409) n17 = (makeName(styleName, 17, 3, 1, 0x409)) fi['name'].names.append(n16) fi['name'].names.append(n17) if namerecord.nameID == 2: if styleName == "Bold": namerecord.string = "Bold" elif styleName == "Italic": namerecord.string = "Italic" elif styleName == "Bold Italic": namerecord.string = "Bold Italic" elif "Italic" in styleName: namerecord.string = "Italic" else: namerecord.string = "Regular" if namerecord.nameID == 5: namerecord.string = 'Version %s.%s' % (V_major, V_minor) if namerecord.nameID == 3: PSName = ''.join(familyName.split(' ')) + '-' + ''.join( styleName.split(' ')) namerecord.string = '%s.%s' % ( V_major, V_minor) + ';' + '%s' % PSName + ';' if namerecord.nameID == 4: namerecord.string = familyName + " " + styleName if namerecord.nameID == 6: namerecord.string = ''.join( familyName.split(' ')) + '-' + ''.join( styleName.split(' ')) destination = folder + "/fonts/instances/" if not os.path.exists(destination): os.makedirs(destination) fi.save(os.path.join(destination, fontName))
def makeName(uString, nameID, platformID, platEncID, langID): return _n_a_m_e.makeName(uString, nameID, platformID, platEncID, langID)