diff options
Diffstat (limited to 'page')
| -rw-r--r-- | page/http.go | 58 | ||||
| -rw-r--r-- | page/main.go | 10 | ||||
| -rw-r--r-- | page/page.go | 186 | ||||
| -rw-r--r-- | page/pagelist.go | 19 | ||||
| -rw-r--r-- | page/time.go | 21 |
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 -} |
