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 }