diff --git a/html/html.go b/html/html.go index f16312d8..c3b99fa6 100644 --- a/html/html.go +++ b/html/html.go @@ -26,6 +26,7 @@ var TemplatesByFilename = make(map[string]BuiltTemplate, 0) type BuiltTemplate struct { files []string subdir string + svgs []string // Nil if we are going to read templates off disk every time we render // because we are in development mode. template *template.Template @@ -34,7 +35,7 @@ type BuiltTemplate struct { func (bt *BuiltTemplate) executeTemplate(w io.Writer, data any) error { if bt.template == nil { name := path.Base(bt.files[0]) - templ, err := parseFromDisk(bt.files) + templ, err := parseFromDisk(bt.svgs, bt.files) if err != nil { return fmt.Errorf("Failed to parse template file: %w", err) } @@ -50,7 +51,7 @@ func (bt *BuiltTemplate) executeTemplate(w io.Writer, data any) error { } } -func NewBuiltTemplate(embeddedFiles embed.FS, subdir string, files ...string) *BuiltTemplate { +func NewBuiltTemplate(embeddedFiles embed.FS, subdir string, svgs []string, files ...string) *BuiltTemplate { files_on_disk := true for _, f := range files { _, err := os.Stat(f) @@ -67,13 +68,15 @@ func NewBuiltTemplate(embeddedFiles embed.FS, subdir string, files ...string) *B result = BuiltTemplate{ files: files, subdir: subdir, + svgs: svgs, template: nil, } } else { result = BuiltTemplate{ files: files, subdir: subdir, - template: parseEmbedded(embeddedFiles, subdir, files), + svgs: svgs, + template: parseEmbedded(embeddedFiles, subdir, svgs, files), } } TemplatesByFilename[path.Base(files[0])] = result @@ -125,7 +128,7 @@ func makeFuncMap() template.FuncMap { } return funcMap } -func parseEmbedded(embeddedFiles embed.FS, subdir string, files []string) *template.Template { +func parseEmbedded(embeddedFiles embed.FS, subdir string, svgs []string, files []string) *template.Template { funcMap := makeFuncMap() // Remap the file names to embedded paths embeddedFilePaths := make([]string, 0) @@ -134,11 +137,31 @@ func parseEmbedded(embeddedFiles embed.FS, subdir string, files []string) *templ } name := path.Base(embeddedFilePaths[0]) log.Debug().Str("name", name).Strs("paths", embeddedFilePaths).Msg("Parsing embedded template") - return template.Must( - template.New(name).Funcs(funcMap).ParseFS(embeddedFiles, embeddedFilePaths...)) + t, err := template.New(name).Funcs(funcMap).ParseFS(embeddedFiles, embeddedFilePaths...) + if err != nil { + panic(fmt.Sprintf("Failed to parse embedded template %s: %v", name, err)) + } + for _, svg := range svgs { + svg_path := strings.TrimPrefix(svg, subdir) + content, err := embeddedFiles.ReadFile(svg_path) + if err != nil { + panic(fmt.Sprintf("Failed to read svg '%s' from embedded filesystem: %v", svg, err)) + } + svg_name := path.Base(svg) + 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 { + panic(fmt.Sprintf("Failed to parse svg '%s' from embedded filesystem: %v", svg, err)) + } + _, err = t.AddParseTree(svg_t.Name(), svg_t.Tree) + if err != nil { + panic(fmt.Sprintf("Failed to add svg '%s' to embedded template: %v", svg, err)) + } + } + return t } -func parseFromDisk(files []string) (*template.Template, error) { +func parseFromDisk(svgs []string, files []string) (*template.Template, error) { funcMap := makeFuncMap() name := path.Base(files[0]) //log.Debug().Str("name", name).Strs("files", files).Msg("parsing from disk") @@ -146,6 +169,24 @@ func parseFromDisk(files []string) (*template.Template, error) { if err != nil { return nil, fmt.Errorf("Failed to parse %s: %w", files, err) } + for _, svg := range svgs { + content, err := os.ReadFile(svg) + if err != nil { + return nil, fmt.Errorf("Failed to read svg '%s' from filesystem: %w", svg, err) + } + svg_name := path.Base(svg) + 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 { + log.Debug().Str("svg", svg).Str("svg_name", svg_name).Str("template", svg_template).Msg("failed to parse") + return nil, fmt.Errorf("Failed to parse svg '%s' from filesystem: %w", svg, err) + } + _, err = templ.AddParseTree(svg_t.Name(), svg_t.Tree) + if err != nil { + return nil, fmt.Errorf("Failed to add svg '%s' to template: %w", svg, err) + } + log.Debug().Str("name", svg_t.Name()).Str("svg_name", svg_name).Msg("Added svg template") + } return templ, nil } diff --git a/rmo/template.go b/rmo/template.go index f7db337d..d86ecd1d 100644 --- a/rmo/template.go +++ b/rmo/template.go @@ -22,8 +22,9 @@ func buildTemplate(files ...string) *html.BuiltTemplate { for _, c := range components { full_files = append(full_files, fmt.Sprintf("%s/template/component/%s.html", subdir, c)) } + full_svgs := make([]string, 0) for _, c := range svgs { - full_files = append(full_files, fmt.Sprintf("%s/template/svg/%s.svg", subdir, c)) + full_svgs = append(full_svgs, fmt.Sprintf("%s/template/svg/%s.svg", subdir, c)) } - return html.NewBuiltTemplate(embeddedFiles, "rmo/", full_files...) + return html.NewBuiltTemplate(embeddedFiles, "rmo/", full_svgs, full_files...) } diff --git a/rmo/template/root.html b/rmo/template/root.html index d55a39bb..43d1da62 100644 --- a/rmo/template/root.html +++ b/rmo/template/root.html @@ -66,9 +66,7 @@
- - - + {{ template "mosquito.svg" }}

Follow-up or Check Status

Check on a previous request or view current mosquito activity in your area.

@@ -82,9 +80,7 @@
- - - + {{ template "pond.svg" }}

Report a Green Pool

Report stagnant water sources like abandoned pools that may breed mosquitoes.

@@ -98,9 +94,7 @@
- - - + {{ template "check-report.svg" }}

Report Mosquito Nuisance

Report areas with high adult mosquito activity causing discomfort or concern.

diff --git a/rmo/template/svg/check-report.svg b/rmo/template/svg/check-report.svg index 15b82fd6..bc645483 100644 --- a/rmo/template/svg/check-report.svg +++ b/rmo/template/svg/check-report.svg @@ -1,3 +1 @@ -{{define "svg/check-report"}} -{{end}} diff --git a/rmo/template/svg/mosquito.svg b/rmo/template/svg/mosquito.svg index ccbcec39..a19b8b23 100644 --- a/rmo/template/svg/mosquito.svg +++ b/rmo/template/svg/mosquito.svg @@ -1,3 +1 @@ -{{define "svg/mosquito"}} -{{end}} diff --git a/rmo/template/svg/pond.svg b/rmo/template/svg/pond.svg index bffa55de..d44728ee 100644 --- a/rmo/template/svg/pond.svg +++ b/rmo/template/svg/pond.svg @@ -1,3 +1 @@ -{{define "svg/pond"}} -{{end}} diff --git a/sync/page.go b/sync/page.go index 50d812ee..8cd7b1c0 100644 --- a/sync/page.go +++ b/sync/page.go @@ -23,7 +23,7 @@ func buildTemplate(files ...string) *html.BuiltTemplate { for _, c := range components { full_files = append(full_files, fmt.Sprintf("%s/template/components/%s.html", subdir, c)) } - return html.NewBuiltTemplate(embeddedFiles, "sync/", full_files...) + return html.NewBuiltTemplate(embeddedFiles, "sync/", []string{}, full_files...) } // Respond with an error that is visible to the user