You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.2 KiB

12 years ago
from __future__ import absolute_import, division, unicode_literals
from genshi.core import QName
13 years ago
from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
12 years ago
from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
from . import _base
13 years ago
12 years ago
from ..constants import voidElements, namespaces
13 years ago
class TreeWalker(_base.TreeWalker):
def __iter__(self):
12 years ago
# Buffer the events so we can pass in the following one
13 years ago
previous = None
for event in self.tree:
if previous is not None:
12 years ago
for token in self.tokens(previous, event):
yield token
13 years ago
previous = event
12 years ago
# Don't forget the final event!
13 years ago
if previous is not None:
12 years ago
for token in self.tokens(previous, None):
yield token
13 years ago
def tokens(self, event, next):
kind, data, pos = event
if kind == START:
12 years ago
tag, attribs = data
13 years ago
name = tag.localname
namespace = tag.namespace
12 years ago
converted_attribs = {}
for k, v in attribs:
if isinstance(k, QName):
converted_attribs[(k.namespace, k.localname)] = v
else:
converted_attribs[(None, k)] = v
if namespace == namespaces["html"] and name in voidElements:
for token in self.emptyTag(namespace, name, converted_attribs,
not next or next[0] != END
13 years ago
or next[1] != tag):
yield token
else:
12 years ago
yield self.startTag(namespace, name, converted_attribs)
13 years ago
elif kind == END:
name = data.localname
namespace = data.namespace
if name not in voidElements:
yield self.endTag(namespace, name)
elif kind == COMMENT:
yield self.comment(data)
elif kind == TEXT:
for token in self.text(data):
yield token
elif kind == DOCTYPE:
yield self.doctype(*data)
12 years ago
elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
START_CDATA, END_CDATA, PI):
13 years ago
pass
else:
yield self.unknown(kind)