-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.go
63 lines (57 loc) · 1.65 KB
/
parser.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
package parser
import (
"bufio"
"os"
"regexp"
"github.com/TomiLabo/tmngparser/ast"
"github.com/TomiLabo/tmngparser/token"
"github.com/mattn/go-runewidth"
)
func match(reg, str string) bool {
return regexp.MustCompile(reg).Match([]byte(str))
}
// ReadFile read file
func ReadFile(filename string) []string {
file, err := os.Open(filename)
if err != nil {
panic(err)
}
reader := bufio.NewReaderSize(file, 4096)
var result []string
for line := ""; err == nil; line, err = reader.ReadString('\n') {
if line == "" {
continue
}
result = append(result, line)
}
return result
}
// Parse try parse tmng file
func Parse(data []string) []ast.Tml {
var result []ast.Tml
for i, l := range data {
if match(`^■`, l) {
node := ast.New(i, token.Header, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else if match(`^●`, l) {
node := ast.New(i, token.Title, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else if match(`^◎`, l) {
node := ast.New(i, token.SubTitle, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else if match(`^○`, l) {
node := ast.New(i, token.ListItem, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else if match(`^\n|^\r`, l) {
node := ast.New(i, token.Empty, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else if match(`^\s+○`, l) || match(`^\s+●`, l) || match(`^\s+◎`, l) {
node := ast.New(i, token.Error, l, 0, runewidth.StringWidth(l))
result = append(result, node)
} else {
node := ast.New(i, token.PlaneText, l, 0, runewidth.StringWidth(l))
result = append(result, node)
}
}
return result
}