@@ -76,60 +76,72 @@ def concatenateCharacterTokens(tokens):
76
76
yield {"type" : "Characters" , "data" : "" .join (pendingCharacters )}
77
77
78
78
79
- def pprint (tokens ):
79
+ def pprint (walker ):
80
+ """Pretty printer for tree walkers"""
80
81
output = []
81
82
indent = 0
82
- for token in concatenateCharacterTokens (tokens ):
83
+ for token in concatenateCharacterTokens (walker ):
83
84
type = token ["type" ]
84
85
if type in ("StartTag" , "EmptyTag" ):
85
- if ( token [ "namespace" ] and
86
- token ["namespace" ] != constants .namespaces ["html" ]) :
86
+ # tag name
87
+ if token [ "namespace" ] and token ["namespace" ] != constants .namespaces ["html" ]:
87
88
if token ["namespace" ] in constants .prefixes :
88
- name = constants .prefixes [token ["namespace" ]]
89
+ ns = constants .prefixes [token ["namespace" ]]
89
90
else :
90
- name = token ["namespace" ]
91
- name + = " " + token ["name" ]
91
+ ns = token ["namespace" ]
92
+ name = "%s %s" % ( ns , token ["name" ])
92
93
else :
93
94
name = token ["name" ]
94
95
output .append ("%s<%s>" % (" " * indent , name ))
95
96
indent += 2
97
+ # attributes (sorted for consistent ordering)
96
98
attrs = token ["data" ]
97
- if attrs :
98
- # TODO: Remove this if statement, attrs should always exist
99
- for (namespace , name ), value in sorted (attrs .items ()):
100
- if namespace :
101
- if namespace in constants .prefixes :
102
- outputname = constants .prefixes [namespace ]
103
- else :
104
- outputname = namespace
105
- outputname += " " + name
99
+ for (namespace , localname ), value in sorted (attrs .items ()):
100
+ if namespace :
101
+ if namespace in constants .prefixes :
102
+ ns = constants .prefixes [namespace ]
106
103
else :
107
- outputname = name
108
- output .append ("%s%s=\" %s\" " % (" " * indent , outputname , value ))
104
+ ns = namespace
105
+ name = "%s %s" % (ns , localname )
106
+ else :
107
+ name = localname
108
+ output .append ("%s%s=\" %s\" " % (" " * indent , name , value ))
109
+ # self-closing
109
110
if type == "EmptyTag" :
110
111
indent -= 2
112
+
111
113
elif type == "EndTag" :
112
114
indent -= 2
115
+
113
116
elif type == "Comment" :
114
117
output .append ("%s<!-- %s -->" % (" " * indent , token ["data" ]))
118
+
115
119
elif type == "Doctype" :
116
120
if token ["name" ]:
117
121
if token ["publicId" ]:
118
122
output .append ("""%s<!DOCTYPE %s "%s" "%s">""" %
119
- (" " * indent , token ["name" ],
123
+ (" " * indent ,
124
+ token ["name" ],
120
125
token ["publicId" ],
121
- token ["systemId" ] and token ["systemId" ] or "" ))
126
+ token ["systemId" ] if token ["systemId" ] else "" ))
122
127
elif token ["systemId" ]:
123
128
output .append ("""%s<!DOCTYPE %s "" "%s">""" %
124
- (" " * indent , token ["name" ],
129
+ (" " * indent ,
130
+ token ["name" ],
125
131
token ["systemId" ]))
126
132
else :
127
133
output .append ("%s<!DOCTYPE %s>" % (" " * indent ,
128
134
token ["name" ]))
129
135
else :
130
136
output .append ("%s<!DOCTYPE >" % (" " * indent ,))
131
- elif type in ("Characters" , "SpaceCharacters" ):
137
+
138
+ elif type == "Characters" :
132
139
output .append ("%s\" %s\" " % (" " * indent , token ["data" ]))
140
+
141
+ elif type == "SpaceCharacters" :
142
+ assert False , "concatenateCharacterTokens should have got rid of all Space tokens"
143
+
133
144
else :
134
- pass # TODO: what to do with errors?
145
+ raise ValueError ("Unknown token type, %s" % type )
146
+
135
147
return "\n " .join (output )
0 commit comments