package page import ( "fmt" "io" "io/ioutil" "text/template" "time" "gopkg.in/russross/blackfriday.v2" "gopkg.in/yaml.v2" ) type Page struct { Name string Head string Body string Date *time.Time Published bool } // Can be adjusted to change the base template used in rendering var BaseTemplate = "inc/base.html" func (p *Page) Render(wr io.Writer) error { if err := p.readYaml(); err != nil { return err } if err := p.readMarkdown(); err != nil { return err } t, err := template.ParseFiles(BaseTemplate) if err != nil { return err } // Automatically pull from the yml file if applicable if p.Head != "" { t, err = t.Parse(` {{define "head"}} {{.Head}} {{end}} `) if err != nil { return err } } return t.Execute(wr, p) } func (p *Page) readYaml() error { fname := p.Name + ".yml" b, err := ioutil.ReadFile(fname) if err != nil { return fmt.Errorf("While unmarshaling file '%s': %v", fname, err) } return yaml.Unmarshal(b, p) } func (p *Page) readMarkdown() error { pth := p.Name + ".md" b, err := ioutil.ReadFile(pth) if err != nil { return fmt.Errorf("Error while reading markdown for path %s: %v", pth, err) } p.Body = string(blackfriday.Run(b)) return nil }