@@ -17,37 +17,45 @@ def __iter__(self):
1717def error (self ,msg ):
1818return {"type" :"SerializeError" ,"data" :msg }
1919
20- def normalizeAttrs (self ,attrs ):
21- newattrs = {}
22- if attrs :
23- #TODO: treewalkers should always have attrs
24- for (namespace ,name ),value in attrs .items ():
25- assert namespace is None or isinstance (namespace ,text_type ),type (namespace )
26- assert isinstance (name ,text_type )
27- assert isinstance (value ,text_type )
28- newattrs [(namespace ,name )]= value
29- return newattrs
30-
3120def emptyTag (self ,namespace ,name ,attrs ,hasChildren = False ):
21+ assert namespace is None or isinstance (namespace ,text_type ),type (namespace )
22+ assert isinstance (name ,text_type ),type (name )
23+ assert all ((namespace is None or isinstance (namespace ,text_type ))and
24+ isinstance (name ,text_type )and
25+ isinstance (value ,text_type )
26+ for (namespace ,name ),value in attrs .items ())
27+
3228yield {"type" :"EmptyTag" ,"name" :name ,
3329"namespace" :namespace ,
34- "data" :self . normalizeAttrs ( attrs ) }
30+ "data" :attrs }
3531if hasChildren :
3632yield self .error (_ ("Void element has children" ))
3733
3834def startTag (self ,namespace ,name ,attrs ):
35+ assert namespace is None or isinstance (namespace ,text_type ),type (namespace )
36+ assert isinstance (name ,text_type ),type (name )
37+ assert all ((namespace is None or isinstance (namespace ,text_type ))and
38+ isinstance (name ,text_type )and
39+ isinstance (value ,text_type )
40+ for (namespace ,name ),value in attrs .items ())
41+
3942return {"type" :"StartTag" ,
4043"name" :name ,
4144"namespace" :namespace ,
42- "data" :self . normalizeAttrs ( attrs ) }
45+ "data" :attrs }
4346
4447def endTag (self ,namespace ,name ):
48+ assert namespace is None or isinstance (namespace ,text_type ),type (namespace )
49+ assert isinstance (name ,text_type ),type (namespace )
50+
4551return {"type" :"EndTag" ,
4652"name" :name ,
4753"namespace" :namespace ,
4854"data" : {}}
4955
5056def text (self ,data ):
57+ assert isinstance (data ,text_type ),type (data )
58+
5159data = data
5260middle = data .lstrip (spaceCharacters )
5361left = data [:len (data )- len (middle )]
@@ -62,16 +70,24 @@ def text(self, data):
6270yield {"type" :"SpaceCharacters" ,"data" :right }
6371
6472def comment (self ,data ):
73+ assert isinstance (data ,text_type ),type (data )
74+
6575return {"type" :"Comment" ,"data" :data }
6676
6777def doctype (self ,name ,publicId = None ,systemId = None ,correct = True ):
78+ assert name is None or isinstance (name ,text_type ),type (name )
79+ assert publicId is None or isinstance (publicId ,text_type ),type (publicId )
80+ assert systemId is None or isinstance (systemId ,text_type ),type (systemId )
81+
6882return {"type" :"Doctype" ,
69- "name" :name is not None and name or "" ,
83+ "name" :name if name is not None else "" ,
7084"publicId" :publicId ,
7185"systemId" :systemId ,
7286"correct" :correct }
7387
7488def entity (self ,name ):
89+ assert isinstance (name ,text_type ),type (name )
90+
7591return {"type" :"Entity" ,"name" :name }
7692
7793def unknown (self ,nodeType ):