kiln/page.go
2021-05-01 14:34:25 -04:00

72 lines
1.5 KiB
Go

package main
import (
"bytes"
"log"
pathpkg "path"
"strings"
"time"
"gopkg.in/yaml.v3"
)
// Page represents a page.
type Page struct {
Title string
Date time.Time
Name string `yaml:"-"`
Path string `yaml:"-"`
Content string `yaml:"-"`
Params map[string]string
}
// NewPage returns a new Page with the given path and content.
func NewPage(path string, content []byte) *Page {
var page Page
// Try to parse the date from the page filename
const layout = "2006-01-02"
base := pathpkg.Base(path)
if len(base) >= len(layout) {
dateStr := base[:len(layout)]
if time, err := time.Parse(layout, dateStr); err == nil {
page.Date = time
// Remove the date from the path
base = base[len(layout):]
if len(base) > 0 {
// Remove a leading dash
if base[0] == '-' {
base = base[1:]
}
if len(base) > 0 {
dir := pathpkg.Dir(path)
if dir == "." {
dir = ""
}
path = pathpkg.Join(dir, base)
}
}
}
}
// Extract frontmatter from content
var frontmatter []byte
frontmatter, content = extractFrontmatter(content)
if len(frontmatter) != 0 {
if err := yaml.Unmarshal(frontmatter, &page); err != nil {
log.Printf("failed to parse frontmatter for %q: %v", path, err)
}
// Trim leading newlines from content
content = bytes.TrimLeft(content, "\r\n")
}
// Remove extension from path
// TODO: Allow using ugly URLs
path = strings.TrimSuffix(path, pathpkg.Ext(path))
page.Name = pathpkg.Base(path)
page.Path = "/" + path + "/"
page.Content = string(content)
return &page
}