@@ -53,15 +53,16 @@ func (dec *xmlDecoder) processComment(c string) string {
53
53
}
54
54
55
55
func (dec * xmlDecoder ) createMap (n * xmlNode ) (* yaml.Node , error ) {
56
- log .Debug ("createMap: headC: %v, footC: %v" , n .HeadComment , n .FootComment )
56
+ log .Debug ("createMap: headC: %v, lineC: %v, footC: %v" , n .HeadComment , n . LineComment , n .FootComment )
57
57
yamlNode := & yaml.Node {Kind : yaml .MappingNode , Tag : "!!map" }
58
58
59
59
if len (n .Data ) > 0 {
60
60
label := dec .prefs .ContentName
61
61
labelNode := createScalarNode (label , label )
62
62
labelNode .HeadComment = dec .processComment (n .HeadComment )
63
+ labelNode .LineComment = dec .processComment (n .LineComment )
63
64
labelNode .FootComment = dec .processComment (n .FootComment )
64
- yamlNode .Content = append (yamlNode .Content , labelNode , createScalarNode ( n . Data , n .Data ))
65
+ yamlNode .Content = append (yamlNode .Content , labelNode , dec . createValueNodeFromData ( n .Data ))
65
66
}
66
67
67
68
for i , keyValuePair := range n .Children {
@@ -89,6 +90,7 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) {
89
90
// if the value is a scalar, the head comment of the scalar needs to go on the key?
90
91
// add tests for <z/> as well as multiple <ds> of inputXmlWithComments > yaml
91
92
if len (children [0 ].Children ) == 0 && children [0 ].HeadComment != "" {
93
+ log .Debug ("scalar comment hack" )
92
94
labelNode .HeadComment = labelNode .HeadComment + "\n " + strings .TrimSpace (children [0 ].HeadComment )
93
95
children [0 ].HeadComment = ""
94
96
}
@@ -103,17 +105,40 @@ func (dec *xmlDecoder) createMap(n *xmlNode) (*yaml.Node, error) {
103
105
return yamlNode , nil
104
106
}
105
107
108
+ func (dec * xmlDecoder ) createValueNodeFromData (values []string ) * yaml.Node {
109
+ switch len (values ) {
110
+ case 0 :
111
+ return createScalarNode (nil , "" )
112
+ case 1 :
113
+ return createScalarNode (values [0 ], values [0 ])
114
+ default :
115
+ content := make ([]* yaml.Node , 0 )
116
+ for _ , value := range values {
117
+ content = append (content , createScalarNode (value , value ))
118
+ }
119
+ return & yaml.Node {
120
+ Kind : yaml .SequenceNode ,
121
+ Tag : "!!seq" ,
122
+ Content : content ,
123
+ }
124
+ }
125
+ }
126
+
106
127
func (dec * xmlDecoder ) convertToYamlNode (n * xmlNode ) (* yaml.Node , error ) {
107
128
if len (n .Children ) > 0 {
108
129
return dec .createMap (n )
109
130
}
110
- scalar := createScalarNode (n .Data , n .Data )
111
- if n .Data == "" {
112
- scalar = createScalarNode (nil , "" )
113
- }
114
- log .Debug ("scalar headC: %v, footC: %v" , n .HeadComment , n .FootComment )
131
+
132
+ scalar := dec .createValueNodeFromData (n .Data )
133
+
134
+ log .Debug ("scalar (%v), headC: %v, lineC: %v, footC: %v" , scalar .Tag , n .HeadComment , n .LineComment , n .FootComment )
115
135
scalar .HeadComment = dec .processComment (n .HeadComment )
116
136
scalar .LineComment = dec .processComment (n .LineComment )
137
+ if scalar .Tag == "!!seq" {
138
+ scalar .Content [0 ].HeadComment = scalar .LineComment
139
+ scalar .LineComment = ""
140
+ }
141
+
117
142
scalar .FootComment = dec .processComment (n .FootComment )
118
143
119
144
return scalar , nil
@@ -156,7 +181,7 @@ type xmlNode struct {
156
181
HeadComment string
157
182
FootComment string
158
183
LineComment string
159
- Data string
184
+ Data [] string
160
185
}
161
186
162
187
type xmlChildrenKv struct {
@@ -241,12 +266,13 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error {
241
266
a .Name .Local = a .Name .Space + ":" + a .Name .Local
242
267
}
243
268
}
244
- elem .n .AddChild (dec .prefs .AttributePrefix + a .Name .Local , & xmlNode {Data : a .Value })
269
+ elem .n .AddChild (dec .prefs .AttributePrefix + a .Name .Local , & xmlNode {Data : [] string { a .Value } })
245
270
}
246
271
case xml.CharData :
247
272
// Extract XML data (if any)
248
- elem .n .Data = elem .n .Data + trimNonGraphic (string (se ))
249
- if elem .n .Data != "" {
273
+ newBit := trimNonGraphic (string (se ))
274
+ if len (newBit ) > 0 {
275
+ elem .n .Data = append (elem .n .Data , newBit )
250
276
elem .state = "chardata"
251
277
log .Debug ("chardata [%v] for %v" , elem .n .Data , elem .label )
252
278
}
@@ -276,11 +302,11 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error {
276
302
277
303
case xml.ProcInst :
278
304
if ! dec .prefs .SkipProcInst {
279
- elem .n .AddChild (dec .prefs .ProcInstPrefix + se .Target , & xmlNode {Data : string (se .Inst )})
305
+ elem .n .AddChild (dec .prefs .ProcInstPrefix + se .Target , & xmlNode {Data : [] string { string (se .Inst )} })
280
306
}
281
307
case xml.Directive :
282
308
if ! dec .prefs .SkipDirectives {
283
- elem .n .AddChild (dec .prefs .DirectiveName , & xmlNode {Data : string (se )})
309
+ elem .n .AddChild (dec .prefs .DirectiveName , & xmlNode {Data : [] string { string (se )} })
284
310
}
285
311
}
286
312
}
0 commit comments