package helpers import ( "html/template" "net/http" "strings" "time" httpHelpers "synlotto-website/internal/helpers/http" "synlotto-website/internal/models" "github.com/justinas/nosurf" ) // ToDo should these structs be here? type siteMeta struct { Name string CopyrightYearStart int } var meta siteMeta func InitSiteMeta(name string, yearStart, yearEnd int) { meta = siteMeta{ Name: name, CopyrightYearStart: yearStart, } } func TemplateContext(w http.ResponseWriter, r *http.Request, data models.TemplateData) map[string]interface{} { session, _ := httpHelpers.GetSession(w, r) var flash string if f, ok := session.Values["flash"].(string); ok { flash = f delete(session.Values, "flash") session.Save(r, w) } return map[string]interface{}{ "CSRFToken": nosurf.Token(r), "Flash": flash, "User": data.User, "IsAdmin": data.IsAdmin, "NotificationCount": data.NotificationCount, "Notifications": data.Notifications, "MessageCount": data.MessageCount, "Messages": data.Messages, "SiteName": meta.Name, "CopyrightYearStart": meta.CopyrightYearStart, } } func TemplateFuncs() template.FuncMap { return template.FuncMap{ "plus1": func(i int) int { return i + 1 }, "minus1": func(i int) int { if i > 1 { return i - 1 } return 0 }, "mul": func(a, b int) int { return a * b }, "add": func(a, b int) int { return a + b }, "sub": func(a, b int) int { return a - b }, "min": func(a, b int) int { if a < b { return a } return b }, "intVal": func(p *int) int { if p == nil { return 0 } return *p }, "inSlice": InSlice, "lower": lower, "truncate": func(s string, max int) string { if len(s) <= max { return s } return s[:max] + "..." }, "PageRange": PageRange, "now": time.Now, "humanTime": func(v interface{}) string { switch t := v.(type) { case time.Time: return t.Local().Format("02 Jan 2006 15:04") case string: parsed, err := time.Parse(time.RFC3339, t) if err == nil { return parsed.Local().Format("02 Jan 2006 15:04") } return t default: return "" } }, "rangeClass": rangeClass, } } func LoadTemplateFiles(name string, files ...string) *template.Template { shared := []string{ "templates/main/layout.html", "templates/main/topbar.html", "templates/main/footer.html", } all := append(shared, files...) return template.Must(template.New(name).Funcs(TemplateFuncs()).ParseFiles(all...)) } func SetFlash(w http.ResponseWriter, r *http.Request, message string) { session, _ := httpHelpers.GetSession(w, r) session.Values["flash"] = message session.Save(r, w) } func InSlice(n int, list []int) bool { for _, v := range list { if v == n { return true } } return false } func lower(input string) string { return strings.ToLower(input) } func PageRange(current, total int) []int { var pages []int for i := 1; i <= total; i++ { pages = append(pages, i) } return pages } func rangeClass(n int) string { switch { case n >= 1 && n <= 9: return "01-09" case n >= 10 && n <= 19: return "10-19" case n >= 20 && n <= 29: return "20-29" case n >= 30 && n <= 39: return "30-39" case n >= 40 && n <= 49: return "40-49" default: return "50-plus" } }