blob: b89476ca087c63a3b27ad67fd175d908a37fff19 [file] [log] [blame]
Fred Drake3843bae1998-12-01 19:00:58 +00001"""Miscellaneous utility functions useful for dealing with ESIS streams."""
2__version__ = '$Revision$'
3
4import re
5import string
6import sys
Fred Drake26976941999-05-07 21:14:28 +00007import xml.dom.core
8import xml.dom.esis_builder
Fred Drake3843bae1998-12-01 19:00:58 +00009
10
11_data_rx = re.compile(r"[^\\][^\\]*")
12
13def decode(s):
14 r = ''
15 while s:
16 m = _data_rx.match(s)
17 if m:
18 r = r + m.group()
19 s = s[len(m.group()):]
20 elif s[1] == "\\":
21 r = r + "\\"
22 s = s[2:]
23 elif s[1] == "n":
24 r = r + "\n"
25 s = s[2:]
26 else:
27 raise ValueError, "can't handle " + `s`
28 return r
29
30
31_charmap = {}
32for c in map(chr, range(256)):
33 _charmap[c] = c
34_charmap["\n"] = r"\n"
35_charmap["\\"] = r"\\"
36del c
37
38def encode(s):
39 return string.join(map(_charmap.get, s), '')
40
41
Fred Drake3843bae1998-12-01 19:00:58 +000042class ExtendedEsisBuilder(xml.dom.esis_builder.EsisBuilder):
43 def __init__(self, *args, **kw):
44 self.__empties = {}
45 self.__is_empty = 0
46 apply(xml.dom.esis_builder.EsisBuilder.__init__, (self,) + args, kw)
Fred Drakeada2de61999-07-29 22:13:31 +000047 self.buildFragment()
Fred Drake3843bae1998-12-01 19:00:58 +000048
49 def feed(self, data):
50 for line in string.split(data, '\n'):
51 if not line:
52 break
53 event = line[0]
54 text = line[1:]
55 if event == '(':
56 element = self.document.createElement(text, self.attr_store)
57 self.attr_store = {}
58 self.push(element)
59 if self.__is_empty:
60 self.__empties[text] = text
61 self.__is_empty = 0
62 elif event == ')':
63 self.pop()
64 elif event == 'A':
65 l = re.split(' ', text, 2)
66 name = l[0]
67 value = decode(l[2])
68 self.attr_store[name] = value
69 elif event == '-':
70 text = self.document.createText(decode(text))
71 self.push(text)
72 elif event == 'C':
73 return
74 elif event == 'e':
75 self.__is_empty = 1
Fred Drakeabb158f1999-08-26 18:04:32 +000076 elif event == '&':
77 eref = self.document.createEntityReference(text)
78 self.push(eref)
Fred Drake3843bae1998-12-01 19:00:58 +000079 else:
80 sys.stderr.write('Unknown event: %s\n' % line)
Fred Drakeabb158f1999-08-26 18:04:32 +000081
Fred Drake3843bae1998-12-01 19:00:58 +000082 def get_empties(self):
83 return self.__empties.keys()