From 28ade30d2b11ed8ccb9c46d7931ad1ad7af671c1 Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Tue, 10 Feb 2026 14:40:50 +0000 Subject: [PATCH] Consolidate template loading logic between embedded and host FS This solves a really annoying bug around my sidebar not loading correctly in prod. --- html/embed.go | 40 +++++------------ html/filesystem.go | 105 +-------------------------------------------- html/parse.go | 97 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 134 deletions(-) create mode 100644 html/parse.go diff --git a/html/embed.go b/html/embed.go index d95ca8c3..c207deb5 100644 --- a/html/embed.go +++ b/html/embed.go @@ -44,7 +44,7 @@ func newTemplateSystemEmbed() (templateSystemEmbed, error) { } func (ts templateSystemEmbed) loadAll() error { // Then, parse all remaining templates into their named slots, adding the shared stuff - page_subdirs := []string{"template/rmo", "template/sync"} + page_subdirs := []string{"rmo", "sync"} for _, subdir := range page_subdirs { err := ts.loadTemplateSubdir(subdir) if err != nil { @@ -55,40 +55,21 @@ func (ts templateSystemEmbed) loadAll() error { } func (ts templateSystemEmbed) loadTemplateSubdir(subdir string) error { - err := fs.WalkDir(ts.sourceFS, subdir, func(path string, d fs.DirEntry, err error) error { + template_fs, err := fs.Sub(ts.sourceFS, "template") + if err != nil { + return fmt.Errorf("Failed to create template sub-fs: %w", err) + } + err = fs.WalkDir(template_fs, subdir, func(path string, d fs.DirEntry, err error) error { if err != nil || d.IsDir() { return err } - content, err := fs.ReadFile(ts.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)) + new_t, err := parseTemplate(template_fs, path) if err != nil { return fmt.Errorf("error parsing '%s': %w", path, err) } - short_path := removeLeadingDir(path) - shared_subdirs := []string{"template/rmo/component", "template/rmo/layout", "template/sync/component", "template/sync/layout"} - for _, shared_subdir := range shared_subdirs { - err := ts.addSubdirTemplates(new_t, shared_subdir) - if err != nil { - return fmt.Errorf("Failed to add subdir '%s' templates: %w", shared_subdir, err) - } - } - svg_fs, err := fs.Sub(ts.sourceFS, "template/svg") - if err != nil { - return fmt.Errorf("failed to get template/svg sub") - } - err = addSVGTemplates(svg_fs, new_t) - if err != nil { - return fmt.Errorf("error adding SVG templates: %w", err) - } - ts.nameToTemplate[short_path] = new_t - //log.Debug().Str("path", short_path).Msg("Loaded page template") + ts.nameToTemplate[path] = new_t + log.Debug().Str("path", path).Msg("Loaded page template") return nil }) return err @@ -118,8 +99,7 @@ func (ts templateSystemEmbed) addSubdirTemplates(t *template.Template, subdir st if err != nil { return fmt.Errorf("error adding parse tree '%s': %w", path, err) } - //ts.nameToTemplate[short_path] = new_t - //log.Debug().Str("path", short_path).Msg("Loaded shared component template") + log.Debug().Str("path", short_path).Msg("Loaded shared component template") return nil }) return err diff --git a/html/filesystem.go b/html/filesystem.go index d7361867..12fc9263 100644 --- a/html/filesystem.go +++ b/html/filesystem.go @@ -2,23 +2,12 @@ package html import ( "bytes" - //"embed" - //"errors" "fmt" - "html/template" - //"io" "io/fs" - //"math" "net/http" "os" - //"path" - //"strconv" - //"strings" - //"time" "github.com/Gleipnir-Technology/nidus-sync/config" - //"github.com/aarondl/opt/null" - //"github.com/google/uuid" "github.com/rs/zerolog/log" ) @@ -53,31 +42,12 @@ func (ts templateSystemDisk) loadAll() error { return nil } func (ts templateSystemDisk) renderOrError(w http.ResponseWriter, template_name string, context interface{}) { - t, err := ts.parseTemplate(template_name) + t, err := parseTemplate(ts.sourceFS, template_name) if err != nil { log.Error().Err(err).Str("template_name", template_name).Msg("Failed to parse template") RespondError(w, "Failed to parse template", err, http.StatusInternalServerError) return } - err = ts.addSupportingTemplates(t) - if err != nil { - log.Error().Err(err).Str("template_name", template_name).Msg("Failed to add supporting templates") - RespondError(w, "Failed to add supporting templates", err, http.StatusInternalServerError) - return - } - svg_fs, err := fs.Sub(ts.sourceFS, "svg") - if err != nil { - log.Error().Err(err).Str("template_name", template_name).Msg("Failed to add get svg subdir") - RespondError(w, "Failed to add supporting svg templates", err, http.StatusInternalServerError) - return - } - err = addSVGTemplates(svg_fs, t) - if err != nil { - log.Error().Err(err).Str("template_name", template_name).Msg("Failed to add supporting templates") - RespondError(w, "Failed to add supporting templates", err, http.StatusInternalServerError) - return - } - buf := &bytes.Buffer{} err = t.Execute(buf, context) if err != nil { @@ -87,53 +57,6 @@ func (ts templateSystemDisk) renderOrError(w http.ResponseWriter, template_name } buf.WriteTo(w) } -func (ts templateSystemDisk) addSupportingTemplates(t *template.Template) error { - err := fs.WalkDir(ts.sourceFS, ".", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - - if d.IsDir() { - return nil - } - - content, err := fs.ReadFile(ts.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 (ts templateSystemDisk) parseTemplate(filename string) (*template.Template, error) { - t := template.New(filename) - log.Debug().Str("filename", filename).Msg("parsing template") - addFuncMap(t) - content, err := fs.ReadFile(ts.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 -} /* func addSVGTemplates(fsys fs.FS, templ *template.Template) error { @@ -221,29 +144,3 @@ func (ts templateSystemDisk) parseTemplate(filename string) (*template.Template, return templ, nil } */ -func addSVGTemplates(filesystem fs.FS, t *template.Template) error { - svgs, err := fs.ReadDir(filesystem, ".") - if err != nil { - log.Warn().Msg("Failed to read svg directory") - return nil - } - for _, svg := range svgs { - content, err := fs.ReadFile(filesystem, svg.Name()) - if err != nil { - return fmt.Errorf("Failed to read svg '%s' from embedded filesystem: %w", svg, err) - } - svg_name := svg.Name() - 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", svg, 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", svg, err) - } - //log.Debug().Str("name", svg_name).Msg("add svg template") - } - //log.Debug().Msg("Done adding SVG templates") - return nil -} diff --git a/html/parse.go b/html/parse.go new file mode 100644 index 00000000..84a6c804 --- /dev/null +++ b/html/parse.go @@ -0,0 +1,97 @@ +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 +}