mirror of
https://github.com/google/go-jsonnet.git
synced 2025-08-12 17:27:14 +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])
|
return jsonToValue(i, elems[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
func builtinParseXmlJsonml(i *interpreter, str value) (value, error) {
|
func builtinParseXmlJsonml(i *interpreter, arguments []value) (value, error) {
|
||||||
sval, err := i.getString(str)
|
strv := arguments[0]
|
||||||
|
pwsv := arguments[1]
|
||||||
|
|
||||||
|
sval, err := i.getString(strv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
s := sval.getGoString()
|
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 {
|
if err != nil {
|
||||||
return nil, i.Error(fmt.Sprintf("failed to parse XML: %v", err.Error()))
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
len := float64(arr.length())
|
len := float64(arr.length())
|
||||||
if len == 0 {
|
if len == 0 {
|
||||||
return nil, i.Error("Cannot calculate average of an empty array.")
|
return nil, i.Error("Cannot calculate average of an empty array.")
|
||||||
}
|
}
|
||||||
|
|
||||||
sumValue, err := builtinSum(i, arrv)
|
sumValue, err := builtinSum(i, arrv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -2158,7 +2170,7 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
avg := sum.value/len
|
avg := sum.value / len
|
||||||
return makeValueNumber(avg), nil
|
return makeValueNumber(avg), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2566,7 +2578,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
|
|||||||
&unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}},
|
&unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}},
|
||||||
&unaryBuiltin{name: "parseJson", function: builtinParseJSON, params: ast.Identifiers{"str"}},
|
&unaryBuiltin{name: "parseJson", function: builtinParseJSON, params: ast.Identifiers{"str"}},
|
||||||
&unaryBuiltin{name: "parseYaml", function: builtinParseYAML, 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"},
|
&generalBuiltin{name: "manifestJsonEx", function: builtinManifestJSONEx, params: []generalBuiltinParameter{{name: "value"}, {name: "indent"},
|
||||||
{name: "newline", defaultValue: &valueFlatString{value: []rune("\n")}},
|
{name: "newline", defaultValue: &valueFlatString{value: []rune("\n")}},
|
||||||
{name: "key_val_sep", defaultValue: &valueFlatString{value: []rune(": ")}}}},
|
{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 {
|
type jsonMLBuilder struct {
|
||||||
stack *stack
|
stack *stack
|
||||||
currDepth int
|
preserveWhitespace bool
|
||||||
|
currDepth int
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildJsonmlFromString returns a jsomML form of given xml string.
|
// BuildJsonmlFromString returns a jsomML form of given xml string.
|
||||||
func BuildJsonmlFromString(s string) ([]interface{}, error) {
|
func BuildJsonmlFromString(s string, preserveWhitespace bool) ([]interface{}, error) {
|
||||||
b := newBuilder()
|
b := newBuilder(preserveWhitespace)
|
||||||
d := xml.NewDecoder(strings.NewReader(s))
|
d := xml.NewDecoder(strings.NewReader(s))
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@ -79,9 +80,10 @@ func BuildJsonmlFromString(s string) ([]interface{}, error) {
|
|||||||
return b.build(), nil
|
return b.build(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBuilder() *jsonMLBuilder {
|
func newBuilder(preserveWhitespace bool) *jsonMLBuilder {
|
||||||
return &jsonMLBuilder{
|
return &jsonMLBuilder{
|
||||||
stack: &stack{},
|
stack: &stack{},
|
||||||
|
preserveWhitespace: preserveWhitespace,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,9 +110,11 @@ func (b *jsonMLBuilder) addToken(token xml.Token) error {
|
|||||||
b.currDepth++
|
b.currDepth++
|
||||||
case xml.CharData:
|
case xml.CharData:
|
||||||
t := token.(xml.CharData)
|
t := token.(xml.CharData)
|
||||||
s := strings.TrimSpace(string(t))
|
s := string(t)
|
||||||
if len(s) > 0 {
|
if !b.preserveWhitespace {
|
||||||
// Skip whitespace only string
|
s = strings.TrimSpace(s)
|
||||||
|
}
|
||||||
|
if len(s) > 0 { // Skip empty strings
|
||||||
b.appendToLastNode(string(t))
|
b.appendToLastNode(string(t))
|
||||||
}
|
}
|
||||||
case xml.EndElement:
|
case xml.EndElement:
|
||||||
|
@ -111,7 +111,7 @@ func prepareStdlib(g *typeGraph) {
|
|||||||
"parseHex": g.newSimpleFuncType(numberType, "str"),
|
"parseHex": g.newSimpleFuncType(numberType, "str"),
|
||||||
"parseJson": g.newSimpleFuncType(jsonType, "str"),
|
"parseJson": g.newSimpleFuncType(jsonType, "str"),
|
||||||
"parseYaml": 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"),
|
"encodeUTF8": g.newSimpleFuncType(numberArrayType, "str"),
|
||||||
"decodeUTF8": g.newSimpleFuncType(stringType, "arr"),
|
"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