1
1
import _base
2
2
from xml .dom import minidom , Node , XML_NAMESPACE , XMLNS_NAMESPACE
3
3
import new
4
+ from xml .sax .saxutils import escape
5
+ from constants import voidElements
4
6
5
7
import re
6
8
illegal_xml_chars = re .compile ("[\x01 -\x08 \x0B \x0C \x0E -\x1F ]" )
@@ -86,9 +88,9 @@ def elementClass(self, name):
86
88
return NodeBuilder (self .dom .createElement (name ))
87
89
88
90
def commentClass (self , data ):
89
- return NodeBuilder (self .dom .createComment (data ))
90
-
91
- def fragmentClass (self ):
91
+ return NodeBuilder (self .dom .createComment (data ))
92
+
93
+ def fragmentClass (self ):
92
94
return NodeBuilder (self .dom .createDocumentFragment ())
93
95
94
96
def appendChild (self , node ):
@@ -98,9 +100,9 @@ def testSerializer(self, element):
98
100
return testSerializer (element )
99
101
100
102
def getDocument (self ):
101
- return self .dom
102
-
103
- def getFragment (self ):
103
+ return self .dom
104
+
105
+ def getFragment (self ):
104
106
return _base .TreeBuilder .getFragment (self ).element
105
107
106
108
def insertText (self , data , parent = None ):
@@ -143,6 +145,32 @@ def serializeElement(element, indent=0):
143
145
144
146
return "\n " .join (rv )
145
147
148
+ class HTMLSerializer (object ):
149
+ def serialize (self , node ):
150
+ rv = self .serializeNode (node )
151
+ for child in node .childNodes :
152
+ rv += self .serialize (child )
153
+ if node .nodeType == Node .ELEMENT_NODE and node .nodeName not in voidElements :
154
+ rv += "</%s>\n " % node .nodeName
155
+ return rv
156
+
157
+ def serializeNode (self , node ):
158
+ if node .nodeType == Node .TEXT_NODE :
159
+ rv = node .nodeValue
160
+ elif node .nodeType == Node .ELEMENT_NODE :
161
+ rv = "<%s" % node .nodeName
162
+ if node .hasAttributes ():
163
+ rv = rv + "" .join ([" %s='%s'" % (key , escape (value )) for key ,value in
164
+ node .attributes .items ()])
165
+ rv += ">"
166
+ elif node .nodeType == Node .COMMENT_NODE :
167
+ rv = "<!-- %s -->" % escape (node .nodeValue )
168
+ elif node .nodeType == Node .DOCUMENT_TYPE_NODE :
169
+ rv = "<!DOCTYPE %s>" % node .name
170
+ else :
171
+ rv = ""
172
+ return rv
173
+
146
174
def dom2sax (node , handler , nsmap = {'xml' :XML_NAMESPACE }):
147
175
if node .nodeType == Node .ELEMENT_NODE :
148
176
if not nsmap :
0 commit comments