Blog/models/html_template.go

126 lines
2.7 KiB
Go
Raw Normal View History

2024-03-21 07:25:12 +00:00
package models
import (
"blog/config"
"fmt"
"html/template"
"io"
)
type TemplatePointer struct {
*template.Template
}
type HtmlTemplate struct {
2024-05-03 10:34:32 +00:00
Talk TemplatePointer
Album TemplatePointer
2024-03-21 07:25:12 +00:00
Article TemplatePointer
Categories TemplatePointer
Dashboard TemplatePointer
ExtraNav TemplatePointer
Index TemplatePointer
}
func (t TemplatePointer) WriteData(w io.Writer, data interface{}) {
err := t.Execute(w, data)
if err != nil {
if _, e := w.Write([]byte(err.Error())); e != nil {
fmt.Println(e)
}
}
}
func (t TemplatePointer) WriteError(w io.Writer, err error) {
if _, e := w.Write([]byte(err.Error())); e != nil {
fmt.Println(e)
}
}
2024-05-03 14:14:21 +00:00
// BuildViewData 构建视图数据
//
// Parameters:
//
// title: 页面标题
// data: 页面数据
//
// Returns:
//
// map[string]interface{}: 包含标题、数据、网站配置和导航栏信息的映射
2024-03-21 07:25:12 +00:00
func BuildViewData(title string, data interface{}) map[string]interface{} {
return map[string]interface{}{
2024-05-03 14:14:21 +00:00
"Title": title, // 页面标题
"Data": data, // 页面数据
"Config": config.Cfg, // 网站配置
"Navs": Navigation, // 导航栏数据
2024-03-21 07:25:12 +00:00
}
}
2024-05-03 14:14:21 +00:00
// initHtmlTemplate 初始化 HTML 模板
//
// Parameters:
//
// viewDir: 视图文件目录路径
//
// Returns:
//
// HtmlTemplate: HTML 模板对象
// error: 错误信息(如果有)
2024-03-21 07:25:12 +00:00
func initHtmlTemplate(viewDir string) (HtmlTemplate, error) {
tp, err := readHtmlTemplate(
2024-05-03 10:34:32 +00:00
[]string{"index", "extraNav", "dashboard", "categories", "article", "album", "talk"},
2024-03-21 07:25:12 +00:00
viewDir)
if err != nil {
2024-05-03 14:14:21 +00:00
return HtmlTemplate{}, err
2024-03-21 07:25:12 +00:00
}
2024-05-03 14:14:21 +00:00
return HtmlTemplate{
Index: tp[0],
ExtraNav: tp[1],
Dashboard: tp[2],
Categories: tp[3],
Article: tp[4],
Album: tp[5],
Talk: tp[6],
}, nil
2024-03-21 07:25:12 +00:00
}
func SpreadDigit(n int) []int {
var r []int
for i := 1; i <= n; i++ {
r = append(r, i)
}
return r
}
2024-05-03 14:14:21 +00:00
// readHtmlTemplate 读取 HTML 模板文件
//
// Parameters:
//
// htmlFileName: HTML 文件名列表
// viewDir: 视图文件目录路径
//
// Returns:
//
// []TemplatePointer: HTML 模板指针列表
// error: 错误信息(如果有)
2024-03-21 07:25:12 +00:00
func readHtmlTemplate(htmlFileName []string, viewDir string) ([]TemplatePointer, error) {
var htmlTemplate []TemplatePointer
2024-05-22 08:30:01 +00:00
head := viewDir + "/layouts/head.gohtml"
nav := viewDir + "/layouts/nav.gohtml"
footer := viewDir + "/layouts/footer.gohtml"
reviews := viewDir + "/layouts/reviews.gohtml"
2024-03-21 07:25:12 +00:00
2024-05-03 14:14:21 +00:00
for _, name := range htmlFileName {
2024-05-22 08:30:01 +00:00
tp, err := template.New(name+".gohtml").
2024-03-21 07:25:12 +00:00
Funcs(template.FuncMap{"SpreadDigit": SpreadDigit}).
2024-05-22 08:30:01 +00:00
ParseFiles(viewDir+"/"+name+".gohtml", head, nav, footer, reviews)
2024-03-21 07:25:12 +00:00
if err != nil {
2024-05-03 14:14:21 +00:00
return nil, err
2024-03-21 07:25:12 +00:00
}
htmlTemplate = append(htmlTemplate, TemplatePointer{tp})
}
2024-05-03 14:14:21 +00:00
2024-03-21 07:25:12 +00:00
return htmlTemplate, nil
}