Varia's website
https://varia.zone
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.
55 lines
1.7 KiB
55 lines
1.7 KiB
1 week ago
|
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)
|