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
|
"""
This package is dynamically generated. It loads data from the ent.xml file.
"""
import re, Accents, Characters
from xml.parsers import expat
from plasTeX import Command
g = globals()
class EntityParser(object):
""" Parser for XML entities """
accentmap = {
'\'': Accents.Acute,
'^': Accents.Circumflex,
'`': Accents.Grave,
'~': Accents.Tilde,
'"': Accents.Umlaut,
'c': Accents.c,
'v': Accents.v,
'u': Accents.u,
'k': Accents.k,
'.': Accents.Dot,
'=': Accents.Macron,
'H': Accents.H,
'r': Accents.r,
}
def __init__(self):
self.parser = expat.ParserCreate()
self.parser.StartElementHandler = self.start_element
self.parser.CharacterDataHandler = self.char_data
self.str = None
self.inseq = False
self.defined = {}
def parse(self, file):
self.parser.Parse(open(file).read())
self.defined.clear()
def start_element(self, name, attrs):
if name == 'char':
self.str = None
elif name == 'str':
self.str = int('0x%s' % attrs['value'], 16)
elif name in ['seq','mathseq']:
self.inseq = True
else:
self.inseq = False
def char_data(self, data):
if self.str is None:
self.inseq = False
return
if not self.inseq:
return
# Just a macro
m = re.match(r'^\\(\w+|\W)$', data)
if m:
name = str(m.group(1)).replace('\\','\\\\')
if name not in self.defined:
g[name+'_'] = type(name+'_', (Command,),
{'str':chr(self.str),
'macroName':name})
self.defined[name] = True
# Wingdings
m = re.match(r'^\\ding\{(\d+)\}$', data)
if m:
int(m.group(1))
Characters.ding.values[int(m.group(1))] = chr(self.str)
# Accented characters
m = re.match(r'^(\\(%s)\{([^\}])\})' %
'|'.join(list(self.accentmap.keys())), data)
if m and m.group(1) not in self.defined:
accent = self.accentmap[m.group(2)]
accent.chars[m.group(3)] = chr(self.str)
self.defined[m.group(1)] = True
self.inseq = False
# Parse the entities file
#e = EntityParser()
#e.parse(os.path.join(os.path.dirname(__file__),'ent.xml'))
|