Merge pull request #299 from brawer/name

Helper function to find a debug string for a name
This commit is contained in:
Sascha Brawer 2015-06-24 14:58:25 +02:00
commit feeab5afa1
2 changed files with 58 additions and 22 deletions

View File

@ -90,6 +90,23 @@ class table__n_a_m_e(DefaultTable.DefaultTable):
return namerecord
return None # not found
def getDebugName(self, nameID):
englishName = someName = None
for name in self.names:
try:
unistr = name.toUnicode()
except UnicodeDecodeError:
unistr = None
if name.nameID == nameID and unistr:
someName = unistr
if (name.platformID, name.langID) in ((1, 0), (3, 0x409)):
englishName = unistr
if englishName:
return englishName
elif someName:
return someName
else:
return None
class NameRecord(object):

View File

@ -1,34 +1,53 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, division, absolute_import, unicode_literals
from fontTools.misc.py23 import *
from fontTools.misc.xmlWriter import XMLWriter
import unittest
from ._n_a_m_e import NameRecord
from ._n_a_m_e import table__n_a_m_e, NameRecord
def makeName(text, nameID, platformID, platEncID, langID):
name = NameRecord()
name.nameID, name.platformID, name.platEncID, name.langID = (
nameID, platformID, platEncID, langID)
name.string = tobytes(text, encoding=name.getEncoding())
return name
class NameTableTest(unittest.TestCase):
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))
class NameRecordTest(unittest.TestCase):
def makeName(self, text, nameID, platformID, platEncID, langID):
name = NameRecord()
name.nameID, name.platformID, name.platEncID, name.langID = (nameID, platformID, platEncID, langID)
name.string = tobytes(text, encoding=name.getEncoding())
return name
def test_toUnicode_utf16be(self):
name = self.makeName("Foo Bold", 111, 0, 2, 7)
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 = self.makeName("Foo Italic", 222, 1, 0, 7) # MacRoman
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 = self.makeName(b"Foo Italic\xfb", 222, 1, 0, 37) # Mac Romanian
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_toUnicode_UnicodeDecodeError(self):
name = self.makeName(b"\1", 111, 0, 2, 7)
name = makeName(b"\1", 111, 0, 2, 7)
self.assertEqual("utf_16_be", name.getEncoding())
self.assertRaises(UnicodeDecodeError, name.toUnicode)
@ -39,7 +58,7 @@ class NameRecordTest(unittest.TestCase):
return xml.split(writer.newlinestr.decode("utf_8"))[1:]
def test_toXML_utf16be(self):
name = self.makeName("Foo Bold", 111, 0, 2, 7)
name = makeName("Foo Bold", 111, 0, 2, 7)
self.assertEqual([
'<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">',
' Foo Bold',
@ -47,7 +66,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_utf16be_odd_length1(self):
name = self.makeName(b"\0F\0o\0o\0", 111, 0, 2, 7)
name = makeName(b"\0F\0o\0o\0", 111, 0, 2, 7)
self.assertEqual([
'<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">',
' Foo',
@ -55,7 +74,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_utf16be_odd_length2(self):
name = self.makeName(b"\0Fooz", 111, 0, 2, 7)
name = makeName(b"\0Fooz", 111, 0, 2, 7)
self.assertEqual([
'<namerecord nameID="111" platformID="0" platEncID="2" langID="0x7">',
' Fooz',
@ -63,7 +82,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_utf16be_double_encoded(self):
name = self.makeName(b"\0\0\0F\0\0\0o", 111, 0, 2, 7)
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',
@ -71,7 +90,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_macroman(self):
name = self.makeName("Foo Italic", 222, 1, 0, 7) # MacRoman
name = makeName("Foo Italic", 222, 1, 0, 7) # MacRoman
self.assertEqual([
'<namerecord nameID="222" platformID="1" platEncID="0" langID="0x7" unicode="True">',
' Foo Italic',
@ -79,7 +98,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_macroman_actual_utf16be(self):
name = self.makeName("\0F\0o\0o", 222, 1, 0, 7)
name = makeName("\0F\0o\0o", 222, 1, 0, 7)
self.assertEqual([
'<namerecord nameID="222" platformID="1" platEncID="0" langID="0x7" unicode="True">',
' Foo',
@ -87,7 +106,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_unknownPlatEncID_nonASCII(self):
name = self.makeName(b"B\x8arli", 333, 1, 9876, 7) # Unknown Mac encodingID
name = makeName(b"B\x8arli", 333, 1, 9876, 7) # Unknown Mac encodingID
self.assertEqual([
'<namerecord nameID="333" platformID="1" platEncID="9876" langID="0x7" unicode="False">',
' B&#138;rli',
@ -95,7 +114,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_toXML_unknownPlatEncID_ASCII(self):
name = self.makeName(b"Barli", 333, 1, 9876, 7) # Unknown Mac encodingID
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',
@ -103,7 +122,7 @@ class NameRecordTest(unittest.TestCase):
], self.toXML(name))
def test_encoding_macroman_misc(self):
name = self.makeName('', 123, 1, 0, 17) # Mac Turkish
name = makeName('', 123, 1, 0, 17) # Mac Turkish
self.assertEqual(name.getEncoding(), "mac_turkish")
name.langID = 37
self.assertEqual(name.getEncoding(), "mac_romanian")
@ -111,11 +130,11 @@ class NameRecordTest(unittest.TestCase):
self.assertEqual(name.getEncoding(), "mac_roman")
def test_extended_mac_encodings(self):
name = self.makeName(b'\xfe', 123, 1, 1, 0) # Mac Japanese
name = makeName(b'\xfe', 123, 1, 1, 0) # Mac Japanese
self.assertEqual(name.toUnicode(), unichr(0x2122))
def test_extended_unknown(self):
name = self.makeName(b'\xfe', 123, 10, 11, 12)
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)