diff options
Diffstat (limited to 'src/build.go')
-rw-r--r-- | src/build.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/build.go b/src/build.go new file mode 100644 index 0000000..b2847c3 --- /dev/null +++ b/src/build.go @@ -0,0 +1,102 @@ +package main + +import ( + "fmt" + "log" + "os" + "path" + "path/filepath" + "slices" + "strings" + "time" + + "github.com/adrg/frontmatter" + mapset "github.com/deckarep/golang-set/v2" +) + +type PostMatter struct { + Date time.Time `toml:"date"` + Description string `toml:"description"` + Title string `toml:"title"` + Taxonomies struct { + Tags []string `toml:"tags"` + } `toml:"taxonomies"` +} + +type Post struct { + Input string + Output string + Basename string + URL string + Content string + PostMatter +} + +type Tags mapset.Set[string] + +func check(err error) { + if err != nil { + log.Panic(err) + } +} + +func getPost(filename string) (PostMatter, string) { + matter := PostMatter{} + content, err := os.Open(filename) + check(err) + rest, err := frontmatter.Parse(content, &matter) + check(err) + + return matter, string(rest) +} + +func readPosts(root string, inputDir string, outputDir string) ([]Post, Tags) { + tags := mapset.NewSet[string]() + posts := []Post{} + subdir := filepath.Join(root, inputDir) + files, err := os.ReadDir(subdir) + outputReplacer := strings.NewReplacer(root, outputDir, ".md", "/index.html") + urlReplacer := strings.NewReplacer(root, "", ".md", "/") + check(err) + for _, f := range files { + pathFromRoot := filepath.Join(subdir, f.Name()) + check(err) + if !f.IsDir() && path.Ext(pathFromRoot) == ".md" { + output := outputReplacer.Replace(pathFromRoot) + url := urlReplacer.Replace(pathFromRoot) + matter, content := getPost(pathFromRoot) + + for _, tag := range matter.Taxonomies.Tags { + tags.Add(strings.ToLower(tag)) + } + + post := Post{ + Input: pathFromRoot, + Output: output, + Basename: filepath.Base(url), + URL: url, + PostMatter: matter, + Content: content, + } + + posts = append(posts, post) + } + } + slices.SortFunc(posts, func(a, b Post) int { + return b.Date.Compare(a.Date) + }) + return posts, tags +} + +func main() { + err := os.MkdirAll("public/post", 755) + check(err) + log.Print("Generating site...") + posts, tags := readPosts("content", "post", "public") + for _, post := range posts { + err := os.MkdirAll(path.Join("public", "post", post.Basename), 755) + check(err) + fmt.Printf("%+v\n", post.Date) + } + fmt.Printf("%+v\n", tags) +} |