aboutsummaryrefslogtreecommitdiff
path: root/page
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 /page
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 'page')
-rw-r--r--page/http.go58
-rw-r--r--page/main.go10
-rw-r--r--page/page.go186
-rw-r--r--page/pagelist.go19
-rw-r--r--page/time.go21
5 files changed, 10 insertions, 284 deletions
diff --git a/page/http.go b/page/http.go
deleted file mode 100644
index b3622be..0000000
--- a/page/http.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package page
-
-import (
- "log"
- "net/http"
- "path/filepath"
- "strings"
-)
-
-func SetupHandlers() {
- http.HandleFunc("/rebuildIndex/", RebuildIndexHandler)
- http.Handle("/static/", StaticHandler())
- http.HandleFunc("/", PageHandler)
-}
-
-func PageHandler(w http.ResponseWriter, r *http.Request) {
- u := r.URL.Path
- if u == "/" {
- u = "/index"
- }
- u = filepath.Join(".", u)
- log.Println(u)
-
- p := &Page{Path: u}
- err := p.Render(w)
- if err != nil {
- if strings.HasSuffix(err.Error(), "no such file or directory") {
- log.Printf("Page '%s' not found, trying 404", p.Path)
- p.Path = "404"
- w.WriteHeader(404)
- err := p.Render(w)
- if err != nil {
- log.Println(err)
- http.Error(w, "Internal server error", 500)
- return
- }
- return
- } else {
- log.Println(err)
- http.Error(w, "Internal server error", 500)
- return
- }
- }
-
-}
-
-func RebuildIndexHandler(w http.ResponseWriter, r *http.Request) {
- if r.Method != "POST" {
- pageIndex = nil
- p := &Page{Path: "index"}
- _, _ = p.Index()
- }
- return
-}
-
-func StaticHandler() (h http.Handler) {
- return http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
-}
diff --git a/page/main.go b/page/main.go
new file mode 100644
index 0000000..18445d4
--- /dev/null
+++ b/page/main.go
@@ -0,0 +1,10 @@
+package page
+
+import (
+ "io"
+)
+
+type Page interface {
+ Render(io.Writer) error
+ RebuildIndex() error
+}
diff --git a/page/page.go b/page/page.go
deleted file mode 100644
index c5230c6..0000000
--- a/page/page.go
+++ /dev/null
@@ -1,186 +0,0 @@
-package page
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "io"
- "os"
- "path/filepath"
- "strings"
- "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"
-
-// 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)
-}
-
-var pageIndex map[string]PageList
-
-// Index returns a map of all pages below the current Page's Path seperated
-// into their respective tags If a Page has multiple tags it will be listed
-// under each
-func (p *Page) Index() (map[string]PageList, error) {
- if pageIndex != nil {
- return pageIndex, nil
- }
- fmt.Fprintln(os.Stderr, "Rebuilding index...")
-
- out := make(map[string]PageList)
-
- var pageErr error
-
- filepath.Walk(filepath.Dir(p.Path),
- func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
-
- if !info.IsDir() && strings.HasSuffix(info.Name(), ".md") {
-
- p2 := &Page{Path: strings.ReplaceAll(path, ".md", "")}
- err = p2.Read()
-
- if err != nil {
- pageErr = err
- fmt.Fprintln(os.Stderr, "Error encountered: ", err)
- return err
- }
-
- for tag, _ := range p2.Tags {
- if _, ok := out[tag]; !ok {
- out[tag] = []*Page{p2}
- } else {
- out[tag] = append(out[tag], p2)
- }
- }
-
- }
-
- return nil
- })
-
- pageIndex = out
-
- return out, nil
-}
diff --git a/page/pagelist.go b/page/pagelist.go
deleted file mode 100644
index e326ac9..0000000
--- a/page/pagelist.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package page
-
-import "sort"
-
-type PageList []*Page
-
-func (p PageList) SortDate() PageList {
- sort.Slice(p, func(i, j int) bool {
- return p[i].Date.Time.After(p[j].Date.Time)
- })
- return p
-}
-
-func (p PageList) SortDateReverse() PageList {
- sort.Slice(p, func(i, j int) bool {
- return p[i].Date.Time.Before(p[j].Date.Time)
- })
- return p
-}
diff --git a/page/time.go b/page/time.go
deleted file mode 100644
index 0ac29ab..0000000
--- a/page/time.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package page
-
-import (
- "gopkg.in/yaml.v3"
- "time"
-)
-
-type PageTime struct {
- time.Time
-}
-
-var TimeFormat = "01.02.2006 15:04:05 MST"
-
-func (pt *PageTime) UnmarshalYAML(n *yaml.Node) error {
- t, err := time.Parse(TimeFormat, n.Value)
- if err != nil {
- return err
- }
- pt.Time = t
- return nil
-}