2024-04-21 16:12:13 +00:00
|
|
|
package files
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"git.hq.ggpsv.com/gabriel/mastodon-pesos/client"
|
2024-04-21 16:43:55 +00:00
|
|
|
md "github.com/JohannesKaufmann/html-to-markdown"
|
2024-04-21 16:12:13 +00:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"text/template"
|
|
|
|
)
|
|
|
|
|
|
|
|
type FileWriter struct {
|
|
|
|
dir string
|
|
|
|
repies map[string]client.Post
|
|
|
|
}
|
|
|
|
|
|
|
|
type TemplateContext struct {
|
2024-04-21 16:43:55 +00:00
|
|
|
Post client.Post
|
|
|
|
Descendants []client.Post
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2024-04-21 16:43:55 +00:00
|
|
|
func (f FileWriter) Write(post client.Post) error {
|
2024-04-21 16:12:13 +00:00
|
|
|
tpmlFilename := "templates/post.tmpl"
|
|
|
|
tmplFile, err := filepath.Abs(tpmlFilename)
|
|
|
|
|
|
|
|
if err != nil {
|
2024-04-21 16:43:55 +00:00
|
|
|
return fmt.Errorf("error resolving template absolute path: %w", err)
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if post.InReplyToId != "" {
|
|
|
|
f.repies[post.InReplyToId] = post
|
2024-04-21 16:43:55 +00:00
|
|
|
return nil
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2024-04-21 16:43:55 +00:00
|
|
|
return fmt.Errorf("error creating file: %w", err)
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
defer file.Close()
|
|
|
|
|
2024-04-21 16:43:55 +00:00
|
|
|
converter := md.NewConverter("", true, nil)
|
|
|
|
|
|
|
|
funcs := template.FuncMap{
|
|
|
|
"tomd": converter.ConvertString,
|
|
|
|
}
|
|
|
|
|
|
|
|
tmpl, err := template.New(filepath.Base(tpmlFilename)).Funcs(funcs).ParseFiles(tmplFile)
|
|
|
|
|
2024-04-21 16:12:13 +00:00
|
|
|
context := TemplateContext{
|
2024-04-21 16:43:55 +00:00
|
|
|
Post: post,
|
|
|
|
Descendants: descendants,
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
err = tmpl.Execute(file, context)
|
|
|
|
|
|
|
|
if err != nil {
|
2024-04-21 16:43:55 +00:00
|
|
|
return fmt.Errorf("error executing template: %w", err)
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
2024-04-21 16:43:55 +00:00
|
|
|
|
|
|
|
return nil
|
2024-04-21 16:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|