1
1
mirror of https://github.com/wader/fq.git synced 2024-12-23 13:22:58 +03:00

xml: Keep track of default namespace and skip it element names

Refactor element name handling a bit, return it instead, feels nicer.
This commit is contained in:
Mattias Wadman 2022-08-21 01:56:26 +02:00
parent 93acc02e97
commit f24d685a5b
3 changed files with 108 additions and 19 deletions

21
format/xml/testdata/test.svg vendored Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
sodipodi:docname="ffclippy.svg"
version="1.1"
viewBox="0 0 192.756 192.756"
height="2500"
width="2500">
<sodipodi:namedview
showgrid="false"
pagecolor="#ffffff" />
<g
id="g863"
clip-rule="evenodd"
fill-rule="evenodd">
</g>
</svg>

After

Width:  |  Height:  |  Size: 599 B

59
format/xml/testdata/test.svg.fqtest vendored Normal file
View File

@ -0,0 +1,59 @@
$ fq . test.svg
{
"svg": {
"-height": "2500",
"-inkscape:version": "1.0 (4035a4f, 2020-05-01)",
"-sodipodi:docname": "ffclippy.svg",
"-version": "1.1",
"-viewBox": "0 0 192.756 192.756",
"-width": "2500",
"-xmlns": "http://www.w3.org/2000/svg",
"-xmlns:inkscape": "http://www.inkscape.org/namespaces/inkscape",
"-xmlns:sodipodi": "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
"-xmlns:svg": "http://www.w3.org/2000/svg",
"g": {
"-clip-rule": "evenodd",
"-fill-rule": "evenodd",
"-id": "g863"
},
"sodipodi:namedview": {
"-pagecolor": "#ffffff",
"-showgrid": "false"
}
}
}
$ fq -o array=true . test.svg
[
"svg",
{
"height": "2500",
"inkscape:version": "1.0 (4035a4f, 2020-05-01)",
"sodipodi:docname": "ffclippy.svg",
"version": "1.1",
"viewBox": "0 0 192.756 192.756",
"width": "2500",
"xmlns": "http://www.w3.org/2000/svg",
"xmlns:inkscape": "http://www.inkscape.org/namespaces/inkscape",
"xmlns:sodipodi": "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
"xmlns:svg": "http://www.w3.org/2000/svg"
},
[
[
"sodipodi:namedview",
{
"pagecolor": "#ffffff",
"showgrid": "false"
},
[]
],
[
"g",
{
"clip-rule": "evenodd",
"fill-rule": "evenodd",
"id": "g863"
},
[]
]
]
]

View File

@ -114,6 +114,9 @@ func fromXMLToArray(n xmlNode) any {
space = nss.lookup(a.Name)
}
name = space + ":" + local
} else if local == "xmlns" {
// track default namespace
nss = nss.push("", a.Value)
}
attrs[name] = a.Value
}
@ -133,8 +136,8 @@ func fromXMLToArray(n xmlNode) any {
if space != "" {
space = nss.lookup(n.XMLName)
}
// only add if ns is found and not default ns
name := elmName(space, local)
elm := []any{name}
if len(attrs) > 0 {
elm = append(elm, attrs)
@ -151,8 +154,8 @@ func fromXMLToArray(n xmlNode) any {
}
func fromXMLToObject(n xmlNode, xi format.XMLIn) any {
var f func(n xmlNode, seq int, nss xmlNNStack) any
f = func(n xmlNode, seq int, nss xmlNNStack) any {
var f func(n xmlNode, seq int, nss xmlNNStack) (string, any)
f = func(n xmlNode, seq int, nss xmlNNStack) (string, any) {
attrs := map[string]any{}
for _, a := range n.Attrs {
@ -165,7 +168,11 @@ func fromXMLToObject(n xmlNode, xi format.XMLIn) any {
space = nss.lookup(a.Name)
}
name = space + ":" + local
} else if local == "xmlns" {
// track default namespace
nss = nss.push("", a.Value)
}
attrs["-"+name] = a.Value
}
@ -174,20 +181,17 @@ func fromXMLToObject(n xmlNode, xi format.XMLIn) any {
if len(n.Nodes) == 1 {
nSeq = -1
}
local, space := nn.XMLName.Local, nn.XMLName.Space
if space != "" {
space = nss.lookup(nn.XMLName)
}
// only add if ns is found and not default ns
name := elmName(space, local)
if e, ok := attrs[name]; ok {
nname, naddrs := f(nn, nSeq, nss)
if e, ok := attrs[nname]; ok {
if ea, ok := e.([]any); ok {
attrs[name] = append(ea, f(nn, nSeq, nss))
attrs[nname] = append(ea, naddrs)
} else {
attrs[name] = []any{e, f(nn, nSeq, nss)}
attrs[nname] = []any{e, naddrs}
}
} else {
attrs[name] = f(nn, nSeq, nss)
attrs[nname] = naddrs
}
}
@ -201,18 +205,23 @@ func fromXMLToObject(n xmlNode, xi format.XMLIn) any {
attrs["#comment"] = strings.TrimSpace(string(n.Comment))
}
local, space := n.XMLName.Local, n.XMLName.Space
if space != "" {
space = nss.lookup(n.XMLName)
}
name := elmName(space, local)
if len(attrs) == 0 {
return ""
return name, ""
} else if len(attrs) == 1 && attrs["#text"] != nil {
return attrs["#text"]
return name, attrs["#text"]
}
return attrs
return name, attrs
}
return map[string]any{
n.XMLName.Local: f(n, -1, nil),
}
name, attrs := f(n, -1, nil)
return map[string]any{name: attrs}
}
func decodeXML(d *decode.D, in any) any {