mirror of
https://github.com/google/go-jsonnet.git
synced 2025-08-10 08:17:11 +02:00
Add argument in parseXmlJsonml function
This commit is contained in:
parent
a2105c2532
commit
ae9a67d6e5
26
builtins.go
26
builtins.go
@ -1512,14 +1512,26 @@ func builtinParseYAML(i *interpreter, str value) (value, error) {
|
||||
return jsonToValue(i, elems[0])
|
||||
}
|
||||
|
||||
func builtinParseXmlJsonml(i *interpreter, str value) (value, error) {
|
||||
sval, err := i.getString(str)
|
||||
func builtinParseXmlJsonml(i *interpreter, arguments []value) (value, error) {
|
||||
strv := arguments[0]
|
||||
pwsv := arguments[1]
|
||||
|
||||
sval, err := i.getString(strv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s := sval.getGoString()
|
||||
|
||||
json, err := BuildJsonmlFromString(s)
|
||||
pws := false
|
||||
if pwsv.getType() != nullType {
|
||||
pwsval, err := i.getBoolean(pwsv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pws = pwsval.value
|
||||
}
|
||||
|
||||
json, err := BuildJsonmlFromString(s, pws)
|
||||
if err != nil {
|
||||
return nil, i.Error(fmt.Sprintf("failed to parse XML: %v", err.Error()))
|
||||
}
|
||||
@ -2143,12 +2155,12 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
||||
len := float64(arr.length())
|
||||
if len == 0 {
|
||||
return nil, i.Error("Cannot calculate average of an empty array.")
|
||||
}
|
||||
|
||||
|
||||
sumValue, err := builtinSum(i, arrv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -2158,7 +2170,7 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
avg := sum.value/len
|
||||
avg := sum.value / len
|
||||
return makeValueNumber(avg), nil
|
||||
}
|
||||
|
||||
@ -2566,7 +2578,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
|
||||
&unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}},
|
||||
&unaryBuiltin{name: "parseJson", function: builtinParseJSON, params: ast.Identifiers{"str"}},
|
||||
&unaryBuiltin{name: "parseYaml", function: builtinParseYAML, params: ast.Identifiers{"str"}},
|
||||
&unaryBuiltin{name: "parseXmlJsonml", function: builtinParseXmlJsonml, params: ast.Identifiers{"str"}},
|
||||
&generalBuiltin{name: "parseXmlJsonml", function: builtinParseXmlJsonml, params: []generalBuiltinParameter{{name: "str"}, {name: "preserveWhitespace", defaultValue: &nullValue}}},
|
||||
&generalBuiltin{name: "manifestJsonEx", function: builtinManifestJSONEx, params: []generalBuiltinParameter{{name: "value"}, {name: "indent"},
|
||||
{name: "newline", defaultValue: &valueFlatString{value: []rune("\n")}},
|
||||
{name: "key_val_sep", defaultValue: &valueFlatString{value: []rune(": ")}}}},
|
||||
|
22
jsonml.go
22
jsonml.go
@ -47,13 +47,14 @@ func (s *stack) Size() int {
|
||||
}
|
||||
|
||||
type jsonMLBuilder struct {
|
||||
stack *stack
|
||||
currDepth int
|
||||
stack *stack
|
||||
preserveWhitespace bool
|
||||
currDepth int
|
||||
}
|
||||
|
||||
// BuildJsonmlFromString returns a jsomML form of given xml string.
|
||||
func BuildJsonmlFromString(s string) ([]interface{}, error) {
|
||||
b := newBuilder()
|
||||
func BuildJsonmlFromString(s string, preserveWhitespace bool) ([]interface{}, error) {
|
||||
b := newBuilder(preserveWhitespace)
|
||||
d := xml.NewDecoder(strings.NewReader(s))
|
||||
|
||||
for {
|
||||
@ -79,9 +80,10 @@ func BuildJsonmlFromString(s string) ([]interface{}, error) {
|
||||
return b.build(), nil
|
||||
}
|
||||
|
||||
func newBuilder() *jsonMLBuilder {
|
||||
func newBuilder(preserveWhitespace bool) *jsonMLBuilder {
|
||||
return &jsonMLBuilder{
|
||||
stack: &stack{},
|
||||
stack: &stack{},
|
||||
preserveWhitespace: preserveWhitespace,
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,9 +110,11 @@ func (b *jsonMLBuilder) addToken(token xml.Token) error {
|
||||
b.currDepth++
|
||||
case xml.CharData:
|
||||
t := token.(xml.CharData)
|
||||
s := strings.TrimSpace(string(t))
|
||||
if len(s) > 0 {
|
||||
// Skip whitespace only string
|
||||
s := string(t)
|
||||
if !b.preserveWhitespace {
|
||||
s = strings.TrimSpace(s)
|
||||
}
|
||||
if len(s) > 0 { // Skip empty strings
|
||||
b.appendToLastNode(string(t))
|
||||
}
|
||||
case xml.EndElement:
|
||||
|
@ -111,7 +111,7 @@ func prepareStdlib(g *typeGraph) {
|
||||
"parseHex": g.newSimpleFuncType(numberType, "str"),
|
||||
"parseJson": g.newSimpleFuncType(jsonType, "str"),
|
||||
"parseYaml": g.newSimpleFuncType(jsonType, "str"),
|
||||
"parseXmlJsonml": g.newSimpleFuncType(jsonType, "str"),
|
||||
"parseXmlJsonml": g.newFuncType(jsonType, []ast.Parameter{required("str"), optional("preserveWhitespace")}),
|
||||
"encodeUTF8": g.newSimpleFuncType(numberArrayType, "str"),
|
||||
"decodeUTF8": g.newSimpleFuncType(stringType, "arr"),
|
||||
|
||||
|
7
testdata/builtinParseXmlJsonml2.golden
vendored
Normal file
7
testdata/builtinParseXmlJsonml2.golden
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
[
|
||||
"svg",
|
||||
[
|
||||
"circle",
|
||||
" Foobar"
|
||||
]
|
||||
]
|
1
testdata/builtinParseXmlJsonml2.jsonnet
vendored
Normal file
1
testdata/builtinParseXmlJsonml2.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
||||
std.parseXmlJsonml('<svg><circle> Foobar</circle></svg>', preserveWhitespace=true)
|
0
testdata/builtinParseXmlJsonml2.linter.golden
vendored
Normal file
0
testdata/builtinParseXmlJsonml2.linter.golden
vendored
Normal file
Loading…
Reference in New Issue
Block a user