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