/
mermaid_ink.go
91 lines (79 loc) · 1.76 KB
/
mermaid_ink.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
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 mdt
import (
"bytes"
"encoding/base64"
"encoding/json"
)
func NewMermaidInk() *MermaidInk {
return &MermaidInk{
BaseURL: "https://mermaid.ink/img/",
Config: InkInput{
Mermaid: "{\n \"theme\": \"default\"\n}",
UpdateEditor: false,
AutoSync: true,
UpdateDiagram: false,
},
}
}
type MermaidInk struct {
BaseURL string
Config InkInput
}
func (ink *MermaidInk) UpdateAll(wraps []*FenceWrap) error {
for _, w := range wraps {
err := ink.Update(w)
if err != nil {
return err
}
}
return nil
}
func (ink *MermaidInk) Update(f *FenceWrap) error {
b64, err := ink.Encode(f.Block.Code.Mermaid)
if err != nil {
return err
}
f.Block.SetSrc(ink.BaseURL + b64)
return nil
}
func (ink *MermaidInk) WrapAll(fences []*Fence) ([]*FenceWrap, error) {
wraps := make([]*FenceWrap, 0, len(fences))
for _, f := range fences {
w, err := ink.Wrap(f)
if err != nil {
return nil, err
}
wraps = append(wraps, w)
}
return wraps, nil
}
func (ink *MermaidInk) Wrap(f *Fence) (*FenceWrap, error) {
b64, err := ink.Encode(f.Content())
if err != nil {
return nil, err
}
block := NewBlock(f.Content(), ink.BaseURL+b64)
return &FenceWrap{
Segment: f.Slice(),
Block: block,
}, nil
}
func (ink *MermaidInk) Encode(code []byte) (string, error) {
ink.Config.Code = string(code)
buf := &bytes.Buffer{}
encoder := json.NewEncoder(buf)
encoder.SetEscapeHTML(false)
err := encoder.Encode(ink.Config)
if err != nil {
return "", err
}
e := base64.RawURLEncoding.EncodeToString(buf.Bytes())
return e, nil
}
type InkInput struct {
Code string `json:"code"`
Mermaid string `json:"mermaid"`
UpdateEditor bool `json:"updateEditor"`
AutoSync bool `json:"autoSync"`
UpdateDiagram bool `json:"updateDiagram"`
}