162 lines
3.6 KiB
Go
162 lines
3.6 KiB
Go
package models
|
|
|
|
import (
|
|
"blog/config"
|
|
"fmt"
|
|
"html/template"
|
|
"io"
|
|
)
|
|
|
|
type TemplatePointer struct {
|
|
*template.Template
|
|
}
|
|
|
|
type HtmlTemplate struct {
|
|
Reader TemplatePointer
|
|
Talk TemplatePointer
|
|
Album TemplatePointer
|
|
Article TemplatePointer
|
|
Categories TemplatePointer
|
|
Dashboard TemplatePointer
|
|
ExtraNav TemplatePointer
|
|
Index TemplatePointer
|
|
}
|
|
|
|
type ApiTemplate struct {
|
|
Info TemplatePointer
|
|
Mindustry 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)
|
|
}
|
|
}
|
|
|
|
// BuildViewData 构建视图数据
|
|
//
|
|
// Parameters:
|
|
//
|
|
// title: 页面标题
|
|
// data: 页面数据
|
|
//
|
|
// Returns:
|
|
//
|
|
// map[string]interface{}: 包含标题、数据、网站配置和导航栏信息的映射
|
|
func BuildViewData(title string, data interface{}) map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"Title": title, // 页面标题
|
|
"Data": data, // 页面数据
|
|
"Config": config.Cfg, // 网站配置
|
|
"Navs": Navigation, // 导航栏数据
|
|
}
|
|
}
|
|
|
|
// initHtmlTemplate 初始化 HTML 模板
|
|
//
|
|
// Parameters:
|
|
//
|
|
// viewDir: 视图文件目录路径
|
|
//
|
|
// Returns:
|
|
//
|
|
// HtmlTemplate: HTML 模板对象
|
|
// error: 错误信息(如果有)
|
|
func initHtmlTemplate(viewDir string) (HtmlTemplate, error) {
|
|
tp, err := readHtmlTemplate(
|
|
[]string{"index", "extraNav", "dashboard", "categories", "article", "album", "talk", "reader"},
|
|
viewDir)
|
|
if err != nil {
|
|
return HtmlTemplate{}, err
|
|
}
|
|
|
|
return HtmlTemplate{
|
|
Index: tp[0],
|
|
ExtraNav: tp[1],
|
|
Dashboard: tp[2],
|
|
Categories: tp[3],
|
|
Article: tp[4],
|
|
Album: tp[5],
|
|
Talk: tp[6],
|
|
Reader: tp[7],
|
|
}, nil
|
|
}
|
|
func SpreadDigit(n int) []int {
|
|
var r []int
|
|
for i := 1; i <= n; i++ {
|
|
r = append(r, i)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// readHtmlTemplate 读取 HTML 模板文件
|
|
//
|
|
// Parameters:
|
|
//
|
|
// htmlFileName: HTML 文件名列表
|
|
// viewDir: 视图文件目录路径
|
|
//
|
|
// Returns:
|
|
//
|
|
// []TemplatePointer: HTML 模板指针列表
|
|
// error: 错误信息(如果有)
|
|
func readHtmlTemplate(htmlFileName []string, viewDir string) ([]TemplatePointer, error) {
|
|
var htmlTemplate []TemplatePointer
|
|
|
|
head := viewDir + "/layouts/head.gohtml"
|
|
nav := viewDir + "/layouts/nav.gohtml"
|
|
footer := viewDir + "/layouts/footer.gohtml"
|
|
reviews := viewDir + "/layouts/reviews.gohtml"
|
|
|
|
for _, name := range htmlFileName {
|
|
tp, err := template.New(name+".gohtml").
|
|
Funcs(template.FuncMap{"SpreadDigit": SpreadDigit}).
|
|
ParseFiles(viewDir+"/"+name+".gohtml", head, nav, footer, reviews)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
htmlTemplate = append(htmlTemplate, TemplatePointer{tp})
|
|
}
|
|
|
|
return htmlTemplate, nil
|
|
}
|
|
|
|
func initApiTemplate(viewDir string) (ApiTemplate, error) {
|
|
tp, err := readApiTemplate(
|
|
[]string{"info", "mdt"},
|
|
viewDir+"/api")
|
|
if err != nil {
|
|
return ApiTemplate{}, err
|
|
}
|
|
|
|
return ApiTemplate{
|
|
Info: tp[0],
|
|
Mindustry: tp[1],
|
|
}, nil
|
|
}
|
|
func readApiTemplate(htmlFileName []string, viewDir string) ([]TemplatePointer, error) {
|
|
var apiTemplate []TemplatePointer
|
|
head := viewDir + "/head.gohtml"
|
|
footer := viewDir + "/footer.gohtml"
|
|
for _, name := range htmlFileName {
|
|
tp, err := template.New(name+".gohtml").
|
|
Funcs(template.FuncMap{"SpreadDigit": SpreadDigit}).
|
|
ParseFiles(viewDir+"/"+name+".gohtml", head, footer)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
apiTemplate = append(apiTemplate, TemplatePointer{tp})
|
|
}
|
|
return apiTemplate, nil
|
|
}
|