79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
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
|
|
}
|