初始化项目:基础设施 + 用户认证 + 后台管理系统 + AGPL 3.0 许可
This commit is contained in:
53
internal/theme/loader.go
Normal file
53
internal/theme/loader.go
Normal file
@ -0,0 +1,53 @@
|
||||
package theme
|
||||
|
||||
import (
|
||||
"html/template"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// TemplateRoot 模板根目录配置
|
||||
type TemplateRoot struct {
|
||||
Dir string // 目录路径
|
||||
Prefix string // 模板名前缀(如 "admin/" 表示管理后台)
|
||||
}
|
||||
|
||||
// LoadTemplates 加载多个根目录的 .html 模板到同一模板集
|
||||
// 模板名 = prefix + 相对于 root.Dir 的相对路径
|
||||
func LoadTemplates(roots ...TemplateRoot) (*template.Template, error) {
|
||||
t := template.New("")
|
||||
for _, root := range roots {
|
||||
dir := filepath.Clean(root.Dir) + string(os.PathSeparator)
|
||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.IsDir() || filepath.Ext(path) != ".html" {
|
||||
return nil
|
||||
}
|
||||
content, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 模板名:prefix + 相对路径
|
||||
name := root.Prefix + strings.TrimPrefix(path, dir)
|
||||
_, err = t.New(name).Parse(string(content))
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// LoadContent 读取主题内容文件(准则等),返回不转义的 template.HTML。
|
||||
// 后期改为查数据库时,只需修改此函数实现,调用方不变。
|
||||
func LoadContent(path string) (template.HTML, error) {
|
||||
content, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return template.HTML(content), nil
|
||||
}
|
||||
Reference in New Issue
Block a user