-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse.go
76 lines (57 loc) · 1.17 KB
/
parse.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
package sample_mk
import "strings"
const (
defaultNodeLen = 10
)
// Parse
//
// return all markdown nodes from lines
func Parse(lines []string) []Node {
if len(lines) == 0 {
return nil
}
nodes := make([]Node, 0, defaultNodeLen)
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" {
continue
}
if strings.HasPrefix(line, string(headerToken)) {
nodes = append(nodes, parseHeader(line))
continue
}
isListToken := false
for listTok := range listTokens {
if strings.HasPrefix(line, string(listTok)) {
isListToken = true
break
}
}
if isListToken {
nodes = append(nodes, parseListItem(line))
} else {
nodes = append(nodes, parseBasicItem(line))
}
}
return nodes
}
func parseHeader(line string) Header {
level := 0
for _, c := range line {
if c != headerToken {
break
}
level++
}
line = strings.TrimLeft(line, string(headerToken))
return NewHeader(level, line)
}
func parseListItem(line string) ListItem {
for listTok := range listTokens {
line = strings.TrimLeft(line, string(listTok))
}
return NewListItem(line)
}
func parseBasicItem(line string) BasicItem {
return NewBasicItem(line)
}