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"))