prose/template.go
Naman Sood a1ad26124c server: add RSS feed support
Signed-off-by: Naman Sood <mail@nsood.in>
2022-06-22 23:25:25 -05:00

78 lines
2.1 KiB
Go

package main
import (
"fmt"
"log"
"strconv"
"time"
"github.com/aymerick/raymond"
)
func loadTemplate(file string) (*raymond.Template, error) {
tpl, err := raymond.ParseFile("templates/" + file)
if err != nil {
return nil, fmt.Errorf("could not parse %s template: %w", file, err)
}
tpl.RegisterHelper("datetime", func(timeStr string) string {
timestamp, err := strconv.ParseInt(timeStr, 10, 64)
if err != nil {
log.Printf("Could not parse timestamp '%v', falling back to current time", timeStr)
timestamp = time.Now().Unix()
}
return time.Unix(timestamp, 0).Format("Jan 2 2006, 3:04 PM")
})
tpl.RegisterHelper("rssDatetime", func(timeStr string) string {
timestamp, err := strconv.ParseInt(timeStr, 10, 64)
if err != nil {
log.Printf("Could not parse timestamp '%v', falling back to current time", timeStr)
timestamp = time.Now().Unix()
}
return rssDatetime(timestamp)
})
tpl.RegisterHelper("getFullUrl", func(slug string) string {
return blogURL + "/" + slug
})
log.Printf("Loaded template: %s", file)
return tpl, nil
}
// loadTemplates, for each f in files, loads `templates/$f`
// as a handlebars HTML/XML template. If any single template fails to
// load, only an error is returned. Conversely, if there is no error,
// every template name passed is guaranteed to have loaded successfully.
func loadTemplates(files []string) (map[string]*raymond.Template, error) {
templates := make(map[string]*raymond.Template)
for _, f := range files {
tpl, err := loadTemplate(f)
if err != nil {
return nil, err
}
templates[f] = tpl
}
log.Printf("Loaded templates: %s", files)
return templates, nil
}
func newTemplateListener(update func(func(map[string]*raymond.Template))) *listener {
return &listener{
folder: "templates/",
update: func(file string) error {
newTpl, err := loadTemplate(file)
if err != nil {
return err
}
update(func(oldMap map[string]*raymond.Template) {
oldMap[file] = newTpl
})
return nil
},
clean: func(file string) error {
update(func(oldMap map[string]*raymond.Template) {
delete(oldMap, file)
})
log.Printf("Unloaded template: %s", file)
return nil
},
}
}