| """fontTools.misc.textTools.py -- miscellaneous routines.""" |
| |
| |
| from __future__ import print_function, division, absolute_import |
| from fontTools.misc.py23 import * |
| import ast |
| import string |
| |
| |
| safeEval = ast.literal_eval |
| |
| def readHex(content): |
| """Convert a list of hex strings to binary data.""" |
| return deHexStr(strjoin(chunk for chunk in content if isinstance(chunk, basestring))) |
| |
| 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): |
| 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: |
| i = byteord(c) |
| r = r + h[(i >> 4) & 0xF] + h[i & 0xF] |
| return r |
| |
| |
| def num2binary(l, bits=32): |
| items = [] |
| binary = "" |
| for i in range(bits): |
| if l & 0x1: |
| binary = "1" + binary |
| else: |
| binary = "0" + binary |
| l = l >> 1 |
| if not ((i+1) % 8): |
| items.append(binary) |
| binary = "" |
| if binary: |
| items.append(binary) |
| items.reverse() |
| assert l in (0, -1), "number doesn't fit in number of bits" |
| return ' '.join(items) |
| |
| |
| def binary2num(bin): |
| bin = strjoin(bin.split()) |
| 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: |
| return sorted(alist, key=lambda a: (a.lower(), a)) |
| except TypeError: |
| return sorted(alist) |
| |