1
"""fontTools.misc.textTools.py -- miscelaneous routines."""
7
def safeEval(data, eval=eval):
8
"""A safe replacement for eval."""
9
return eval(data, {"__builtins__":{}}, {})
13
"""Convert a list of hex strings to binary data."""
16
if type(chunk) == type(""):
17
hexdata = hexdata + chunk
18
return deHexStr(hexdata)
20
def deHexStr(hexdata):
21
"""Convert a hex string to binary data."""
22
parts = string.split(hexdata)
23
hexdata = string.join(parts, "")
25
hexdata = hexdata + "0"
27
for i in range(0, len(hexdata), 2):
28
data = data + chr(string.atoi(hexdata[i:i+2], 16))
32
"""Convert binary data to a hex string."""
37
r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
41
def num2binary(l, bits=32):
56
assert l in (0, -1), "number doesn't fit in number of bits"
57
return string.join(all, " ")
61
bin = string.join(string.split(bin), "")
70
def caselessSort(alist):
71
"""Return a sorted copy of a list. If there are only strings
72
in the list, it will not consider case.
76
# turn ['FOO', 'aaBc', 'ABcD'] into
77
# [('foo', 'FOO'), ('aabc', 'aaBc'), ('abcd', 'ABcD')],
78
# but only if all elements are strings
79
tupledlist = map(lambda item, lower = string.lower:
80
(lower(item), item), alist)
82
# at least one element in alist is not a string, proceed the normal way...
88
# turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into
89
# ['aaBc', 'ABcD', 'FOO']
90
return map(lambda x: x[1], tupledlist)