package handlers import ( "html/template" "net/http" "os" "path/filepath" ) type TemplateRenderer struct { funcs template.FuncMap templates map[string]*template.Template } func NewTemplateRenderer(templateDir string) *TemplateRenderer { funcs := template.FuncMap{ "formatBool": func(b bool) string { if b { return "Yes" } return "No" }, "formatStatus": func(s string) string { switch s { case "running": return "Running" case "stopped": return "Stopped" case "starting": return "Starting" case "stopping": return "Stopping" case "error": return "Error" default: return s } }, } tr := &TemplateRenderer{funcs: funcs} tr.templates = make(map[string]*template.Template) pages := []string{ "index", "login", "signup", "dashboard", "change_password", "admin_dashboard", "admin_users", } layoutContent, err := os.ReadFile(filepath.Join(templateDir, "layout.html")) if err != nil { panic(err) } for _, page := range pages { pageContent, err := os.ReadFile(filepath.Join(templateDir, page+".html")) if err != nil { panic(err) } // Combine: page defines "body", layout is the root template combined := string(pageContent) + "\n" + string(layoutContent) tmpl, err := template.New("").Funcs(funcs).Parse(combined) if err != nil { panic(err) } tr.templates[page] = tmpl } return tr } func (tr *TemplateRenderer) Render(w http.ResponseWriter, r *http.Request, name string, data map[string]interface{}) { tmpl, ok := tr.templates[name] if !ok { http.Error(w, "Template not found", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tmpl.Execute(w, data); err != nil { http.Error(w, "Template error: "+err.Error(), http.StatusInternalServerError) } }