2023-11-08 23:04:18 +00:00
|
|
|
package templateutil
|
|
|
|
|
|
|
|
import (
|
|
|
|
"html/template"
|
|
|
|
"io/fs"
|
|
|
|
|
2023-11-19 12:39:54 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/domain"
|
2023-11-10 03:11:12 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/collections"
|
2023-11-09 01:07:25 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/partials"
|
2023-11-08 23:04:18 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/safe"
|
2023-11-09 01:07:25 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/strings"
|
2023-11-09 20:14:53 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/transform"
|
2023-11-09 01:50:45 +00:00
|
|
|
"source.toby3d.me/toby3d/home/internal/templateutil/urls"
|
2023-11-08 23:04:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type Function struct {
|
|
|
|
Handler func(v ...any) any
|
|
|
|
Methods template.FuncMap
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
2023-11-19 12:39:54 +00:00
|
|
|
func New(partialsDir fs.FS, site *domain.Site) template.FuncMap {
|
2023-11-08 23:04:18 +00:00
|
|
|
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,
|
|
|
|
},
|
|
|
|
})
|
2023-11-19 12:39:54 +00:00
|
|
|
partialsNamespace := partials.New(partialsDir, funcMap)
|
2023-11-08 23:04:18 +00:00
|
|
|
funcs = append(funcs, Function{
|
|
|
|
Name: "partials",
|
2023-11-09 01:50:45 +00:00
|
|
|
Handler: func(v ...any) any { return partialsNamespace },
|
2023-11-08 23:04:18 +00:00
|
|
|
Methods: template.FuncMap{
|
2023-11-09 01:50:45 +00:00
|
|
|
"partial": partialsNamespace.Include,
|
|
|
|
},
|
|
|
|
})
|
2023-11-19 12:39:54 +00:00
|
|
|
urlsNamespace := urls.New(site)
|
2023-11-09 01:50:45 +00:00
|
|
|
funcs = append(funcs, Function{
|
|
|
|
Name: "urls",
|
|
|
|
Handler: func(v ...any) any { return urlsNamespace },
|
|
|
|
Methods: template.FuncMap{
|
2023-11-19 13:02:13 +00:00
|
|
|
"absLangURL": urlsNamespace.AbsLangURL,
|
|
|
|
"absURL": urlsNamespace.AbsURL,
|
|
|
|
"relLangURL": urlsNamespace.RelLangURL,
|
|
|
|
"relURL": urlsNamespace.RelURL,
|
2023-11-08 23:04:18 +00:00
|
|
|
},
|
|
|
|
})
|
2023-11-09 20:14:53 +00:00
|
|
|
transformNamespace := transform.New()
|
|
|
|
funcs = append(funcs, Function{
|
|
|
|
Name: "transform",
|
|
|
|
Handler: func(v ...any) any { return transformNamespace },
|
|
|
|
Methods: template.FuncMap{
|
|
|
|
"markdownify": transformNamespace.Markdownify,
|
|
|
|
},
|
|
|
|
})
|
2023-11-10 03:11:12 +00:00
|
|
|
collectionsNamespace := collections.New()
|
|
|
|
funcs = append(funcs, Function{
|
|
|
|
Name: "collections",
|
|
|
|
Handler: func(v ...any) any { return collectionsNamespace },
|
|
|
|
Methods: template.FuncMap{
|
|
|
|
"index": collectionsNamespace.Index,
|
2023-11-19 13:02:25 +00:00
|
|
|
"seq": collectionsNamespace.Seq,
|
|
|
|
"slice": collectionsNamespace.Slice,
|
2023-11-10 03:11:12 +00:00
|
|
|
},
|
|
|
|
})
|
2023-11-08 23:04:18 +00:00
|
|
|
|
|
|
|
for _, f := range funcs {
|
|
|
|
funcMap[f.Name] = f.Handler
|
|
|
|
|
|
|
|
for name, m := range f.Methods {
|
|
|
|
funcMap[name] = m
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-19 12:39:54 +00:00
|
|
|
return funcMap
|
2023-11-08 23:04:18 +00:00
|
|
|
}
|