63 lines
1.5 KiB
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
|
|
}
|