From 5a18fc83e6abb29bd795b8a65dc9a320fb20be64 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 19 Apr 2015 03:50:55 -0700 Subject: [PATCH] Add getEncoding() to cmap subtables --- Lib/fontTools/ttLib/tables/_c_m_a_p.py | 13 +++++++ Lib/fontTools/ttLib/tables/_c_m_a_p_test.py | 40 +++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 Lib/fontTools/ttLib/tables/_c_m_a_p_test.py diff --git a/Lib/fontTools/ttLib/tables/_c_m_a_p.py b/Lib/fontTools/ttLib/tables/_c_m_a_p.py index 29f5a1977..9f94035eb 100644 --- a/Lib/fontTools/ttLib/tables/_c_m_a_p.py +++ b/Lib/fontTools/ttLib/tables/_c_m_a_p.py @@ -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])) diff --git a/Lib/fontTools/ttLib/tables/_c_m_a_p_test.py b/Lib/fontTools/ttLib/tables/_c_m_a_p_test.py new file mode 100644 index 000000000..1ae5202b7 --- /dev/null +++ b/Lib/fontTools/ttLib/tables/_c_m_a_p_test.py @@ -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()