-
Notifications
You must be signed in to change notification settings - Fork 5
/
markdown.go
95 lines (81 loc) · 2.3 KB
/
markdown.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
92
93
94
95
package fir
import (
"bytes"
"html/template"
embed "github.com/13rac1/goldmark-embed"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
"k8s.io/klog/v2"
)
var mdparser = markdownParser()
func markdown(readFile readFileFunc, existFile existFileFunc) func(in string, linenum ...int) template.HTML {
return func(in string, linenum ...int) template.HTML {
var indata []byte
if existFile(in) {
_, data, err := readFile(in)
if err != nil {
klog.Errorln(err)
return ""
}
indata = data
} else {
indata = []byte(in)
}
if len(linenum) > 0 {
min := linenum[0]
var max int
if len(linenum) > 1 {
max = linenum[1]
}
parts := bytes.SplitN(indata, []byte("\n"), -1)
if max > len(parts) || max == 0 {
max = len(parts)
}
chunk := parts[min:max]
indata = bytes.Join(chunk, []byte("\n"))
}
var buf bytes.Buffer
if err := mdparser.Convert(indata, &buf); err != nil {
klog.Errorln(err)
return ""
}
return template.HTML(buf.String())
}
}
func markdownParser() goldmark.Markdown {
var (
extensions []goldmark.Extender
parserOptions []parser.Option
rendererOptions []renderer.Option
)
rendererOptions = append(rendererOptions, html.WithHardWraps())
rendererOptions = append(rendererOptions, html.WithXHTML())
rendererOptions = append(rendererOptions, html.WithUnsafe())
extensions = append(extensions, extension.Table)
extensions = append(extensions, extension.Strikethrough)
extensions = append(extensions, extension.Linkify)
extensions = append(extensions, extension.TaskList)
extensions = append(extensions, extension.Typographer)
extensions = append(extensions, extension.DefinitionList)
extensions = append(extensions, extension.Footnote)
extensions = append(extensions, extension.GFM)
extensions = append(extensions, extension.CJK)
extensions = append(extensions, embed.New())
parserOptions = append(parserOptions, parser.WithAutoHeadingID())
parserOptions = append(parserOptions, parser.WithAttribute())
md := goldmark.New(
goldmark.WithExtensions(
extensions...,
),
goldmark.WithParserOptions(
parserOptions...,
),
goldmark.WithRendererOptions(
rendererOptions...,
),
)
return md
}