98 lines
2.8 KiB
Go
98 lines
2.8 KiB
Go
|
|
package html
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"html/template"
|
||
|
|
"io/fs"
|
||
|
|
//"github.com/rs/zerolog/log"
|
||
|
|
)
|
||
|
|
|
||
|
|
func addSupportingTemplates(sourceFS fs.FS, t *template.Template) error {
|
||
|
|
err := fs.WalkDir(sourceFS, ".", func(path string, d fs.DirEntry, err error) error {
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
if d.IsDir() {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
content, err := fs.ReadFile(sourceFS, path)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("error reading template %s: %w", path, err)
|
||
|
|
}
|
||
|
|
|
||
|
|
new_t := template.New(path)
|
||
|
|
addFuncMap(new_t)
|
||
|
|
_, err = new_t.Parse(string(content))
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("error parsing '%s': %w", path, err)
|
||
|
|
}
|
||
|
|
_, err = t.AddParseTree(new_t.Name(), new_t.Tree)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("error adding parse tree '%s': %w", path, err)
|
||
|
|
}
|
||
|
|
//log.Debug().Str("path", path).Msg("Read template")
|
||
|
|
return nil
|
||
|
|
})
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("error walking template directory: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
func addSVGTemplates(filesystem fs.FS, t *template.Template) error {
|
||
|
|
err := fs.WalkDir(filesystem, "svg", func(path string, d fs.DirEntry, err error) error {
|
||
|
|
if err != nil || d.IsDir() {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
content, err := fs.ReadFile(filesystem, path)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("Failed to read svg '%s' from filesystem: %w", path, err)
|
||
|
|
}
|
||
|
|
svg_name := removeLeadingDir(path)
|
||
|
|
svg_template := fmt.Sprintf("{{define \"%s\"}}%s{{end}}", svg_name, string(content))
|
||
|
|
svg_t, err := template.New(svg_name).Parse(svg_template)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("Failed to parse svg '%s' from embedded filesystem: %v", path, err)
|
||
|
|
}
|
||
|
|
_, err = t.AddParseTree(svg_t.Name(), svg_t.Tree)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("Failed to add svg '%s' to embedded template: %v", path, err)
|
||
|
|
}
|
||
|
|
//log.Debug().Str("name", svg_name).Msg("add svg template")
|
||
|
|
return nil
|
||
|
|
})
|
||
|
|
//log.Debug().Msg("Done adding SVG templates")
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
func parseTemplate(sourceFS fs.FS, template_name string) (*template.Template, error) {
|
||
|
|
t, err := parseTemplateFile(sourceFS, template_name)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("Failed to parse template: %w", err)
|
||
|
|
}
|
||
|
|
err = addSupportingTemplates(sourceFS, t)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("Failed to add supporting templates: %w", err)
|
||
|
|
}
|
||
|
|
err = addSVGTemplates(sourceFS, t)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("Failed to add supporting svg templates: %w", err)
|
||
|
|
}
|
||
|
|
return t, nil
|
||
|
|
}
|
||
|
|
func parseTemplateFile(sourceFS fs.FS, filename string) (*template.Template, error) {
|
||
|
|
t := template.New(filename)
|
||
|
|
//log.Debug().Str("filename", filename).Msg("parsing template")
|
||
|
|
addFuncMap(t)
|
||
|
|
content, err := fs.ReadFile(sourceFS, filename)
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("error reading template %s: %w", filename, err)
|
||
|
|
}
|
||
|
|
_, err = t.Parse(string(content))
|
||
|
|
if err != nil {
|
||
|
|
return nil, fmt.Errorf("error parsing '%s': %w", filename, err)
|
||
|
|
}
|
||
|
|
return t, nil
|
||
|
|
}
|