rewrite code a bit
All checks were successful
/ Deploy blog to deuterium (push) Successful in 1m9s

Signed-off-by: Naman Sood <mail@nsood.in>
This commit is contained in:
Naman Sood 2024-11-23 02:53:25 -05:00
parent 18455362d3
commit 1981a291aa
17 changed files with 916 additions and 849 deletions

90
tplmap/tplmap.go Normal file
View file

@ -0,0 +1,90 @@
package tplmap
import (
"fmt"
"log"
"os"
"prose/common"
"prose/watcher"
"strconv"
"sync"
"time"
"github.com/aymerick/raymond"
)
type tplMap struct {
mu sync.RWMutex
templates map[string]*raymond.Template
}
func New() (watcher.AutoMap[string, *raymond.Template], error) {
folder, err := os.ReadDir("templates/")
if err != nil {
return nil, fmt.Errorf("could not load templates directory: %w", err)
}
tm := &tplMap{
templates: make(map[string]*raymond.Template),
}
for _, s := range folder {
err := tm.fetchLocked(s.Name())
if err != nil {
return nil, fmt.Errorf("could not load template %q: %w", s.Name(), err)
}
log.Printf("loaded template %q", s.Name())
}
go watcher.Watch("templates/", tm)
return tm, nil
}
func (tm *tplMap) Get(filename string) (*raymond.Template, bool) {
tm.mu.RLock()
defer tm.mu.RUnlock()
got, ok := tm.templates[filename]
return got, ok
}
func (tm *tplMap) Delete(filename string) error {
tm.mu.Lock()
defer tm.mu.Unlock()
delete(tm.templates, filename)
return nil
}
func (tm *tplMap) Fetch(filename string) error {
tm.mu.Lock()
defer tm.mu.Unlock()
return tm.fetchLocked(filename)
}
func (tm *tplMap) fetchLocked(filename string) error {
tpl, err := raymond.ParseFile("templates/" + filename)
if err != nil {
return fmt.Errorf("could not parse template %q: %w", filename, 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 common.RSSDatetime(timestamp)
})
tpl.RegisterHelper("getFullUrl", func(slug string) string {
return common.BlogURL + "/" + slug
})
tm.templates[filename] = tpl
return nil
}