69
69
const
70
70
xmlHeader* = " <?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n "
71
71
# # Header to use for complete XML output.
72
+ singleTags = [" area" , " base" , " basefont" ,
73
+ " br" , " col" ," embed" , " frame" , " hr" , " img" ,
74
+ " input" ," source" ," track" ,
75
+ " isindex" , # obsolete HTML 4.01
76
+ " link" , " meta" , " param" , " wbr" ,
77
+ " command" , # obsolete
78
+ " keygen" , # obsolete
79
+ ]
72
80
73
81
proc newXmlNode(kind: XmlNodeKind): XmlNode =
74
82
# # Creates a new ``XmlNode``.
@@ -85,7 +93,8 @@ proc newElement*(tag: string): XmlNode =
85
93
a.add newElement(" childTag" )
86
94
assert a.kind == xnElement
87
95
assert $ a == """ <firstTag>
88
- <childTag />
96
+ <childTag>
97
+ </childTag>
89
98
</firstTag> """
90
99
91
100
result = newXmlNode(xnElement)
@@ -218,7 +227,8 @@ proc tag*(n: XmlNode): string {.inline.} =
218
227
var a = newElement(" firstTag" )
219
228
a.add newElement(" childTag" )
220
229
assert $ a == """ <firstTag>
221
- <childTag />
230
+ <childTag>
231
+ </childTag>
222
232
</firstTag> """
223
233
assert a.tag == " firstTag"
224
234
@@ -238,11 +248,13 @@ proc `tag=`*(n: XmlNode, tag: string) {.inline.} =
238
248
var a = newElement(" firstTag" )
239
249
a.add newElement(" childTag" )
240
250
assert $ a == """ <firstTag>
241
- <childTag />
251
+ <childTag>
252
+ </childTag>
242
253
</firstTag> """
243
254
a.tag = " newTag"
244
255
assert $ a == """ <newTag>
245
- <childTag />
256
+ <childTag>
257
+ </childTag>
246
258
</newTag> """
247
259
248
260
assert n.k == xnElement
@@ -308,7 +320,7 @@ proc add*(father, son: XmlNode) {.inline.} =
308
320
f.add newText(" my text" )
309
321
f.add newElement(" sonTag" )
310
322
f.add newEntity(" my entity" )
311
- assert $ f == " <myTag>my text<sonTag / >&my entity;</myTag>"
323
+ assert $ f == " <myTag>my text<sonTag></sonTag >&my entity;</myTag>"
312
324
add(father.s, son)
313
325
314
326
proc insert* (father, son: XmlNode, index: int ) {.inline.} =
@@ -324,8 +336,10 @@ proc insert*(father, son: XmlNode, index: int) {.inline.} =
324
336
f.add newElement(" first" )
325
337
f.insert(newElement(" second" ), 0 )
326
338
assert $ f == """ <myTag>
327
- <second />
328
- <first />
339
+ <second>
340
+ </second>
341
+ <first>
342
+ </first>
329
343
</myTag> """
330
344
331
345
assert father.k == xnElement and son.k == xnElement
@@ -346,7 +360,8 @@ proc delete*(n: XmlNode, i: Natural) {.noSideEffect.} =
346
360
f.insert(newElement(" second" ), 0 )
347
361
f.delete(0 )
348
362
assert $ f == """ <myTag>
349
- <first />
363
+ <first>
364
+ </first>
350
365
</myTag> """
351
366
352
367
assert n.k == xnElement
@@ -376,8 +391,8 @@ proc `[]`*(n: XmlNode, i: int): XmlNode {.inline.} =
376
391
var f = newElement(" myTag" )
377
392
f.add newElement(" first" )
378
393
f.insert(newElement(" second" ), 0 )
379
- assert $ f[1 ] == " <first / >"
380
- assert $ f[0 ] == " <second / >"
394
+ assert $ f[1 ] == " <first> \n </first >"
395
+ assert $ f[0 ] == " <second> \n </second >"
381
396
382
397
assert n.k == xnElement
383
398
result = n.s[i]
@@ -591,9 +606,9 @@ proc add*(result: var string, n: XmlNode, indent = 0, indWidth = 2,
591
606
c = newComment(" my comment" )
592
607
s = " "
593
608
s.add(c)
609
+ a.add(b)
594
610
s.add(a)
595
- s.add(b)
596
- assert s == " <!-- my comment --><firstTag />my text"
611
+ assert s == " <!-- my comment --><firstTag>my text</firstTag>"
597
612
598
613
proc noWhitespace(n: XmlNode): bool =
599
614
for i in 0 ..< n.len:
@@ -633,8 +648,8 @@ proc add*(result: var string, n: XmlNode, indent = 0, indWidth = 2,
633
648
result .addEscapedAttr(val)
634
649
result .add('"' )
635
650
636
- if n.len == 0 :
637
- result .add(" />" )
651
+ if n.len == 0 and n.fTag in singleTags :
652
+ result .add(" />" )
638
653
return
639
654
640
655
let
@@ -685,7 +700,7 @@ proc child*(n: XmlNode, name: string): XmlNode =
685
700
f.add newElement(" firstSon" )
686
701
f.add newElement(" secondSon" )
687
702
f.add newElement(" thirdSon" )
688
- assert $ (f.child(" secondSon" )) == " <secondSon / >"
703
+ assert $ (f.child(" secondSon" )) == " <secondSon> \n </secondSon >"
689
704
690
705
assert n.kind == xnElement
691
706
for i in items(n):
0 commit comments