63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
package custom
|
|
|
|
import (
|
|
_ "embed"
|
|
"html/template"
|
|
"text/template/parse"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/pkg/environment"
|
|
)
|
|
|
|
const (
|
|
footerName = "@custom/footer"
|
|
aboutName = "@custom/about"
|
|
)
|
|
|
|
//go:embed "footer.html"
|
|
var footerTemplateStr string
|
|
var defaultFooterTemplate = template.Must(template.New("footer.html").Parse(footerTemplateStr))
|
|
|
|
// Template creates a copy of template with shared template parts updated accordingly.
|
|
// Any template using this should use one of the template contexts in this package.
|
|
func (custom *Custom) Template(tpl *template.Template) *template.Template {
|
|
// create a clone of the template
|
|
clone := template.Must(tpl.Clone())
|
|
|
|
// add all the fixed parse trees
|
|
footerTree := custom.getTemplateAsset(defaultFooterTemplate)
|
|
template.Must(clone.AddParseTree(footerName, footerTree))
|
|
|
|
// optionally add the about asset
|
|
if aboutTree := custom.readTemplateAsset("about.html"); clone.Lookup(aboutName) != nil && aboutTree != nil {
|
|
template.Must(clone.AddParseTree(aboutName, aboutTree))
|
|
}
|
|
return clone // and return the tree
|
|
}
|
|
|
|
// getTemplateAsset returns an overridable template asset.
|
|
//
|
|
// If the asset named can successfully be parsed, it is returned.
|
|
// If it can not be parsed, the default template is returned.
|
|
func (custom *Custom) getTemplateAsset(dflt *template.Template) *parse.Tree {
|
|
tree := custom.readTemplateAsset(dflt.Name())
|
|
if tree == nil {
|
|
return dflt.Tree.Copy()
|
|
}
|
|
return tree
|
|
}
|
|
|
|
// readTemplateAsset is like getTemplateAssets, but takes an explicit name to read.
|
|
// when the asset does not exist, or cannot be opened, returns nil.
|
|
func (custom *Custom) readTemplateAsset(name string) *parse.Tree {
|
|
template, err := (func() (*template.Template, error) {
|
|
data, err := environment.ReadFile(custom.Environment, custom.CustomAssetPath(name))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return template.New(name).Parse(string(data))
|
|
})()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return template.Tree
|
|
}
|