aboutsummaryrefslogtreecommitdiff
path: root/local/page.go
diff options
context:
space:
mode:
authorMitch Riedstra <mitch@riedstra.us>2020-09-26 20:59:34 -0400
committerMitch Riedstra <mitch@riedstra.us>2020-09-26 21:01:33 -0400
commitcddf7ed45147869a9d2eee2e40f59a97c472ea72 (patch)
tree551e04c6018a46b4288d9ea2e7ee3ffb666c271b /local/page.go
parent09979dcab01643349cee425b71fa3b4db24f8d60 (diff)
downloadgo-website-cddf7ed45147869a9d2eee2e40f59a97c472ea72.tar.gz
go-website-cddf7ed45147869a9d2eee2e40f59a97c472ea72.tar.xz
Split up http related stuff out of the page library.
Make it an interface. Rename page to be 'local' reflecting that it reads the website off the local disk. Update the build script to include the go version. Switch to gorilla/mux Remove the convert command, since we're no longer utilizing that old layout or have any need to convert from it.
Diffstat (limited to 'local/page.go')
-rw-r--r--local/page.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/local/page.go b/local/page.go
new file mode 100644
index 0000000..f514b4a
--- /dev/null
+++ b/local/page.go
@@ -0,0 +1,139 @@
+package local
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "text/template"
+
+ "github.com/russross/blackfriday"
+ "gopkg.in/yaml.v3"
+)
+
+type Page struct {
+ Path string
+ Title string
+ Head string
+ Description string
+ Tags map[string]interface{}
+ Date *PageTime
+ Published bool
+ Vars map[string]interface{}
+ Markdown []byte
+}
+
+// Can be adjusted to change the base template used in rendering
+var BaseTemplate = "inc/base.html"
+
+// Used to split the .md files into yaml and markdown
+var DocumentSplit = "|---\n"
+
+// Allow for the creation of a new page from the page
+func (p Page) NewPage(pth string) *Page {
+ return &Page{Path: pth}
+}
+
+// Renders a page
+func (p *Page) Render(wr io.Writer) error {
+ if err := p.Read(); 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"}}
+ {{.RenderHead}}
+ {{end}}
+ `)
+ if err != nil {
+ return err
+ }
+ }
+
+ return t.Execute(wr, p)
+}
+
+func (p *Page) RenderHead() (string, error) {
+ buf := &bytes.Buffer{}
+ t, err := template.New("Head").Parse(p.Head)
+ if err != nil {
+ return "", err
+ }
+ err = t.Execute(buf, p)
+ if err != nil {
+ return "", err
+ }
+ return string(buf.Bytes()), nil
+}
+
+// Reads in the special markdown file format for the website off of the disk
+func (p *Page) Read() error {
+ yamlBuf := bytes.NewBuffer(nil)
+ markdownBuf := bytes.NewBuffer(nil)
+
+ fh, err := os.Open(p.Path + ".md")
+ if err != nil {
+ return err
+ }
+ defer fh.Close()
+ rdr := bufio.NewReader(fh)
+
+ // Read in the file and split between markdown and yaml buffers
+ yamlDone := false
+ for {
+
+ bytes, err := rdr.ReadBytes('\n')
+ if err == io.EOF {
+ break
+ } else if err != nil {
+ return err
+ }
+
+ // Is this the line where we stop reading the yaml and start reading markdown?
+ if DocumentSplit == string(bytes) && !yamlDone {
+ yamlDone = true
+ continue
+ }
+
+ if !yamlDone {
+ yamlBuf.Write(bytes)
+ } else {
+ markdownBuf.Write(bytes)
+ }
+ }
+
+ err = yaml.Unmarshal(yamlBuf.Bytes(), p)
+ if err != nil {
+ return err
+ }
+
+ p.Markdown = markdownBuf.Bytes()
+ return nil
+}
+
+func (p *Page) RenderBody() (string, error) {
+ buf := &bytes.Buffer{}
+ t, err := template.New("Body").Parse(string(p.Markdown))
+ if err != nil {
+ return "", err
+ }
+
+ err = t.Execute(buf, p)
+ if err != nil {
+ return "", err
+ }
+
+ return string(blackfriday.Run(buf.Bytes())), nil
+}
+
+func (p Page) String() string {
+ return fmt.Sprintf("Page: %s", p.Path)
+}