1package main
2
3import (
4 "fmt"
5 "html/template"
6 "strings"
7)
8
9var templates = template.Must(template.New("").Funcs(template.FuncMap{
10 "split": strings.Split,
11 "join": func(base, part string) string {
12 if base == "" {
13 return part
14 }
15 return base + "/" + part
16 },
17 "parent": func(path string) string {
18 if !strings.Contains(path, "/") {
19 return ""
20 }
21 parts := strings.Split(path, "/")
22 return strings.Join(parts[:len(parts)-1], "/")
23 },
24 "add": func(a, b int) int {
25 return a + b
26 },
27 "max": func(a, b int) int {
28 if a > b {
29 return a
30 }
31 return b
32 },
33 "truncate": func(s string, l int) string {
34 s = strings.Split(s, "\n")[0]
35 s = strings.TrimSpace(s)
36 r := []rune(s)
37 if len(r) <= l {
38 return s
39 }
40 return string(r[:l]) + "..."
41 },
42 "float64": func(i int) float64 {
43 return float64(i)
44 },
45 "multiply": func(a, b float64) float64 {
46 return a * b
47 },
48 "divide": func(a, b float64) float64 {
49 if b == 0 {
50 return 0
51 }
52 return a / b
53 },
54 "humanize": func(size int64) string {
55 const unit = 1024
56 if size < unit {
57 return fmt.Sprintf("%d B", size)
58 }
59 div, exp := int64(unit), 0
60 for n := size / unit; n >= unit; n /= unit {
61 div *= unit
62 exp++
63 }
64 return fmt.Sprintf("%.1f %cB", float64(size)/float64(div), "KMGTPE"[exp])
65 },
66}).ParseFS(viewsFS, "views/*.html"))