示例#1
0
 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()
示例#2
0
 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)
示例#3
0
	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))
示例#4
0
 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))
示例#5
0
    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)
示例#6
0
	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")
示例#7
0
	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))
示例#8
0
	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))
示例#9
0
	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))
示例#10
0
	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))
示例#11
0
	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))
示例#12
0
	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))
示例#13
0
	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))
示例#14
0
 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")
示例#15
0
	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))
示例#16
0
	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))
示例#17
0
	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))
示例#18
0
	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))
示例#19
0
	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))
示例#20
0
    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)
示例#21
0
    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 + "�")
示例#22
0
 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))
示例#24
0
 def test_toUnicode_singleChar(self):
     # https://github.com/fonttools/fonttools/issues/1997
     name = makeName("A", 256, 3, 1, 0x409)
     self.assertEqual(name.toUnicode(), "A")
示例#25
0
	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)
示例#26
0
 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())
示例#27
0
 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)
示例#28
0
 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())
示例#29
0
 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())
示例#30
0
	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())
示例#31
0
	def test_extended_mac_encodings(self):
		name = makeName(b'\xfe', 123, 1, 1, 0) # Mac Japanese
		self.assertEqual(name.toUnicode(), unichr(0x2122))
示例#32
0
 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)
示例#33
0
    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
示例#34
0
	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 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))
示例#36
0
	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)
示例#37
0
 def makeName(uString, nameID, platformID, platEncID, langID):
     return _n_a_m_e.makeName(uString, nameID, platformID, platEncID,
                              langID)
示例#38
0
	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())