Files
MollyBlog/internal/mApp/mMarkdown.go

128 lines
2.5 KiB
Go

package mApp
import (
"fmt"
"io"
"os"
"path/filepath"
"MollyBlog/internal/model"
"MollyBlog/utils"
"gopkg.in/yaml.v3"
)
// loadMarkdownFiles load markdown source files
func (ma *MApp) loadMarkdownFiles() error {
var markdownList []model.MFileInfo
markdownPath := SRC
err := filepath.Walk(markdownPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
// filter markdown files
if filepath.Ext(path) == ".md" {
markdownList = append(markdownList, model.MFileInfo{
Name: info.Name(),
Path: path,
})
}
return nil
})
if err != nil {
return err
}
ma.SrcFiles = markdownList
return nil
}
// parseMarkdowns parse markdown files to html
func (ma *MApp) parseMarkdowns() error {
htmlPath := DST
for _, file := range ma.SrcFiles {
// read markdown file
_mdFile, err := os.Open(file.Path)
if err != nil {
return err
}
defer _mdFile.Close()
_mdByte, err := io.ReadAll(_mdFile)
if err != nil {
return err
}
// extract FrontMatter and clean markdown bytes
_frontMatter, _cleanBytes := utils.ExtractFrontMatter(_mdByte)
// parse frontmatter to post metadata
var post model.MPost
err = yaml.Unmarshal(_frontMatter, &post)
if err != nil {
return err
}
// convert into html format and save to html file
_htmlPath := fmt.Sprintf("%s/%s.html", htmlPath, file.Name)
_htmlFile, err := os.Create(_htmlPath)
if err != nil {
return err
}
defer _htmlFile.Close()
// set options to lute
ma.lute.SetToC(true)
_htmlByte := ma.lute.Markdown(file.Name, _cleanBytes)
_, err = _htmlFile.Write(_htmlByte)
if err != nil {
return err
}
// save html path to post's metadata
post.HtmlHash = utils.Sha256Hash(_htmlByte)
post.HtmlPath = _htmlPath
// save tags and categories to map
for _, tag := range post.Tags {
tagHash := utils.Sha256Hash([]byte(tag))
post.TagHashes = append(post.TagHashes, model.MTag{
Name: tag,
Hash: tagHash,
})
ma.TaggedPosts = append(ma.TaggedPosts, &post)
}
for _, category := range post.Categories {
categoryHash := utils.Sha256Hash([]byte(category))
post.CategoryHashes = append(post.CategoryHashes, model.MCategory{
Name: category,
Hash: categoryHash,
})
ma.CategorizedPosts = append(ma.CategorizedPosts, &post)
}
// free the raw tag and category slice
post.Tags = nil
post.Categories = nil
ma.Posts = append(ma.Posts, &post)
}
// sort Posts by date
model.SortPostsByDate(ma.Posts)
return nil
}