aboutsummaryrefslogtreecommitdiff
path: root/src/vparse/vparse.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/vparse/vparse.go')
-rw-r--r--src/vparse/vparse.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/vparse/vparse.go b/src/vparse/vparse.go
new file mode 100644
index 0000000..624d0a5
--- /dev/null
+++ b/src/vparse/vparse.go
@@ -0,0 +1,69 @@
1package vparse
2
3import (
4 "bufio"
5 "io"
6 "strings"
7)
8
9type Node struct {
10 Type string
11 Properties map[string]string
12 Children []Node
13}
14
15func parseNode(scanner *bufio.Scanner, nodeType string) Node {
16 node := Node{nodeType, make(map[string]string), make([]Node, 0)}
17
18 var lastProperty string
19 var expectColon bool = false
20
21SC:
22 for scanner.Scan() {
23
24 line := scanner.Text()
25
26 if strings.HasPrefix(line, " ") {
27 value := line[1:]
28 if expectColon {
29 value = strings.SplitN(value, ":", 2)[1]
30 }
31
32 node.Properties[lastProperty] += value
33
34 expectColon = false
35 continue
36 }
37
38 if !strings.Contains(line, ":") {
39 lastProperty = line
40 expectColon = true
41 continue
42 }
43
44 splitLine := strings.SplitN(line, ":", 2)
45
46 switch splitLine[0] {
47
48 case "END":
49 break SC
50
51 case "BEGIN":
52 node.Children = append(node.Children, parseNode(scanner, splitLine[1]))
53 break
54
55 default:
56 node.Properties[splitLine[0]] = splitLine[1]
57 lastProperty = splitLine[0]
58
59 }
60
61 }
62
63 return node
64}
65
66func Parse(reader io.Reader) []Node {
67 scanner := bufio.NewScanner(reader)
68 return parseNode(scanner, "").Children
69}