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

View File

@ -48,12 +48,13 @@ func (s *stack) Size() int {
type jsonMLBuilder struct { type jsonMLBuilder struct {
stack *stack stack *stack
preserveWhitespace bool
currDepth int 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:

View File

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

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