aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/misc/py23.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/misc/py23.py')
-rw-r--r--Lib/fontTools/misc/py23.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/Lib/fontTools/misc/py23.py b/Lib/fontTools/misc/py23.py
new file mode 100644
index 00000000..90217a33
--- /dev/null
+++ b/Lib/fontTools/misc/py23.py
@@ -0,0 +1,83 @@
+"""Python 2/3 compat layer."""
+
+from __future__ import print_function, division, absolute_import
+
+try:
+ basestring
+except NameError:
+ basestring = str
+
+try:
+ unicode
+except NameError:
+ unicode = str
+
+try:
+ unichr
+ bytechr = chr
+ byteord = ord
+except:
+ unichr = chr
+ def bytechr(n):
+ return bytes([n])
+ def byteord(c):
+ return c if isinstance(c, int) else ord(c)
+
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import BytesIO as StringIO
+
+def strjoin(iterable):
+ return ''.join(iterable)
+if str == bytes:
+ class Tag(str):
+ def tobytes(self):
+ if isinstance(self, bytes):
+ return self
+ else:
+ return self.encode('latin1')
+
+ def tostr(s, encoding='ascii'):
+ if not isinstance(s, str):
+ return s.encode(encoding)
+ else:
+ return s
+ tobytes = tostr
+
+ bytesjoin = strjoin
+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 __ne__(self, other):
+ return not self.__eq__(other)
+ 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')
+
+ def tostr(s, encoding='ascii'):
+ if not isinstance(s, str):
+ return s.decode(encoding)
+ else:
+ return s
+ def tobytes(s, encoding='ascii'):
+ if not isinstance(s, bytes):
+ return s.encode(encoding)
+ else:
+ return s
+
+ def bytesjoin(iterable):
+ return b''.join(tobytes(item) for item in iterable)