File: textTools.py

package info (click to toggle)
python-enable 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 7,220 kB
  • sloc: cpp: 57,417; python: 28,437; makefile: 314; sh: 43
file content (91 lines) | stat: -rw-r--r-- 2,738 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""fontTools.misc.textTools.py -- miscelaneous routines."""


import string


def safeEval(data, eval=eval):
        """A safe replacement for eval."""
        return eval(data, {"__builtins__":{}}, {})


def readHex(content):
        """Convert a list of hex strings to binary data."""
        hexdata = ""
        for chunk in content:
                if type(chunk) == type(""):
                        hexdata = hexdata + chunk
        return deHexStr(hexdata)

def deHexStr(hexdata):
        """Convert a hex string to binary data."""
        parts = string.split(hexdata)
        hexdata = string.join(parts, "")
        if len(hexdata) % 2:
                hexdata = hexdata + "0"
        data = ""
        for i in range(0, len(hexdata), 2):
                data = data + chr(string.atoi(hexdata[i:i+2], 16))
        return data

def hexStr(data):
        """Convert binary data to a hex string."""
        h = string.hexdigits
        r = ''
        for c in data:
                i = ord(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"
        return string.join(all, " ")


def binary2num(bin):
        bin = string.join(string.split(bin), "")
        l = 0
        for digit in bin:
                l = l << 1
                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
                tupledlist = map(lambda item, lower = string.lower:
                        (lower(item), item), alist)
        except TypeError:
                # at least one element in alist is not a string, proceed the normal way...
                alist = alist[:]
                alist.sort()
                return alist
        else:
                tupledlist.sort()
                # turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into
                # ['aaBc', 'ABcD', 'FOO']
                return map(lambda x: x[1], tupledlist)