~ubuntu-branches/ubuntu/feisty/fonttools/feisty

« back to all changes in this revision

Viewing changes to Lib/fontTools/misc/textTools.py

  • Committer: Bazaar Package Importer
  • Author(s): Anthony Fok
  • Date: 2003-11-18 00:53:59 UTC
  • Revision ID: james.westby@ubuntu.com-20031118005359-pqirsxbgdz0f0xmx
Tags: upstream-1.99+2.0b1+cvs20031014
ImportĀ upstreamĀ versionĀ 1.99+2.0b1+cvs20031014

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""fontTools.misc.textTools.py -- miscelaneous routines."""
 
2
 
 
3
 
 
4
import string
 
5
 
 
6
 
 
7
def safeEval(data, eval=eval):
 
8
        """A safe replacement for eval."""
 
9
        return eval(data, {"__builtins__":{}}, {})
 
10
 
 
11
 
 
12
def readHex(content):
 
13
        """Convert a list of hex strings to binary data."""
 
14
        hexdata = ""
 
15
        for chunk in content:
 
16
                if type(chunk) == type(""):
 
17
                        hexdata = hexdata + chunk
 
18
        return deHexStr(hexdata)
 
19
 
 
20
def deHexStr(hexdata):
 
21
        """Convert a hex string to binary data."""
 
22
        parts = string.split(hexdata)
 
23
        hexdata = string.join(parts, "")
 
24
        if len(hexdata) % 2:
 
25
                hexdata = hexdata + "0"
 
26
        data = ""
 
27
        for i in range(0, len(hexdata), 2):
 
28
                data = data + chr(string.atoi(hexdata[i:i+2], 16))
 
29
        return data
 
30
 
 
31
def hexStr(data):
 
32
        """Convert binary data to a hex string."""
 
33
        h = string.hexdigits
 
34
        r = ''
 
35
        for c in data:
 
36
                i = ord(c)
 
37
                r = r + h[(i >> 4) & 0xF] + h[i & 0xF]
 
38
        return r
 
39
 
 
40
 
 
41
def num2binary(l, bits=32):
 
42
        all = []
 
43
        bin = ""
 
44
        for i in range(bits):
 
45
                if l & 0x1:
 
46
                        bin = "1" + bin
 
47
                else:
 
48
                        bin = "0" + bin
 
49
                l = l >> 1
 
50
                if not ((i+1) % 8):
 
51
                        all.append(bin)
 
52
                        bin = ""
 
53
        if bin:
 
54
                all.append(bin)
 
55
        all.reverse()
 
56
        assert l in (0, -1), "number doesn't fit in number of bits"
 
57
        return string.join(all, " ")
 
58
 
 
59
 
 
60
def binary2num(bin):
 
61
        bin = string.join(string.split(bin), "")
 
62
        l = 0
 
63
        for digit in bin:
 
64
                l = l << 1
 
65
                if digit <> "0":
 
66
                        l = l | 0x1
 
67
        return l
 
68
 
 
69
 
 
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.
 
73
        """
 
74
        
 
75
        try:
 
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)
 
81
        except TypeError:
 
82
                # at least one element in alist is not a string, proceed the normal way...
 
83
                alist = alist[:]
 
84
                alist.sort()
 
85
                return alist
 
86
        else:
 
87
                tupledlist.sort()
 
88
                # turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into 
 
89
                # ['aaBc', 'ABcD', 'FOO']
 
90
                return map(lambda x: x[1], tupledlist)
 
91