File: Entities.py

package info (click to toggle)
plastex 3.1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,132 kB
  • sloc: python: 23,341; xml: 18,076; javascript: 7,755; ansic: 46; makefile: 40; sh: 26
file content (91 lines) | stat: -rw-r--r-- 2,508 bytes parent folder | download | duplicates (2)
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'))