-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmarshal.go
More file actions
91 lines (73 loc) · 2.04 KB
/
marshal.go
File metadata and controls
91 lines (73 loc) · 2.04 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package listmd
import (
"encoding/json"
"strconv"
"strings"
"github.com/goccy/go-yaml"
)
func collectNode(nodes []*Node) (newNodes []*Node) {
for _, node := range nodes {
uidSlice := strings.Split(node.UID, "_")
node.collectionIndex, _ = strconv.Atoi(uidSlice[1])
newNodes = append(newNodes, node)
if len(node.Children) > 0 {
newNodes = append(newNodes, collectNode(node.Children)...)
}
}
return
}
func flattenJSONToNode(nodeCollections [][]*Node) (flatNodes []*Node) {
for _, nodeGroup := range nodeCollections {
flatNodes = append(flatNodes, collectNode(nodeGroup)...)
}
return
}
// MarshalJSON returns list markdown bytes from JSON v.
func MarshalJSON(v []byte) (data []byte, err error) {
var list ListMd
err = json.Unmarshal(v, &list)
if err != nil {
return
}
return Marshal(list)
}
// Marshal returns list markdown bytes of v.
func Marshal(v ListMd) (data []byte, err error) {
flatList := flattenJSONToNode(v.Lists)
builder := strings.Builder{}
if v.Metadata != nil {
builder.WriteString(breakString)
builder.WriteString("\n")
metadataString, errYaml := yaml.Marshal(v.Metadata)
if errYaml != nil {
return data, errYaml
}
builder.WriteString(string(metadataString))
builder.WriteString(breakString)
builder.WriteString("\n")
}
sortNodesByID(flatList)
collectionIndex := 0
for _, list := range flatList {
if list.collectionIndex > collectionIndex {
builder.WriteString(breakString)
builder.WriteString("\n")
}
contentIndent := (list.level + 1) * len(bulletPrefix)
if list.level > 0 {
builder.WriteString(strings.Repeat(" ", list.level*2))
}
builder.WriteString(bulletPrefix)
splitMd := strings.Split(list.Markdown, "\n")
for mdIndex, md := range splitMd {
if mdIndex > 0 {
builder.WriteString(strings.Repeat(" ", contentIndent))
}
builder.WriteString(md)
builder.WriteString("\n")
}
collectionIndex = list.collectionIndex
}
data = []byte(builder.String())
return
}