46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package corelib
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
)
|
|
|
|
// noRender 是一个自定义模板函数,忽略不渲染传入的内容
|
|
func noRender(s string) template.HTML {
|
|
return template.HTML(s)
|
|
}
|
|
|
|
func TemplateHandler(w http.ResponseWriter, data any, name string, filenames ...string) {
|
|
// 创建一个新的基础模板,并将自定义函数注册到模板中
|
|
baseTmpl := template.New("base").Funcs(template.FuncMap{
|
|
"noRender": noRender,
|
|
})
|
|
|
|
// 添加一个简单的内容以确保基础模板不是空的
|
|
_, err := baseTmpl.Parse(`{{define "base"}}{{end}}`)
|
|
if err != nil {
|
|
Logger.Errorf("Error creating base template: %v", err)
|
|
http.Error(w, "Error executing template", http.StatusInternalServerError)
|
|
}
|
|
|
|
// 解析布局模板及其子模板
|
|
_, err = baseTmpl.ParseFiles(filenames...)
|
|
if err != nil {
|
|
Logger.Errorf("Error parsing templates: %v", err)
|
|
http.Error(w, "Error executing template", http.StatusInternalServerError)
|
|
}
|
|
|
|
// 加载所有模板文件
|
|
tmpl, err := baseTmpl.Clone()
|
|
if err != nil {
|
|
Logger.Errorf("error cloning base template: %v", err)
|
|
http.Error(w, "Error executing template", http.StatusInternalServerError)
|
|
}
|
|
err = tmpl.ExecuteTemplate(w, name, data)
|
|
if err != nil {
|
|
Logger.Errorf("Error executing template: %v", err)
|
|
http.Error(w, "Error executing template", http.StatusInternalServerError)
|
|
}
|
|
|
|
}
|