81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package filehandling
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/KristianJBorgwarth/dendrite.daemon/persistence/store"
|
|
)
|
|
|
|
type Template struct {
|
|
Content []byte
|
|
Title string
|
|
Slug string
|
|
Filename string
|
|
FrontMatter *FrontMatter
|
|
}
|
|
|
|
func NewTemplate(templateName, title, directory string) (*Template, error) {
|
|
var templatePath string
|
|
if templateName != "" {
|
|
templatePath = store.GetVaultStore().GetTemplatePath(templateName)
|
|
}
|
|
|
|
fileNameSlug := Slugify(title)
|
|
|
|
pathSlug := filepath.ToSlash(filepath.Join(directory, fileNameSlug))
|
|
filename := fileNameSlug + ".md"
|
|
|
|
content, err := renderTemplate(templatePath, title, pathSlug, filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
fm, err := ParseFrontMatter(content)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Template{
|
|
Content: content,
|
|
Title: title,
|
|
Slug: pathSlug,
|
|
Filename: filename,
|
|
FrontMatter: fm,
|
|
}, nil
|
|
}
|
|
|
|
func renderTemplate(templatePath, title, slug, filename string) ([]byte, error) {
|
|
template, err := readTemplate(templatePath, title)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
r := strings.NewReplacer(
|
|
"{{title}}", title,
|
|
"{{date}}", time.Now().Format("2006-01-02"),
|
|
"{{slug}}", slug,
|
|
"{{file}}", filename,
|
|
)
|
|
|
|
return []byte(r.Replace(string(template))), nil
|
|
}
|
|
|
|
func readTemplate(templatePath string, title string) ([]byte, error) {
|
|
if templatePath == "" {
|
|
return createDefaultTemplate(title), nil
|
|
}
|
|
|
|
template, err := os.ReadFile(templatePath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return template, nil
|
|
}
|
|
|
|
func createDefaultTemplate(title string) []byte {
|
|
return []byte("---\ntitle: " + title + "\ndate: " + time.Now().Format("2006-01-02") + "\n---\n")
|
|
}
|