mastodon-markdown-archive/files/files.go
Gabriel Garrido 1075339551 Fix paths
2024-04-23 10:31:17 +02:00

94 lines
1.9 KiB
Go

package files
import (
"fmt"
"git.garrido.io/gabriel/mastodon-pesos/client"
md "github.com/JohannesKaufmann/html-to-markdown"
"os"
"path/filepath"
"text/template"
)
type FileWriter struct {
dir string
repies map[string]client.Post
}
type TemplateContext struct {
Post client.Post
Descendants []client.Post
}
func New(dir string) (FileWriter, error) {
var fileWriter FileWriter
_, err := os.Stat(dir)
if os.IsNotExist(err) {
os.Mkdir(dir, os.ModePerm)
}
absDir, err := filepath.Abs(dir)
if err != nil {
return fileWriter, err
}
return FileWriter{
dir: absDir,
repies: make(map[string]client.Post),
}, nil
}
func (f FileWriter) Write(post client.Post) error {
tpmlFilename := "templates/post.tmpl"
tmplFile, err := filepath.Abs(tpmlFilename)
if err != nil {
return fmt.Errorf("error resolving template absolute path: %w", err)
}
if post.InReplyToId != "" {
f.repies[post.InReplyToId] = post
return nil
}
var descendants []client.Post
f.getReplies(post.Id, &descendants)
name := fmt.Sprintf("%s.md", post.Id)
filename := filepath.Join(f.dir, name)
file, err := os.Create(filename)
if err != nil {
return fmt.Errorf("error creating file: %w", err)
}
defer file.Close()
converter := md.NewConverter("", true, nil)
funcs := template.FuncMap{
"tomd": converter.ConvertString,
}
tmpl, err := template.New(filepath.Base(tpmlFilename)).Funcs(funcs).ParseFiles(tmplFile)
context := TemplateContext{
Post: post,
Descendants: descendants,
}
err = tmpl.Execute(file, context)
if err != nil {
return fmt.Errorf("error executing template: %w", err)
}
return nil
}
func (f FileWriter) getReplies(postId string, replies *[]client.Post) {
if reply, ok := f.repies[postId]; ok {
*replies = append(*replies, reply)
f.getReplies(reply.Id, replies)
}
}