aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPacien TRAN-GIRARD2014-09-30 22:07:44 +0200
committerPacien TRAN-GIRARD2014-09-30 22:07:44 +0200
commit1be0cb5a3fa5b2abe5f5d10ec827f06617861d4b (patch)
tree4ef98c2982834af152cd4b57a16d310e8635be0e
parent67b03424e3aee09078dff50cbf9d3e9e4221bc93 (diff)
downloadvparse-master.tar.gz
First versionHEADmaster
-rw-r--r--.gitignore4
-rw-r--r--src/example.go31
-rw-r--r--src/vparse/vparse.go69
-rw-r--r--vcal.ics12
-rw-r--r--vcard.vcs16
5 files changed, 132 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index daf913b..8c7125a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,7 @@ _testmain.go
22*.exe 22*.exe
23*.test 23*.test
24*.prof 24*.prof
25
26# IDEA
27.idea
28*.iml
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}
diff --git a/vcal.ics b/vcal.ics
new file mode 100644
index 0000000..46df067
--- /dev/null
+++ b/vcal.ics
@@ -0,0 +1,12 @@
1BEGIN:VCALENDAR
2VERSION:2.0
3PRODID:-//hacksw/handcal//NONSGML v1.0//EN
4BEGIN:VEVENT
5UID:uid1@example.com
6DTSTAMP:19970714T170000Z
7ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com
8DTSTART:19970714T170000Z
9DTEND:19970715T035959Z
10SUMMARY:Bastille Day Party
11END:VEVENT
12END:VCALENDAR
diff --git a/vcard.vcs b/vcard.vcs
new file mode 100644
index 0000000..55ee959
--- /dev/null
+++ b/vcard.vcs
@@ -0,0 +1,16 @@
1BEGIN:VCARD
2VERSION:4.0
3N:Gump;Forrest;;;
4FN:Forrest Gump
5ORG:Bubba Gump Shrimp Co.
6TITLE:Shrimp Man
7PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif
8TEL;TYPE=work,voice;VALUE=uri:tel:+1-111-555-1212
9TEL;TYPE=home,voice;VALUE=uri:tel:+1-404-555-1212
10ADR;TYPE=work;LABEL="100 Waters Edge\nBaytown, LA 30314\nUnited States of America"
11 :;;100 Waters Edge;Baytown;LA;30314;United States of America
12ADR;TYPE=home;LABEL="42 Plantation St.\nBaytown, LA 30314\nUnited States of America"
13 :;;42 Plantation St.;Baytown;LA;30314;United States of America
14EMAIL:forrestgump@example.com
15REV:20080424T195243Z
16END:VCARD