@@ -102,6 +102,21 @@ class PrettyPrinter( width:Int, step:Int ) {
102
102
sb.toString();
103
103
}
104
104
105
+ protected def rootStartTag (n : Node ) = {
106
+ val sb = new StringBuffer (" <" );
107
+ Utility .appendPrefixedName( n.namespace, n.label, pmap, sb );
108
+ Utility .attr2xml( n.namespace, n.attributes.elements, pmap, sb );
109
+ if (( pmap.size != 1 )|| ! pmap.contains(" " ))
110
+ for ( val c <- pmap.elements ) {
111
+ sb.append(" xmlns:" );
112
+ sb.append(c._2);
113
+ sb.append(" =\" " );
114
+ sb.append(c._1);
115
+ sb.append('"' );
116
+ }
117
+ sb.append('>' );
118
+ sb.toString();
119
+ }
105
120
protected def startTag (n : Node ) = {
106
121
val sb = new StringBuffer (" <" );
107
122
Utility .appendPrefixedName( n.namespace, n.label, pmap, sb );
@@ -110,6 +125,13 @@ class PrettyPrinter( width:Int, step:Int ) {
110
125
sb.toString();
111
126
}
112
127
128
+ protected def endTag (n : Node ) = {
129
+ val sb = new StringBuffer (" </" );
130
+ Utility .appendPrefixedName( n.namespace, n.label, pmap, sb );
131
+ sb.append('>' );
132
+ sb.toString();
133
+ }
134
+
113
135
/** appends a formatted string containing well-formed XML with
114
136
* given namespace to prefix mapping to the given stringbuffer
115
137
* @param n the node to be serialized
@@ -119,7 +141,7 @@ class PrettyPrinter( width:Int, step:Int ) {
119
141
def format (n : Node , pmap : Map [String ,String ], sb : StringBuffer ): Unit = {
120
142
reset();
121
143
this .pmap = pmap;
122
- traverse ( n, 0 );
144
+ traverse1 ( n, 0 );
123
145
var cur = 0 ;
124
146
// Console.println( items.reverse );
125
147
for ( val b <- items.reverse ) b match {
@@ -154,35 +176,111 @@ class PrettyPrinter( width:Int, step:Int ) {
154
176
makeBox( ind, node.toString() );
155
177
156
178
case _:Node =>
157
- val test = node.toString();
158
-
159
- if ( ( test.length() < width - cur ) // all ?
160
- && ( ! breakable( node ))) {
179
+ val sb = new StringBuffer ();
180
+ val test = { Utility .toXML1(node,pmap,sb); sb.toString()};
181
+ if (( test.length() < width - cur )&& ( ! breakable( node ))){ // all ?
161
182
makeBox( ind, test );
162
183
} else { // start tag + content + end tag
163
184
// Console.println(node.label+" ind="+ind);
164
185
val stg = startTag( node );
165
- val endTag = " </ " + node.label + " > " ;
166
- val len2 = node.label.length() + 1 ;
186
+ val etg = endTag( node ) ;
187
+ val len2 = pmap( node.namespace).length() + node. label.length() + 2 ;
167
188
168
189
if ( stg.length() < width - cur ) { // start tag fits
169
190
170
191
makeBox( ind, stg );
171
192
makeBreak();
172
193
traverse( node.child.elements, ind + step );
173
- makeBox( ind, endTag );
194
+ makeBox( ind, etg );
174
195
175
196
} else if ( len2 < width - cur ) {
176
197
// <start label + attrs + tag + content + end tag
177
198
makeBox( ind, stg.substring( 0 , len2 ));
178
199
makeBreak();
200
+ /* { //@todo
201
+ val sq:Seq[String] = stg.split(" ");
202
+ val it = sq.elements;
203
+ it.next;
204
+ for( val c <- it ) {
205
+ makeBox( ind+len2-2, c );
206
+ makeBreak();
207
+ }
208
+ }*/
179
209
makeBox( ind, stg.substring( len2, stg.length() ));
180
210
makeBreak();
181
211
traverse( node.child.elements, ind + step );
182
- makeBox( cur, endTag );
212
+ makeBox( cur, etg );
213
+ } else {
214
+ makeBox( ind, test );
215
+ makeBreak();
183
216
}
184
217
}
218
+ }
219
+ }
220
+
221
+ /** @param tail: what we'd like to sqeeze in */
222
+ protected def traverse1 ( node: Node , ind: int ): Unit = {
223
+ node match {
224
+
225
+ case _:Text | _:CharData | _:Comment | _:EntityRef | _:ProcInstr =>
226
+ makeBox( ind, node.toString() );
227
+
228
+ case _:Node => {
229
+ // start tag + content + end tag
230
+ // Console.println(node.label+" ind="+ind);
231
+ val stg = rootStartTag( node );
232
+ val etg = endTag( node );
233
+ val len2 = pmap(node.namespace).length() + node.label.length() + 2 ;
234
+
235
+ if ( stg.length() < width - cur ) { // start tag fits
236
+
237
+ makeBox( ind, stg );
238
+ makeBreak();
239
+ traverse( node.child.elements, ind + step );
240
+ makeBox( ind, etg );
241
+
242
+ } else if ( len2 < width - cur ) {
243
+ val sq : Seq [String ] = stg.split(" " );
244
+ val it = sq.elements;
245
+ var tmp = it.next;
246
+ makeBox( ind, tmp );
247
+ var curlen = cur + tmp.length();
248
+ while ( it.hasNext ) {
249
+ var tmp = it.next;
250
+ if ( tmp.length() + curlen + 1 < width ) {
251
+ makeBox( ind, " " );
252
+ makeBox( ind, tmp );
253
+ curlen = curlen + tmp.length() + 1 ;
254
+ } else {
255
+ makeBreak();
256
+ makeBox( len2+ 1 , tmp );
257
+ curlen = len2+ 1 ;
258
+ }
259
+ }
260
+ // <start label + attrs + tag + content + end tag
261
+ // makeBox( ind, stg.substring( 0, len2 ));
262
+ // makeBreak();
263
+ /* { //@todo
264
+ val sq:Seq[String] = stg.split(" ");
265
+ val it = sq.elements;
266
+ it.next;
267
+ for( val c <- it ) {
268
+ makeBox( ind+len2-2, c );
269
+ makeBreak();
270
+ }
271
+ }*/
272
+ // makeBox( ind, stg.substring( len2, stg.length() ));
273
+ makeBreak();
274
+ traverse( node.child.elements, ind + step );
275
+ makeBox( cur, etg );
276
+ } else { // it does not fit, dump everything
277
+ val sb = new StringBuffer ();
278
+ val tmp = { Utility .toXML1(node,pmap,sb); sb.toString()};
279
+ makeBox( ind, tmp );
280
+ makeBreak();
281
+ }
185
282
}
283
+ }
186
284
}
187
285
188
286
protected def traverse ( it: Iterator [Node ], ind: int ): unit = {
0 commit comments