51 lines
1.2 KiB
Python
51 lines
1.2 KiB
Python
|
def _makeunicodes(f):
|
||
|
lines = iter(f.readlines())
|
||
|
unicodes = {}
|
||
|
for line in lines:
|
||
|
if not line:
|
||
|
continue
|
||
|
num, name = line.split(";")[:2]
|
||
|
if name[0] == "<":
|
||
|
continue # "<control>", etc.
|
||
|
num = int(num, 16)
|
||
|
unicodes[num] = name
|
||
|
return unicodes
|
||
|
|
||
|
|
||
|
class _UnicodeCustom(object):
|
||
|
def __init__(self, f):
|
||
|
if isinstance(f, str):
|
||
|
with open(f) as fd:
|
||
|
codes = _makeunicodes(fd)
|
||
|
else:
|
||
|
codes = _makeunicodes(f)
|
||
|
self.codes = codes
|
||
|
|
||
|
def __getitem__(self, charCode):
|
||
|
try:
|
||
|
return self.codes[charCode]
|
||
|
except KeyError:
|
||
|
return "????"
|
||
|
|
||
|
|
||
|
class _UnicodeBuiltin(object):
|
||
|
def __getitem__(self, charCode):
|
||
|
try:
|
||
|
# use unicodedata backport to python2, if available:
|
||
|
# https://github.com/mikekap/unicodedata2
|
||
|
import unicodedata2 as unicodedata
|
||
|
except ImportError:
|
||
|
import unicodedata
|
||
|
try:
|
||
|
return unicodedata.name(chr(charCode))
|
||
|
except ValueError:
|
||
|
return "????"
|
||
|
|
||
|
|
||
|
Unicode = _UnicodeBuiltin()
|
||
|
|
||
|
|
||
|
def setUnicodeData(f):
|
||
|
global Unicode
|
||
|
Unicode = _UnicodeCustom(f)
|