blob: f44c13c8cc7b034d64464cdb0b90bb3d6d8fe50a [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
7
8
9_data_rx = re.compile(r"[^\\][^\\]*")
10
11def decode(s):
12 r = ''
13 while s:
14 m = _data_rx.match(s)
15 if m:
16 r = r + m.group()
17 s = s[len(m.group()):]
18 elif s[1] == "\\":
19 r = r + "\\"
20 s = s[2:]
21 elif s[1] == "n":
22 r = r + "\n"
23 s = s[2:]
24 else:
25 raise ValueError, "can't handle " + `s`
26 return r
27
28
29_charmap = {}
30for c in map(chr, range(256)):
31 _charmap[c] = c
32_charmap["\n"] = r"\n"
33_charmap["\\"] = r"\\"
34del c
35
36def encode(s):
37 return string.join(map(_charmap.get, s), '')
38
39
40import xml.dom.esis_builder
41
42
43class ExtendedEsisBuilder(xml.dom.esis_builder.EsisBuilder):
44 def __init__(self, *args, **kw):
45 self.__empties = {}
46 self.__is_empty = 0
47 apply(xml.dom.esis_builder.EsisBuilder.__init__, (self,) + args, kw)
48
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
76 else:
77 sys.stderr.write('Unknown event: %s\n' % line)
78
79 def get_empties(self):
80 return self.__empties.keys()