- Added the new post frontend - Hooked up publishing of posts to the site publisher - Added an site exporter as a publishing target
81 lines
1.5 KiB
Go
81 lines
1.5 KiB
Go
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
|
|
}
|