home/internal/templateutil/templateutil.go

63 lines
1.5 KiB
Go

package templateutil
import (
"fmt"
"html/template"
"io/fs"
"source.toby3d.me/toby3d/home/internal/templateutil/partial"
"source.toby3d.me/toby3d/home/internal/templateutil/safe"
strings "source.toby3d.me/toby3d/home/internal/templateutil/string"
)
type Function struct {
Handler func(v ...any) any
Methods template.FuncMap
Name string
}
func New(dir fs.FS) (template.FuncMap, error) {
partials, err := fs.Sub(dir, "partials")
if err != nil {
return nil, fmt.Errorf("cannot substitute into partials subdirectory: %w", err)
}
funcMap := make(template.FuncMap)
funcs := make([]Function, 0)
stringsNamespace := strings.New()
funcs = append(funcs, Function{
Name: "strings",
Handler: func(v ...any) any { return stringsNamespace },
Methods: template.FuncMap{
"hasPrefix": stringsNamespace.HasPrefix,
"hasSuffix": stringsNamespace.HasSuffix,
},
})
safeNamespace := safe.New()
funcs = append(funcs, Function{
Name: "safe",
Handler: func(v ...any) any { return safeNamespace },
Methods: template.FuncMap{
"safeHTML": safeNamespace.HTML,
},
})
partialNamespace := partial.New(partials, funcMap)
funcs = append(funcs, Function{
Name: "partials",
Handler: func(v ...any) any { return partialNamespace },
Methods: template.FuncMap{
"partial": partialNamespace.Include,
},
})
for _, f := range funcs {
funcMap[f.Name] = f.Handler
for name, m := range f.Methods {
funcMap[name] = m
}
}
return funcMap, nil
}