1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| 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)
|
|