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 } 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 }