1 from xml.sax import handler
2
3
5 return s.replace(":", "__")
7 return s.replace("__", ":")
8
14
15
21
22
25 if objs is None:
26 self.objs = []
27 else:
28 self.objs = objs
39 newobjs = self.flatten()
40 if len(newobjs) == 1:
41 return newobjs[0]
42 return self.__class__(newobjs)
43
44
50 for obj in self.objs:
51 obj(tag, attrs)
52
58 for obj in self.objs:
59 obj(tag)
60
62 if meth1 is None:
63 assert meth2 is not None
64 return meth2
65 if meth2 is None:
66 return meth1
67 k = klass()
68 k.add(meth1)
69 k.add(meth2)
70 return k.simplify()
71
74 start_table = self._start_table = {}
75 end_table = self._end_table = {}
76 self._acquired = []
77 self._prefix = prefix
78 self.supported_features = []
79
80 for methodname in superdir(self):
81 if methodname.startswith("start_"):
82 method = getattr(self, methodname)
83 escaped_tagname = methodname[6:]
84 tagname = prefix + unescape(escaped_tagname)
85 assert not start_table.has_key(tagname)
86 start_table[tagname] = method
87 elif methodname.startswith("end_"):
88 method = getattr(self, methodname)
89 escaped_tagname = methodname[4:]
90 tagname = prefix + unescape(escaped_tagname)
91 assert not end_table.has_key(tagname)
92 end_table[tagname] = method
93
95 return self.supported_features
96
97
98 - def acquire(self, obj, prefix = ""):
128
137
139 raise AssertionError("Not yet set by a Dispatcher")
140
142 raise AssertionError("Not yet set by a Dispatcher")
143
144
149
150
153 self.obj = obj
154 self.new_tag = new_tag
159 self.obj = obj
160 self.new_tag = new_tag
163
164
165 -class Dispatcher(handler.ContentHandler, DispatchHandler):
166 """Adapter from the standard SAX events"""
167 - def __init__(self, prefix = "", remap = {}):
168 DispatchHandler.__init__(self, prefix)
169
170
171
172 for old_tagname, new_tagname in remap.items():
173 start = RemapStart(self, new_tagname)
174 method = _merge_methods(self._start_table.get(old_tagname, None),
175 start, MulticallStart)
176 self._start_table[old_tagname] = method
177
178 end = RemapEnd(self, new_tagname)
179 method = _merge_methods(self._end_table.get(old_tagname, None),
180 end, MulticallEnd)
181 self._end_table[old_tagname] = method
182
183
184 self._save_stack = []
185 self.setCharacterSaver(self)
186
187 - def acquire(self, obj, prefix = ""):
194
201
202
205
207 f = self._start_table.get(tag)
208 if f is not None:
209 f(tag, attrs)
211 f = self._end_table.get(tag)
212 if f is not None:
213 f(tag)
214
217
218
219
220
222 if self._save_stack:
223 self._save_stack.append(len(self._save_text))
224 else:
225 self._save_text = ""
226 self._save_stack.append(0)
228 pos = self._save_stack.pop()
229 return self._save_text[pos:]
230
232 if self._save_stack:
233 self._save_text += s
234