aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/example.go31
-rw-r--r--src/vparse/vparse.go69
2 files changed, 100 insertions, 0 deletions
diff --git a/src/example.go b/src/example.go
new file mode 100644
index 0000000..9196336
--- /dev/null
+++ b/src/example.go
@@ -0,0 +1,31 @@
1package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "os"
7 "vparse"
8)
9
10func check(err error) {
11 if err != nil {
12 panic(err)
13 }
14}
15
16func vToJson(filename string) string {
17 f, err := os.Open(filename)
18 check(err)
19
20 parsed := vparse.Parse(f)
21
22 jsonEncoded, err := json.MarshalIndent(parsed, "", "\t")
23 check(err)
24
25 return string(jsonEncoded)
26}
27
28func main() {
29 fmt.Println(vToJson("vcal.ics"))
30 fmt.Println(vToJson("vcard.vcs"))
31}
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}