mastodon-markdown-archive/files/files.go
2024-04-21 18:12:13 +02:00

91 lines
1.6 KiB
Go

package files
import (
"fmt"
"git.hq.ggpsv.com/gabriel/mastodon-pesos/client"
"os"
"path/filepath"
"text/template"
)
type FileWriter struct {
dir string
repies map[string]client.Post
}
type TemplateContext struct {
Post client.Post
Content string
Replies []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) {
tpmlFilename := "templates/post.tmpl"
tmplFile, err := filepath.Abs(tpmlFilename)
if err != nil {
panic(err)
}
if post.InReplyToId != "" {
f.repies[post.InReplyToId] = post
return
}
var descendants []client.Post
f.getReplies(post.Id, &descendants)
tmpl, err := template.New(filepath.Base(tpmlFilename)).ParseFiles(tmplFile)
if err != nil {
panic(err)
}
name := fmt.Sprintf("%s.md", post.Id)
filename := filepath.Join(f.dir, name)
file, err := os.Create(filename)
if err != nil {
panic(err)
}
defer file.Close()
context := TemplateContext{
Post: post,
Content: post.Content,
Replies: descendants,
}
err = tmpl.Execute(file, context)
if err != nil {
panic(err)
}
}
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)
}
}