Exos template
This commit is contained in:
parent
a030e81501
commit
d383baba8a
3
.gitignore
vendored
3
.gitignore
vendored
@ -54,3 +54,6 @@ example-httptcp/example-httptcp
|
|||||||
example-httpserver/example-httpserver
|
example-httpserver/example-httpserver
|
||||||
http-router/http-router
|
http-router/http-router
|
||||||
tpl-text/tpl-text
|
tpl-text/tpl-text
|
||||||
|
tpl-ex1/tpl-ex1
|
||||||
|
tpl-ex2/tpl-ex2
|
||||||
|
tpl-ex3/tpl-ex3
|
||||||
|
20
tpl-ex1/main.go
Normal file
20
tpl-ex1/main.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tpl, err := template.ParseFiles("tpl.html")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
http.HandleFunc("/hello/", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
err = tpl.ExecuteTemplate(res, "tpl.html", "Hello World")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
http.ListenAndServe(":9000", nil)
|
||||||
|
}
|
7
tpl-ex1/tpl.html
Normal file
7
tpl-ex1/tpl.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Test tpl 1</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>{{ . }}</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
20
tpl-ex2/main.go
Normal file
20
tpl-ex2/main.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tpl, err := template.ParseFiles("tpl.html")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
err = tpl.ExecuteTemplate(res, "tpl.html", req)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
http.ListenAndServe(":9000", nil)
|
||||||
|
}
|
7
tpl-ex2/tpl.html
Normal file
7
tpl-ex2/tpl.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Test tpl 1</title></head>
|
||||||
|
<body>
|
||||||
|
<h1>{{ .URL }}</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
122
tpl-ex3/main.go
Normal file
122
tpl-ex3/main.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/csv"
|
||||||
|
"html/template"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
var COLUMNS []string
|
||||||
|
|
||||||
|
type FinancialData struct {
|
||||||
|
Date string
|
||||||
|
Open, High, Low, Close, Adj_Close, Volume float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type TplData struct {
|
||||||
|
Columns []string
|
||||||
|
Rows []FinancialData
|
||||||
|
}
|
||||||
|
|
||||||
|
func printHTML(tpl *template.Template, data []FinancialData, out io.Writer) {
|
||||||
|
tplData := TplData{
|
||||||
|
COLUMNS,
|
||||||
|
data,
|
||||||
|
}
|
||||||
|
err := tpl.ExecuteTemplate(out, "tpl.html", tplData)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readCsvLine(line []string) *FinancialData {
|
||||||
|
data := new(FinancialData)
|
||||||
|
for i, col := range line {
|
||||||
|
switch COLUMNS[i] {
|
||||||
|
case "Date":
|
||||||
|
data.Date = col
|
||||||
|
case "Open":
|
||||||
|
data.Open = toFloat(col)
|
||||||
|
case "High":
|
||||||
|
data.High = toFloat(col)
|
||||||
|
case "Low":
|
||||||
|
data.Low = toFloat(col)
|
||||||
|
case "Close":
|
||||||
|
data.Close = toFloat(col)
|
||||||
|
case "Adj Close":
|
||||||
|
data.Adj_Close = toFloat(col)
|
||||||
|
case "Volume":
|
||||||
|
data.Volume = toFloat(col)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func toFloat(v string) float64 {
|
||||||
|
f, err := strconv.ParseFloat(v, 64)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
func readCsvHeader(line []string) {
|
||||||
|
for _, col := range line {
|
||||||
|
COLUMNS = append(COLUMNS, col)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readCsv(in io.Reader) []FinancialData {
|
||||||
|
data := []FinancialData{}
|
||||||
|
csvReader := csv.NewReader(in)
|
||||||
|
for {
|
||||||
|
line, err := csvReader.Read()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
} else if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if len(COLUMNS) == 0 {
|
||||||
|
readCsvHeader(line)
|
||||||
|
} else {
|
||||||
|
data = append(data, *readCsvLine(line))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if len(os.Args) < 2 {
|
||||||
|
log.Fatalln("Usage go-financial <file>")
|
||||||
|
}
|
||||||
|
|
||||||
|
// read input
|
||||||
|
csv, err := os.Open(os.Args[1])
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Error reading file", err)
|
||||||
|
}
|
||||||
|
defer csv.Close()
|
||||||
|
|
||||||
|
// parse data
|
||||||
|
data := readCsv(csv)
|
||||||
|
|
||||||
|
tpl, err := template.New("").Funcs(template.FuncMap{
|
||||||
|
"class": func(index int) string {
|
||||||
|
if index%2 == 0 {
|
||||||
|
return "even"
|
||||||
|
}
|
||||||
|
return "odd"
|
||||||
|
},
|
||||||
|
}).ParseFiles("tpl.html", "script.js")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
http.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
printHTML(tpl, data, res)
|
||||||
|
})
|
||||||
|
http.ListenAndServe(":9000", nil)
|
||||||
|
}
|
63
tpl-ex3/script.js
Normal file
63
tpl-ex3/script.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
Highcharts.chart('container', {
|
||||||
|
title: {
|
||||||
|
text: 'Financial data'
|
||||||
|
},
|
||||||
|
|
||||||
|
subtitle: {
|
||||||
|
text: 'Source: yahoo.com'
|
||||||
|
},
|
||||||
|
|
||||||
|
xAxis: {
|
||||||
|
type: 'datetime'
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
title: {
|
||||||
|
text: 'Value'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plotOptions: {
|
||||||
|
area: {
|
||||||
|
fillColor: {
|
||||||
|
linearGradient: {
|
||||||
|
x1: 0,
|
||||||
|
y1: 0,
|
||||||
|
x2: 0,
|
||||||
|
y2: 1
|
||||||
|
},
|
||||||
|
stops: [
|
||||||
|
[0, Highcharts.getOptions().colors[0]],
|
||||||
|
[1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
marker: {
|
||||||
|
radius: 2
|
||||||
|
},
|
||||||
|
lineWidth: 1,
|
||||||
|
states: {
|
||||||
|
hover: {
|
||||||
|
lineWidth: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
threshold: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
layout: 'vertical',
|
||||||
|
align: 'right',
|
||||||
|
verticalAlign: 'middle'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [{
|
||||||
|
type: 'area',
|
||||||
|
name: 'Open',
|
||||||
|
data: [
|
||||||
|
{{ range .Rows }} [ {{ .Date }}, {{ .Open }} ],
|
||||||
|
{{ end }} ]
|
||||||
|
},{
|
||||||
|
type: 'area',
|
||||||
|
name: 'Close',
|
||||||
|
data: [
|
||||||
|
{{ range .Rows }} [ {{ .Date }}, {{ .Close }} ],
|
||||||
|
{{ end }} ]
|
||||||
|
}]
|
||||||
|
});
|
51
tpl-ex3/tpl.html
Normal file
51
tpl-ex3/tpl.html
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Financial</title></head>
|
||||||
|
<body>
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
{{ range .Columns }}
|
||||||
|
<th>{{ . }}</th>
|
||||||
|
{{ end }}
|
||||||
|
</tr>
|
||||||
|
{{ range $index, $element := .Rows }}
|
||||||
|
<tr class="{{ class $index }}">
|
||||||
|
{{ with $element }}
|
||||||
|
<td>{{ .Date }}</td>
|
||||||
|
<td>{{ .Open }}</td>
|
||||||
|
<td>{{ .High }}</td>
|
||||||
|
<td>{{ .Low }}</td>
|
||||||
|
<td>{{ .Close }}</td>
|
||||||
|
<td>{{ .Adj_Close }}</td>
|
||||||
|
<td>{{ .Volume }}</td>
|
||||||
|
{{ end }}
|
||||||
|
</tr>
|
||||||
|
{{ end }}
|
||||||
|
</table>
|
||||||
|
<div id="container"></div>
|
||||||
|
<style>
|
||||||
|
#container {
|
||||||
|
min-width: 310px;
|
||||||
|
max-width: 800px;
|
||||||
|
height: 400px;
|
||||||
|
margin: 0 auto
|
||||||
|
}
|
||||||
|
tr.odd td {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
tr.even td {
|
||||||
|
background-color: white;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script
|
||||||
|
src="https://code.jquery.com/jquery-3.2.1.min.js"
|
||||||
|
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
<script src="https://code.highcharts.com/highcharts.src.js"></script>
|
||||||
|
<script>
|
||||||
|
{{ template "script.js" . }}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user