package libmkwebpage import ( "bytes" "embed" "fmt" "html/template" "io/fs" "net/http" texttemplate "text/template" ) type templates struct { staticRoot embed.FS dynamicRoot fs.FS errorTemplate string bindings template.FuncMap } func (w *Webpage) getTemplateRoot() fs.FS { if w.isDynamic() { return w.templates.dynamicRoot } return w.templates.staticRoot } func (w *Webpage) NewTemplates(static embed.FS, dynamic fs.FS) *Webpage { w.templates = templates{staticRoot: static, dynamicRoot: dynamic, bindings: template.FuncMap{}} return w } func (w *Webpage) SetErrorTemplate(path string) { w.templates.errorTemplate = path } func (w *Webpage) Error(writer http.ResponseWriter, code int, err error) { writer.WriteHeader(code) if w.templates.errorTemplate == "" { fmt.Fprintln(writer, err) } } func (w *Webpage) InternalServerError(writer http.ResponseWriter, err error) { w.Error(writer, http.StatusInternalServerError, err) } func (w *Webpage) BadRequest(writer http.ResponseWriter, err error) { w.Error(writer, http.StatusInternalServerError, err) } func (w *Webpage) BindTemplateFunc(name string, fun any) *Webpage { w.templates.bindings[name] = fun return w } func (w *Webpage) RenderTemplate(writer http.ResponseWriter, name string, data any) { writer.Header().Set("Content-Type", "text/html; charset=utf-8") tmpl, err := fs.ReadFile(w.getTemplateRoot(), "templates/"+name+".tmpl") if err != nil { panic(err) } if err := template.Must(template.New("templates/"+name+".tmpl").Funcs(w.templates.bindings).Parse(string(tmpl))).Execute(writer, data); err != nil { panic(err) } } func (w *Webpage) RenderTemplateToString(name string, data any) string { buf := bytes.NewBuffer(nil) tmpl, err := fs.ReadFile(w.getTemplateRoot(), "templates/"+name+".tmpl") if err != nil { panic(err) } if err := template.Must(template.New("templates/"+name+".tmpl").Funcs(w.templates.bindings).Parse(string(tmpl))).Execute(buf, data); err != nil { panic(err) } return buf.String() } func (w *Webpage) RenderTemplateToStringUnescaped(name string, data any) string { buf := bytes.NewBuffer(nil) tmpl, err := fs.ReadFile(w.getTemplateRoot(), "templates/"+name+".tmpl") if err != nil { panic(err) } if err := texttemplate.Must(texttemplate.New("templates/"+name+".tmpl").Funcs(w.templates.bindings).Parse(string(tmpl))).Execute(buf, data); err != nil { panic(err) } return buf.String() }