Auto transform SVGs into template portions
This means I don't have to modify the files correctly by hand
This commit is contained in:
parent
bb9dd1754f
commit
38b1cdbbad
7 changed files with 55 additions and 25 deletions
55
html/html.go
55
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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue