summaryrefslogtreecommitdiffci
path: root/internal/templatemanager/templatemanager.go
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'internal/templatemanager/templatemanager.go')
-rw-r--r--internal/templatemanager/templatemanager.go90
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
+}