package utils import ( "html/template" "net/http" "github.com/gin-gonic/gin/render" ) // 模板函数 func templateFuncs() template.FuncMap { return template.FuncMap{ "add": func(a, b int) int { return a + b }, "sub": func(a, b int) int { return a - b }, "html": func(s string) template.HTML { return template.HTML(s) }, } } // 自定义 HTMLRender,存储一个 map:页面名 -> *template.Template type TemplateRenderer struct { templates map[string]*template.Template } func (r *TemplateRenderer) Lookup(name string) *template.Template { return r.templates[name] } func (r *TemplateRenderer) Instance(name string, data any) render.Render { return &htmlRender{ tmpl: r.Lookup(name), data: data, name: name, } } type htmlRender struct { tmpl *template.Template data any name string } func (r *htmlRender) Render(w http.ResponseWriter) error { r.WriteContentType(w) return r.tmpl.ExecuteTemplate(w, "base.html", r.data) } func (r *htmlRender) WriteContentType(w http.ResponseWriter) { w.Header().Set("Content-Type", "text/html; charset=utf-8") } // 初始化多模板 func LoadTemplates(theme string) *TemplateRenderer { r := &TemplateRenderer{ templates: make(map[string]*template.Template), } templateDir := "templates/" + theme // 为每个页面创建独立的模板组合 pages := []string{"index", "post", "page"} for _, pageName := range pages { // 组合 base.html 和具体页面模板 allFiles := []string{ templateDir + "/base.html", templateDir + "/" + pageName + ".html", } tmpl := template.Must(template.New("").Funcs(templateFuncs()).ParseFiles(allFiles...)) r.templates[pageName] = tmpl } return r }