weiro/providers/siteexporter/exporter.go

81 lines
1.5 KiB
Go
Raw Normal View History

package siteexporter
import (
"fmt"
"os"
"path/filepath"
"gopkg.in/yaml.v3"
"lmika.dev/lmika/weiro/handlers/importexport"
"lmika.dev/lmika/weiro/models"
)
type SiteExporter struct {
site models.Site
baseURL string
baseDir string
}
func New(site models.Site, baseURL, baseDir string) *SiteExporter {
return &SiteExporter{
site: site,
baseDir: baseDir,
baseURL: baseURL,
}
}
func (s *SiteExporter) WriteSiteYAML() error {
siteYAML := importexport.Site{
Title: s.site.Title,
Tagline: s.site.Tagline,
BaseURL: s.baseURL,
}
bytes, err := yaml.Marshal(siteYAML)
if err != nil {
return err
}
return os.WriteFile(filepath.Join(s.baseDir, "site.yaml"), bytes, 0644)
}
func (s *SiteExporter) WritePost(post *models.Post) error {
postMeta := importexport.Post{
ID: post.GUID,
Title: post.Title,
Date: post.PublishedAt,
Slug: post.Slug,
}
frontMatter, err := yaml.Marshal(postMeta)
slugBasePath := filepath.Base(post.Slug)
postFilename := filepath.Join(s.baseDir, fmt.Sprintf("posts/%04d/%02d/%02d-%s.md",
post.PublishedAt.Year(), post.PublishedAt.Month(), post.PublishedAt.Day(), slugBasePath))
if err := os.MkdirAll(filepath.Dir(postFilename), 0755); err != nil {
return err
}
f, err := os.Create(postFilename)
if err != nil {
return err
}
defer f.Close()
if _, err := f.WriteString("---\n"); err != nil {
return err
}
if _, err = f.Write(frontMatter); err != nil {
return err
}
_, err = f.WriteString("---\n")
if err != nil {
return err
}
_, err = f.WriteString(post.Body)
return err
}