Embed default template file

The default template file needs to be embedded in the binary.
This commit is contained in:
Gabriel Garrido 2024-05-11 19:29:48 +02:00
parent a24fd48d1e
commit f35420c1e4
3 changed files with 35 additions and 26 deletions

View file

@ -79,7 +79,7 @@ mastodon-markdown-archive \
## Template ## Template
By default, this tool uses the [post.tmp](./templates/post.tmpl) template to create the markdown file. A different template can be used by passing its path to `--template`. By default, this tool uses the [post.tmp](./files/templates/post.tmpl) template to create the markdown file. A different template can be used by passing its path to `--template`.
For information about variables and functions available in the template context, refer to the `Write` method in [files.go](files/files.go#L108-L117). For information about variables and functions available in the template context, refer to the `Write` method in [files.go](files/files.go#L104-L110).

View file

@ -1,6 +1,7 @@
package files package files
import ( import (
"embed"
"fmt" "fmt"
"io" "io"
"mime" "mime"
@ -13,6 +14,9 @@ import (
md "github.com/JohannesKaufmann/html-to-markdown" md "github.com/JohannesKaufmann/html-to-markdown"
) )
//go:embed templates/post.tmpl
var templates embed.FS
type FileWriter struct { type FileWriter struct {
dir string dir string
repies map[string]client.Post repies map[string]client.Post
@ -44,18 +48,6 @@ func New(dir string) (FileWriter, error) {
} }
func (f FileWriter) Write(post client.Post, templateFile string) error { func (f FileWriter) Write(post client.Post, templateFile string) error {
tmplFilename := "templates/post.tmpl"
if templateFile != "" {
tmplFilename = templateFile
}
tmplFile, err := filepath.Abs(tmplFilename)
if err != nil {
return fmt.Errorf("error resolving template absolute path: %w", err)
}
if post.InReplyToId != "" { if post.InReplyToId != "" {
f.repies[post.InReplyToId] = post f.repies[post.InReplyToId] = post
return nil return nil
@ -65,6 +57,7 @@ func (f FileWriter) Write(post client.Post, templateFile string) error {
f.getReplies(post.Id, &descendants) f.getReplies(post.Id, &descendants)
var file *os.File var file *os.File
var err error
if len(post.MediaAttachments) == 0 { if len(post.MediaAttachments) == 0 {
name := fmt.Sprintf("%s.md", post.Id) name := fmt.Sprintf("%s.md", post.Id)
@ -89,10 +82,6 @@ func (f FileWriter) Write(post client.Post, templateFile string) error {
media.Path = imageFilename media.Path = imageFilename
} }
if err != nil {
return fmt.Errorf("error downloading media attachments: %w", err)
}
filename := filepath.Join(dir, "index.md") filename := filepath.Join(dir, "index.md")
file, err = os.Create(filename) file, err = os.Create(filename)
} }
@ -103,18 +92,12 @@ func (f FileWriter) Write(post client.Post, templateFile string) error {
defer file.Close() defer file.Close()
converter := md.NewConverter("", true, nil) tmpl, err := resolveTemplate(templateFile)
funcs := template.FuncMap{
"tomd": converter.ConvertString,
}
tmpl, err := template.New(filepath.Base(tmplFilename)).Funcs(funcs).ParseFiles(tmplFile)
context := TemplateContext{ context := TemplateContext{
Post: post, Post: post,
Descendants: descendants, Descendants: descendants,
} }
err = tmpl.Execute(file, context) err = tmpl.Execute(file, context)
if err != nil { if err != nil {
@ -182,3 +165,29 @@ func downloadAttachment(dir string, id string, url string) (string, error) {
return filename, nil return filename, nil
} }
func resolveTemplate(templateFile string) (*template.Template, error) {
converter := md.NewConverter("", true, nil)
funcs := template.FuncMap{
"tomd": converter.ConvertString,
}
if templateFile == "" {
tmpl, err := template.New("post.tmpl").Funcs(funcs).ParseFS(templates, "templates/*.tmpl")
if err != nil {
return tmpl, err
}
return tmpl, nil
}
tmpl, err := template.New(filepath.Base(templateFile)).Funcs(funcs).ParseGlob(templateFile)
if err != nil {
return tmpl, err
}
return tmpl, nil
}