home/internal/templateutil/templateutil.go

90 lines
2.4 KiB
Go

package templateutil
import (
"html/template"
"io/fs"
"source.toby3d.me/toby3d/home/internal/domain"
"source.toby3d.me/toby3d/home/internal/templateutil/collections"
"source.toby3d.me/toby3d/home/internal/templateutil/partials"
"source.toby3d.me/toby3d/home/internal/templateutil/safe"
"source.toby3d.me/toby3d/home/internal/templateutil/strings"
"source.toby3d.me/toby3d/home/internal/templateutil/transform"
"source.toby3d.me/toby3d/home/internal/templateutil/urls"
)
type Function struct {
Handler func(v ...any) any
Methods template.FuncMap
Name string
}
func New(partialsDir fs.FS, site *domain.Site) template.FuncMap {
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,
},
})
partialsNamespace := partials.New(partialsDir, funcMap)
funcs = append(funcs, Function{
Name: "partials",
Handler: func(v ...any) any { return partialsNamespace },
Methods: template.FuncMap{
"partial": partialsNamespace.Include,
},
})
urlsNamespace := urls.New(site)
funcs = append(funcs, Function{
Name: "urls",
Handler: func(v ...any) any { return urlsNamespace },
Methods: template.FuncMap{
"absLangURL": urlsNamespace.AbsLangURL,
"absURL": urlsNamespace.AbsURL,
"relLangURL": urlsNamespace.RelLangURL,
"relURL": urlsNamespace.RelURL,
},
})
transformNamespace := transform.New()
funcs = append(funcs, Function{
Name: "transform",
Handler: func(v ...any) any { return transformNamespace },
Methods: template.FuncMap{
"markdownify": transformNamespace.Markdownify,
},
})
collectionsNamespace := collections.New()
funcs = append(funcs, Function{
Name: "collections",
Handler: func(v ...any) any { return collectionsNamespace },
Methods: template.FuncMap{
"index": collectionsNamespace.Index,
"seq": collectionsNamespace.Seq,
"slice": collectionsNamespace.Slice,
},
})
for _, f := range funcs {
funcMap[f.Name] = f.Handler
for name, m := range f.Methods {
funcMap[name] = m
}
}
return funcMap
}