-
Notifications
You must be signed in to change notification settings - Fork 18
/
server.go
116 lines (101 loc) · 2.2 KB
/
server.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"net/http"
"text/template"
)
const html = `{{define "T"}}
<!doctype html>
<html>
<head>
<script>
{{.Chartjs}}
</script>
<meta name = "viewport" content = "initial-scale = 1, user-scalable = no">
<style>
canvas{
}
</style>
</head>
<body>
<div style="padding-top:30px;">
By <a href="http://www.bigendian123.com/skoo.html" target="_blank">skoo</a>
</div>
<div style="padding-top:30px;"></div>
{{.Canvas}}
<script>
{{.JsonCode}}
{{.NewChart}}
</script>
</body>
</html>
{{end}}
`
type ChartIf interface {
Canvas(string, int, int) string
JsonCode(*ChartDataType) (string, error)
NewChart(string) string
}
var (
ChartHandlers = make(map[string]ChartIf)
ChartFiles []string
Index int
)
func handler(w http.ResponseWriter, r *http.Request) {
if len(ChartFiles) == 0 {
return
}
var file string
if Index < len(ChartFiles) {
file = ChartFiles[Index]
Index++
} else {
Index = 0
file = ChartFiles[Index]
}
datas, err := ParseDataFile(file)
if err != nil {
w.Write([]byte(err.Error()))
return
}
if len(datas) == 0 {
return
}
c := datas[0]
var chart ChartIf
var Args = map[string]string{
"Chartjs": Chartjs,
}
if prop, err := c.Prop(); err != nil {
w.Write([]byte(err.Error()))
return
} else {
chart = ChartHandlers[prop.Name]
canvas := chart.Canvas("line", prop.Height, prop.Width)
Args["Canvas"] = canvas
newChart := chart.NewChart("line")
Args["NewChart"] = newChart
if json, err := chart.JsonCode(c); err != nil {
w.Write([]byte(err.Error()))
return
} else {
Args["JsonCode"] = json
}
}
if t, err := template.New("foo").Parse(html); err != nil {
w.Write([]byte(err.Error()))
} else {
if err = t.ExecuteTemplate(w, "T", Args); err != nil {
w.Write([]byte(err.Error()))
}
}
}
func ListenAndServe(addr string) error {
http.HandleFunc("/", handler)
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {})
var err error
ChartFiles, err = LookupCurrentDir(".")
if err != nil {
return err
}
return http.ListenAndServe(addr, nil)
}