-
-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathmarshal1.go
56 lines (51 loc) · 1.66 KB
/
marshal1.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package idr
import (
"fmt"
"github.com/jf-tech/go-corelib/jsons"
"github.com/jf-tech/go-corelib/strs"
)
// j1NodePtrName returns a categorized name for a *Node pointer used in JSONify1.
func j1NodePtrName(n *Node) *string {
if n == nil {
return nil
}
name := func(n *Node) string {
if IsXML(n) && XMLSpecificOf(n).NamespacePrefix != "" {
return XMLSpecificOf(n).NamespacePrefix + ":" + n.Data
}
return n.Data
}
switch n.Type {
case DocumentNode:
return strs.StrPtr(fmt.Sprintf("(%s)", n.Type))
case ElementNode, AttributeNode:
return strs.StrPtr(fmt.Sprintf("(%s %s)", n.Type, name(n)))
case TextNode:
return strs.StrPtr(fmt.Sprintf("(%s '%s')", n.Type, n.Data))
default:
return strs.StrPtr(fmt.Sprintf("(unknown '%s')", n.Data))
}
}
// J1NodeToInterface translates an *idr.Node and its subtree into a JSON-marshaling friendly
// interface{} that includes all the idr.Node internal fields, including tree pointers.
func J1NodeToInterface(n *Node) interface{} {
m := make(map[string]interface{})
m["Parent"] = j1NodePtrName(n.Parent)
m["FirstChild"] = j1NodePtrName(n.FirstChild)
m["LastChild"] = j1NodePtrName(n.LastChild)
m["PrevSibling"] = j1NodePtrName(n.PrevSibling)
m["NextSibling"] = j1NodePtrName(n.NextSibling)
m["Type"] = n.Type.String()
m["Data"] = n.Data
m["FormatSpecific"] = n.FormatSpecific
var children []interface{}
for child := n.FirstChild; child != nil; child = child.NextSibling {
children = append(children, J1NodeToInterface(child))
}
m["Children"] = children
return m
}
// JSONify1 json marshals a *Node verbatim. Mostly used in test for snapshotting.
func JSONify1(n *Node) string {
return jsons.BPM(J1NodeToInterface(n))
}