Add argument in parseXmlJsonml function

This commit is contained in:
Rohit Jangid 2023-06-27 13:35:59 +05:30
parent a2105c2532
commit ae9a67d6e5
6 changed files with 41 additions and 17 deletions

View File

@ -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(": ")}}}},

View File

@ -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:

View File

@ -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"),

View File

@ -0,0 +1,7 @@
[
"svg",
[
"circle",
" Foobar"
]
]

View File

@ -0,0 +1 @@
std.parseXmlJsonml('<svg><circle> Foobar</circle></svg>', preserveWhitespace=true)

View File