Add getEncoding() to cmap subtables

This commit is contained in:
Behdad Esfahbod 2015-04-19 03:50:55 -07:00
parent e561b758c1
commit 5a18fc83e6
2 changed files with 53 additions and 0 deletions

View File

@ -1,6 +1,7 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc.textTools import safeEval, readHex
from fontTools.misc.encodingTools import getEncoding
from fontTools.ttLib import getSearchRange
from fontTools.unicode import Unicode
from . import DefaultTable
@ -139,6 +140,18 @@ class CmapSubtable(object):
writer.endtag(self.__class__.__name__)
writer.newline()
def getEncoding(self, default=None):
"""Returns the Python encoding name for this cmap subtable based on its platformID,
platEncID, and language. If encoding for these values is not known, by default
None is returned. That can be overriden by passing a value to the default
argument.
Note that if you want to choose a "preferred" cmap subtable, most of the time
self.isUnicode() is what you want as that one only returns true for the modern,
commonly used, Unicode-compatible triplets, not the legacy ones.
"""
return getEncoding(self.platformID, self.platEncID, self.language, default)
def isUnicode(self):
return (self.platformID == 0 or
(self.platformID == 3 and self.platEncID in [0, 1, 10]))

View File

@ -0,0 +1,40 @@
from __future__ import print_function, division, absolute_import, unicode_literals
from fontTools.misc.py23 import *
import unittest
from ._c_m_a_p import CmapSubtable
class CmapSubtableTest(unittest.TestCase):
def makeSubtable(self, platformID, platEncID, langID):
subtable = CmapSubtable(None)
subtable.platformID, subtable.platEncID, subtable.language = (platformID, platEncID, langID)
return subtable
def test_toUnicode_utf16be(self):
subtable = self.makeSubtable(0, 2, 7)
self.assertEqual("utf-16be", subtable.getEncoding())
self.assertEqual(True, subtable.isUnicode())
def test_toUnicode_macroman(self):
subtable = self.makeSubtable(1, 0, 7) # MacRoman
self.assertEqual("mac-roman", subtable.getEncoding())
self.assertEqual(False, subtable.isUnicode())
def test_toUnicode_macromanian(self):
subtable = self.makeSubtable(1, 0, 37) # Mac Romanian
self.assertNotEqual(None, subtable.getEncoding())
self.assertEqual(False, subtable.isUnicode())
def test_extended_mac_encodings(self):
subtable = self.makeSubtable(1, 1, 0) # Mac Japanese
self.assertNotEqual(None, subtable.getEncoding())
self.assertEqual(False, subtable.isUnicode())
def test_extended_unknown(self):
subtable = self.makeSubtable(10, 11, 12)
self.assertEqual(subtable.getEncoding(), None)
self.assertEqual(subtable.getEncoding("ascii"), "ascii")
self.assertEqual(subtable.getEncoding(default="xyz"), "xyz")
if __name__ == "__main__":
unittest.main()