Diffstat (limited to 'internal/templatemanager/templatemanager.go')
| -rw-r--r-- | internal/templatemanager/templatemanager.go | 90 |
1 files changed, 79 insertions, 11 deletions
diff --git a/internal/templatemanager/templatemanager.go b/internal/templatemanager/templatemanager.go index eebc297..ff1214a 100644 --- a/internal/templatemanager/templatemanager.go +++ b/internal/templatemanager/templatemanager.go @@ -4,8 +4,12 @@ import ( "bytes" "fmt" "html/template" + "os" "path/filepath" "strings" + "time" + + "github.com/SayaAndy/saya-today-web/l10n" ) type TemplateManager struct { @@ -13,8 +17,9 @@ type TemplateManager struct { } type templateManagerRender struct { - Main string - Tmpl *template.Template + Main string + Tmpl *template.Template + LastModified time.Time } type TemplateManagerTemplates struct { @@ -31,6 +36,14 @@ var templateFuncMap = template.FuncMap{ } return items }, + "replace": strings.ReplaceAll, + "fdiv": func(a, b int) float64 { + return float64(a) / float64(b) + }, + "l": func(path ...any) any { + return l10n.T.GetPath(path...) + }, + "join": strings.Join, } func NewTemplateManager(templates ...TemplateManagerTemplates) (*TemplateManager, error) { @@ -38,13 +51,26 @@ func NewTemplateManager(templates ...TemplateManagerTemplates) (*TemplateManager for _, tmplStruct := range templates { tmpl := template.New(tmplStruct.Name).Funcs(templateFuncMap) + if len(tmplStruct.Files) == 0 { + templateMap[tmplStruct.Name] = templateManagerRender{ + Main: "", + Tmpl: tmpl, + } + continue + } tmpl, err := tmpl.ParseFiles(tmplStruct.Files...) if err != nil { return nil, err } + modTime, err := setLastModified(tmplStruct.Files...) + if err != nil { + return nil, err + } + templateMap[tmplStruct.Name] = templateManagerRender{ - Main: filepath.Base(tmplStruct.Files[0]), - Tmpl: tmpl, + Main: filepath.Base(tmplStruct.Files[0]), + Tmpl: tmpl, + LastModified: modTime, } } @@ -56,12 +82,16 @@ func NewTemplateManager(templates ...TemplateManagerTemplates) (*TemplateManager func (tm *TemplateManager) Render(name string, data any, files ...string) ([]byte, error) { tmpl, exists := tm.templates[name] if !exists { - return nil, fmt.Errorf("template %s is not found", name) + return nil, fmt.Errorf("template %s not found", name) } var err error var tempTmpl *template.Template + var mainTmpl string = tmpl.Main if len(files) == 0 { + if mainTmpl == "" { + return []byte{}, nil + } tempTmpl = tmpl.Tmpl } else { tempTmpl, err = tmpl.Tmpl.Clone() @@ -72,28 +102,66 @@ func (tm *TemplateManager) Render(name string, data any, files ...string) ([]byt if err != nil { return nil, fmt.Errorf("couldn't include additional files in template rendering: %w", err) } + if mainTmpl == "" { + mainTmpl = filepath.Base(files[0]) + } } var buf bytes.Buffer - err = tempTmpl.ExecuteTemplate(&buf, tmpl.Main, data) + err = tempTmpl.ExecuteTemplate(&buf, mainTmpl, data) return buf.Bytes(), err } func (tm *TemplateManager) Add(name string, files ...string) error { + tmpl := template.New(name).Funcs(templateFuncMap) + if len(files) == 0 { - return fmt.Errorf("you can't add template without any files") + tm.templates[name] = templateManagerRender{ + Main: "", + Tmpl: tmpl, + } + return nil } - tmpl := template.New(name).Funcs(templateFuncMap) - tmpl, err := tmpl.ParseFiles(files...) if err != nil { return fmt.Errorf("failed to add template into manager: %w", err) } + modTime, err := setLastModified(files...) + if err != nil { + return fmt.Errorf("failed to add template into manager: %w", err) + } + tm.templates[name] = templateManagerRender{ - Main: filepath.Base(files[0]), - Tmpl: tmpl, + Main: filepath.Base(files[0]), + Tmpl: tmpl, + LastModified: modTime, } + return nil } + +func (tm *TemplateManager) GetLastModified(name string) (time.Time, error) { + tmpl, exists := tm.templates[name] + if !exists { + return time.Time{}, fmt.Errorf("template %s not found", name) + } + + return tmpl.LastModified, nil +} + +func setLastModified(filenames ...string) (time.Time, error) { + lastModified := time.Time{} + for _, filename := range filenames { + stat, err := os.Stat(filename) + if err != nil { + return lastModified, fmt.Errorf("failed to stat file: path '%s': %w", filename, err) + } + modTime := stat.ModTime() + if lastModified.Before(modTime) { + lastModified = modTime + } + } + return lastModified, nil +} |