py23 Introduce Tag to autoconvert tag types
diff --git a/Lib/fontTools/misc/py23.py b/Lib/fontTools/misc/py23.py
index 09eadd3..bfaa498 100644
--- a/Lib/fontTools/misc/py23.py
+++ b/Lib/fontTools/misc/py23.py
@@ -22,3 +22,30 @@
from cStringIO import StringIO
except ImportError:
from io import StringIO
+
+if str == bytes:
+ class Tag(str):
+ def tobytes(self):
+ if isinstance(self, bytes):
+ return self
+ else:
+ return self.encode('latin-1')
+else:
+ class Tag(str):
+
+ @staticmethod
+ def transcode(blob):
+ if not isinstance(blob, str):
+ blob = blob.decode('latin-1')
+ return blob
+
+ def __new__(self, content):
+ return str.__new__(self, self.transcode(content))
+ def __eq__(self, other):
+ return str.__eq__(self, self.transcode(other))
+
+ def __hash__(self):
+ return str.__hash__(self)
+
+ def tobytes(self):
+ return self.encode('latin-1')
diff --git a/Lib/fontTools/ttLib/macUtils.py b/Lib/fontTools/ttLib/macUtils.py
index 086cbd6..fd8ba84 100644
--- a/Lib/fontTools/ttLib/macUtils.py
+++ b/Lib/fontTools/ttLib/macUtils.py
@@ -61,7 +61,7 @@
def __init__(self, path, res_name_or_index):
resref = MyOpenResFile(path)
Res.UseResFile(resref)
- if isinstance(res_name_or_index, type("")):
+ if isinstance(res_name_or_index, basestring):
res = Res.Get1NamedResource('sfnt', res_name_or_index)
else:
res = Res.Get1IndResource('sfnt', res_name_or_index)
diff --git a/Lib/fontTools/ttLib/sfnt.py b/Lib/fontTools/ttLib/sfnt.py
index a194d77..7115572 100644
--- a/Lib/fontTools/ttLib/sfnt.py
+++ b/Lib/fontTools/ttLib/sfnt.py
@@ -28,7 +28,7 @@
self.DirectoryEntry = SFNTDirectoryEntry
self.sfntVersion = self.file.read(4)
self.file.seek(0)
- if self.sfntVersion == "ttcf":
+ if self.sfntVersion == b"ttcf":
sstruct.unpack(ttcHeaderFormat, self.file.read(ttcHeaderSize), self)
assert self.Version == 0x00010000 or self.Version == 0x00020000, "unrecognized TTC version 0x%08x" % self.Version
if not 0 <= fontNumber < self.numFonts:
@@ -39,14 +39,15 @@
pass # ignoring version 2.0 signatures
self.file.seek(offsetTable[fontNumber])
sstruct.unpack(sfntDirectoryFormat, self.file.read(sfntDirectorySize), self)
- elif self.sfntVersion == "wOFF":
+ elif self.sfntVersion == b"wOFF":
self.flavor = "woff"
self.DirectoryEntry = WOFFDirectoryEntry
sstruct.unpack(woffDirectoryFormat, self.file.read(woffDirectorySize), self)
else:
sstruct.unpack(sfntDirectoryFormat, self.file.read(sfntDirectorySize), self)
+ self.sfntVersion = Tag(self.sfntVersion)
- if self.sfntVersion not in ("\000\001\000\000", "OTTO", "true"):
+ if self.sfntVersion not in ("\x00\x01\x00\x00", "OTTO", "true"):
from fontTools import ttLib
raise ttLib.TTLibError("Not a TrueType or OpenType font (bad sfntVersion)")
self.tables = {}
@@ -76,7 +77,7 @@
def __getitem__(self, tag):
"""Fetch the raw table data."""
- entry = self.tables[tag]
+ entry = self.tables[Tag(tag)]
data = entry.loadData (self.file)
if self.checkChecksums:
if tag == 'head':
@@ -93,7 +94,7 @@
return data
def __delitem__(self, tag):
- del self.tables[tag]
+ del self.tables[Tag(tag)]
def close(self):
self.file.close()
@@ -105,7 +106,7 @@
flavor=None, flavorData=None):
self.file = file
self.numTables = numTables
- self.sfntVersion = sfntVersion
+ self.sfntVersion = Tag(sfntVersion)
self.flavor = flavor
self.flavorData = flavorData
@@ -178,7 +179,7 @@
raise ttLib.TTLibError("wrong number of tables; expected %d, found %d" % (self.numTables, len(tables)))
if self.flavor == "woff":
- self.signature = "wOFF"
+ self.signature = b"wOFF"
self.reserved = 0
self.totalSfntSize = 12
diff --git a/Lib/fontTools/ttx.py b/Lib/fontTools/ttx.py
index ec9e1d8..092e2ab 100644
--- a/Lib/fontTools/ttx.py
+++ b/Lib/fontTools/ttx.py
@@ -258,14 +258,14 @@
if ext == ".dfont":
return "TTF"
header = f.read(256)
- head = header[:4]
+ head = Tag(header[:4])
if head == "OTTO":
return "OTF"
elif head == "ttcf":
return "TTC"
elif head in ("\0\1\0\0", "true"):
return "TTF"
- elif head in ("wOFF", "true"):
+ elif head == "wOFF":
return "WOFF"
elif head.lower() == "<?xm":
if opentypeheaderRE.search(header):