1 from __future__ import absolute_import, division, unicode_literals
3 from genshi.core import QName
4 from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
5 from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
9 from ..constants import voidElements, namespaces
12 class TreeWalker(_base.TreeWalker):
14 # Buffer the events so we can pass in the following one
16 for event in self.tree:
17 if previous is not None:
18 for token in self.tokens(previous, event):
22 # Don't forget the final event!
23 if previous is not None:
24 for token in self.tokens(previous, None):
27 def tokens(self, event, next):
28 kind, data, pos = event
32 namespace = tag.namespace
33 converted_attribs = {}
35 if isinstance(k, QName):
36 converted_attribs[(k.namespace, k.localname)] = v
38 converted_attribs[(None, k)] = v
40 if namespace == namespaces["html"] and name in voidElements:
41 for token in self.emptyTag(namespace, name, converted_attribs,
42 not next or next[0] != END
46 yield self.startTag(namespace, name, converted_attribs)
50 namespace = data.namespace
51 if name not in voidElements:
52 yield self.endTag(namespace, name)
55 yield self.comment(data)
58 for token in self.text(data):
62 yield self.doctype(*data)
64 elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
65 START_CDATA, END_CDATA, PI):
69 yield self.unknown(kind)