-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathheader.go
60 lines (56 loc) · 1.45 KB
/
header.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
package toc
import (
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/util"
)
// Header holds the data about a header.
type Header struct {
Level int
Text string
ID string
}
// Headers return table of content from parsed markdown document.
func Headers(n ast.Node, source []byte) []Header {
var toc = make([]Header, 0, 100)
ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
if n.Kind() == ast.KindHeading && entering {
var (
h = n.(*ast.Heading)
text = n.Text(source)
header = Header{
Text: util.BytesToReadOnlyString(text),
Level: h.Level,
}
)
if id, found := h.AttributeString("id"); found {
header.ID = util.BytesToReadOnlyString(id.([]byte))
}
toc = append(toc, header)
return ast.WalkSkipChildren, nil
}
return ast.WalkContinue, nil
})
return toc
}
// // MarkdownHeaders writes table of content in markdown format.
// func MarkdownHeaders(w io.Writer, headers []Header, filename string) {
// var level, indent int
// for i, header := range headers {
// if i > 0 {
// if level < header.Level {
// indent++
// } else if indent > 0 {
// indent--
// }
// }
// level = header.Level
// prefix := strings.Repeat(" ", indent)
// var text string
// if header.ID != "" {
// text = fmt.Sprintf("[%s](%s#%s)", header.Text, filename, header.ID)
// } else {
// text = header.Text
// }
// fmt.Fprintf(w, "%s- %s\n", prefix, text)
// }
// }