Auto transform SVGs into template portions

This means I don't have to modify the files correctly by hand
This commit is contained in:
Eli Ribble 2026-01-30 18:58:50 +00:00
parent bb9dd1754f
commit 38b1cdbbad
No known key found for this signature in database
7 changed files with 55 additions and 25 deletions

View file

@ -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
}