123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- from __future__ import absolute_import, division, unicode_literals
- from genshi.core import QName, Attrs
- from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
- def to_genshi(walker):
- """Convert a tree to a genshi tree
- :arg walker: the treewalker to use to walk the tree to convert it
- :returns: generator of genshi nodes
- """
- text = []
- for token in walker:
- type = token["type"]
- if type in ("Characters", "SpaceCharacters"):
- text.append(token["data"])
- elif text:
- yield TEXT, "".join(text), (None, -1, -1)
- text = []
- if type in ("StartTag", "EmptyTag"):
- if token["namespace"]:
- name = "{%s}%s" % (token["namespace"], token["name"])
- else:
- name = token["name"]
- attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
- for attr, value in token["data"].items()])
- yield (START, (QName(name), attrs), (None, -1, -1))
- if type == "EmptyTag":
- type = "EndTag"
- if type == "EndTag":
- if token["namespace"]:
- name = "{%s}%s" % (token["namespace"], token["name"])
- else:
- name = token["name"]
- yield END, QName(name), (None, -1, -1)
- elif type == "Comment":
- yield COMMENT, token["data"], (None, -1, -1)
- elif type == "Doctype":
- yield DOCTYPE, (token["name"], token["publicId"],
- token["systemId"]), (None, -1, -1)
- else:
- pass # FIXME: What to do?
- if text:
- yield TEXT, "".join(text), (None, -1, -1)
|