Skip to content

Commit ae9a67d

Browse files
committed
Add argument in parseXmlJsonml function
1 parent a2105c2 commit ae9a67d

File tree

6 files changed

+41
-17
lines changed

6 files changed

+41
-17
lines changed

builtins.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,14 +1512,26 @@ func builtinParseYAML(i *interpreter, str value) (value, error) {
15121512
return jsonToValue(i, elems[0])
15131513
}
15141514

1515-
func builtinParseXmlJsonml(i *interpreter, str value) (value, error) {
1516-
sval, err := i.getString(str)
1515+
func builtinParseXmlJsonml(i *interpreter, arguments []value) (value, error) {
1516+
strv := arguments[0]
1517+
pwsv := arguments[1]
1518+
1519+
sval, err := i.getString(strv)
15171520
if err != nil {
15181521
return nil, err
15191522
}
15201523
s := sval.getGoString()
15211524

1522-
json, err := BuildJsonmlFromString(s)
1525+
pws := false
1526+
if pwsv.getType() != nullType {
1527+
pwsval, err := i.getBoolean(pwsv)
1528+
if err != nil {
1529+
return nil, err
1530+
}
1531+
pws = pwsval.value
1532+
}
1533+
1534+
json, err := BuildJsonmlFromString(s, pws)
15231535
if err != nil {
15241536
return nil, i.Error(fmt.Sprintf("failed to parse XML: %v", err.Error()))
15251537
}
@@ -2143,12 +2155,12 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
21432155
if err != nil {
21442156
return nil, err
21452157
}
2146-
2158+
21472159
len := float64(arr.length())
21482160
if len == 0 {
21492161
return nil, i.Error("Cannot calculate average of an empty array.")
21502162
}
2151-
2163+
21522164
sumValue, err := builtinSum(i, arrv)
21532165
if err != nil {
21542166
return nil, err
@@ -2158,7 +2170,7 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
21582170
return nil, err
21592171
}
21602172

2161-
avg := sum.value/len
2173+
avg := sum.value / len
21622174
return makeValueNumber(avg), nil
21632175
}
21642176

@@ -2566,7 +2578,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
25662578
&unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}},
25672579
&unaryBuiltin{name: "parseJson", function: builtinParseJSON, params: ast.Identifiers{"str"}},
25682580
&unaryBuiltin{name: "parseYaml", function: builtinParseYAML, params: ast.Identifiers{"str"}},
2569-
&unaryBuiltin{name: "parseXmlJsonml", function: builtinParseXmlJsonml, params: ast.Identifiers{"str"}},
2581+
&generalBuiltin{name: "parseXmlJsonml", function: builtinParseXmlJsonml, params: []generalBuiltinParameter{{name: "str"}, {name: "preserveWhitespace", defaultValue: &nullValue}}},
25702582
&generalBuiltin{name: "manifestJsonEx", function: builtinManifestJSONEx, params: []generalBuiltinParameter{{name: "value"}, {name: "indent"},
25712583
{name: "newline", defaultValue: &valueFlatString{value: []rune("\n")}},
25722584
{name: "key_val_sep", defaultValue: &valueFlatString{value: []rune(": ")}}}},

jsonml.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,14 @@ func (s *stack) Size() int {
4747
}
4848

4949
type jsonMLBuilder struct {
50-
stack *stack
51-
currDepth int
50+
stack *stack
51+
preserveWhitespace bool
52+
currDepth int
5253
}
5354

5455
// BuildJsonmlFromString returns a jsomML form of given xml string.
55-
func BuildJsonmlFromString(s string) ([]interface{}, error) {
56-
b := newBuilder()
56+
func BuildJsonmlFromString(s string, preserveWhitespace bool) ([]interface{}, error) {
57+
b := newBuilder(preserveWhitespace)
5758
d := xml.NewDecoder(strings.NewReader(s))
5859

5960
for {
@@ -79,9 +80,10 @@ func BuildJsonmlFromString(s string) ([]interface{}, error) {
7980
return b.build(), nil
8081
}
8182

82-
func newBuilder() *jsonMLBuilder {
83+
func newBuilder(preserveWhitespace bool) *jsonMLBuilder {
8384
return &jsonMLBuilder{
84-
stack: &stack{},
85+
stack: &stack{},
86+
preserveWhitespace: preserveWhitespace,
8587
}
8688
}
8789

@@ -108,9 +110,11 @@ func (b *jsonMLBuilder) addToken(token xml.Token) error {
108110
b.currDepth++
109111
case xml.CharData:
110112
t := token.(xml.CharData)
111-
s := strings.TrimSpace(string(t))
112-
if len(s) > 0 {
113-
// Skip whitespace only string
113+
s := string(t)
114+
if !b.preserveWhitespace {
115+
s = strings.TrimSpace(s)
116+
}
117+
if len(s) > 0 { // Skip empty strings
114118
b.appendToLastNode(string(t))
115119
}
116120
case xml.EndElement:

linter/internal/types/stdlib.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func prepareStdlib(g *typeGraph) {
111111
"parseHex": g.newSimpleFuncType(numberType, "str"),
112112
"parseJson": g.newSimpleFuncType(jsonType, "str"),
113113
"parseYaml": g.newSimpleFuncType(jsonType, "str"),
114-
"parseXmlJsonml": g.newSimpleFuncType(jsonType, "str"),
114+
"parseXmlJsonml": g.newFuncType(jsonType, []ast.Parameter{required("str"), optional("preserveWhitespace")}),
115115
"encodeUTF8": g.newSimpleFuncType(numberArrayType, "str"),
116116
"decodeUTF8": g.newSimpleFuncType(stringType, "arr"),
117117

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[
2+
"svg",
3+
[
4+
"circle",
5+
" Foobar"
6+
]
7+
]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.parseXmlJsonml('<svg><circle> Foobar</circle></svg>', preserveWhitespace=true)

testdata/builtinParseXmlJsonml2.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)