fonttools/Lib/fontTools/misc/textTools.py

88 lines
1.9 KiB
Python
Raw Normal View History

"""fontTools.misc.textTools.py -- miscelaneous routines."""
from __future__ import print_function, division
from fontTools.misc.py23 import *
import string
def safeEval(data, eval=eval):
"""A (kindof) safe replacement for eval."""
return eval(data, {"__builtins__":{}})
def readHex(content):
"""Convert a list of hex strings to binary data."""
return deHexStr(strjoin([ chunk for chunk in content if isinstance(chunk,str) ]))
def deHexStr(hexdata):
"""Convert a hex string to binary data."""
hexdata = strjoin(hexdata.split())
if len(hexdata) % 2:
hexdata = hexdata + "0"
data = []
for i in range(0, len(hexdata), 2):
2013-11-27 15:19:40 -05:00
data.append(bytechr(int(hexdata[i:i+2], 16)))
return bytesjoin(data)
def hexStr(data):
"""Convert binary data to a hex string."""
h = string.hexdigits
r = ''
for c in data:
2013-11-27 18:13:48 -05:00
i = byteord(c)
r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
return r
def num2binary(l, bits=32):
all = []
bin = ""
for i in range(bits):
if l & 0x1:
bin = "1" + bin
else:
bin = "0" + bin
l = l >> 1
if not ((i+1) % 8):
all.append(bin)
bin = ""
if bin:
all.append(bin)
all.reverse()
assert l in (0, -1), "number doesn't fit in number of bits"
2013-11-27 05:47:34 -05:00
return ' '.join(all)
def binary2num(bin):
bin = strjoin(bin.split())
l = 0
for digit in bin:
l = l << 1
2013-11-27 02:40:30 -05:00
if digit != "0":
l = l | 0x1
return l
def caselessSort(alist):
"""Return a sorted copy of a list. If there are only strings
in the list, it will not consider case.
"""
try:
# turn ['FOO', 'aaBc', 'ABcD'] into
# [('foo', 'FOO'), ('aabc', 'aaBc'), ('abcd', 'ABcD')],
# but only if all elements are strings
2013-11-27 04:38:16 -05:00
tupledlist = [(item.lower(), item) for item in alist]
except TypeError:
# at least one element in alist is not a string, proceed the normal way...
2013-11-27 04:15:34 -05:00
alist = sorted(alist[:])
return alist
else:
tupledlist.sort()
# turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into
# ['aaBc', 'ABcD', 'FOO']
2013-11-27 04:38:16 -05:00
return [x[1] for x in tupledlist]