diff options
author | Pacien TRAN-GIRARD | 2014-09-30 22:07:44 +0200 |
---|---|---|
committer | Pacien TRAN-GIRARD | 2014-09-30 22:07:44 +0200 |
commit | 1be0cb5a3fa5b2abe5f5d10ec827f06617861d4b (patch) | |
tree | 4ef98c2982834af152cd4b57a16d310e8635be0e /src | |
parent | 67b03424e3aee09078dff50cbf9d3e9e4221bc93 (diff) | |
download | go-vparse-1be0cb5a3fa5b2abe5f5d10ec827f06617861d4b.tar.gz |
Diffstat (limited to 'src')
-rw-r--r-- | src/example.go | 31 | ||||
-rw-r--r-- | src/vparse/vparse.go | 69 |
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 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
4 | "encoding/json" | ||
5 | "fmt" | ||
6 | "os" | ||
7 | "vparse" | ||
8 | ) | ||
9 | |||
10 | func check(err error) { | ||
11 | if err != nil { | ||
12 | panic(err) | ||
13 | } | ||
14 | } | ||
15 | |||
16 | func 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 | |||
28 | func 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 @@ | |||
1 | package vparse | ||
2 | |||
3 | import ( | ||
4 | "bufio" | ||
5 | "io" | ||
6 | "strings" | ||
7 | ) | ||
8 | |||
9 | type Node struct { | ||
10 | Type string | ||
11 | Properties map[string]string | ||
12 | Children []Node | ||
13 | } | ||
14 | |||
15 | func 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 | |||
21 | SC: | ||
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 | |||
66 | func Parse(reader io.Reader) []Node { | ||
67 | scanner := bufio.NewScanner(reader) | ||
68 | return parseNode(scanner, "").Children | ||
69 | } | ||