aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild.sh2
-rw-r--r--cmd/convert/main.go94
-rw-r--r--cmd/server/main.go19
-rw-r--r--go.mod4
-rw-r--r--go.sum4
-rw-r--r--http/main.go78
-rw-r--r--local/index.go69
-rw-r--r--local/page.go (renamed from page/page.go)59
-rw-r--r--local/pagelist.go (renamed from page/pagelist.go)11
-rw-r--r--local/time.go (renamed from page/time.go)2
-rw-r--r--page/http.go58
-rw-r--r--page/main.go10
12 files changed, 193 insertions, 217 deletions
diff --git a/build.sh b/build.sh
index 21f46a5..de1ac51 100755
--- a/build.sh
+++ b/build.sh
@@ -4,6 +4,8 @@ set -e
LICENSE="$(cat LICENSE)"
version="$(git log --format="%h %d" -1)
+$(go version)
+
Source code can be found here:
https://git.riedstra.dev/mitch/go-website
diff --git a/cmd/convert/main.go b/cmd/convert/main.go
deleted file mode 100644
index 3cc4135..0000000
--- a/cmd/convert/main.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package main
-
-import (
- "flag"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "regexp"
-
- "gopkg.in/yaml.v2"
-)
-
-// Assumes we're getting a pageName ending in .page
-func convertPage(newDir, pageName string) error {
- yamlName := pageName[:len(pageName)-5] + ".yml"
- headName := pageName[:len(pageName)-5] + ".head"
- newPageName := pageName[:len(pageName)-5] + ".md"
- hasHead := false
- headBytes := []byte{}
- if _, err := os.Stat(headName); err == nil {
- hasHead = true
- }
-
- if hasHead {
- var err error
- headBytes, err = ioutil.ReadFile(headName)
- if err != nil {
- return err
- }
- }
-
- y, err := yaml.Marshal(map[string]string{
- "head": string(headBytes),
- })
- if err != nil {
- return err
- }
-
- cmd := exec.Command("mkdir", "-p", filepath.Join(newDir, filepath.Dir(pageName)))
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- err = cmd.Run()
- if err != nil {
- return err
- }
- cmd = exec.Command("cp", "-v", pageName, filepath.Join(newDir, newPageName))
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- err = cmd.Run()
- if err != nil {
- return err
- }
-
- if len(headBytes) == 0 {
- return nil
- } else {
- return ioutil.WriteFile(newDir+"/"+yamlName, y, 0644)
- }
-}
-
-func main() {
- fl := flag.NewFlagSet("Website converter", flag.ExitOnError)
- origDirectory := fl.String("d", ".", "Directory to read from")
- newDirectory := fl.String("D", ".", "Directory to write to")
- _ = fl.Parse(os.Args[1:])
-
- newDir, _ := filepath.Abs(*newDirectory)
- origDir, _ := filepath.Abs(*origDirectory)
-
- if err := os.Chdir(origDir); err != nil {
- log.Fatal(err)
- }
-
- pageRe := regexp.MustCompile(`\.page$`)
- _ = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
- if err != nil {
- // Prevents panic
- log.Println(err)
- return err
- }
-
- if pageRe.MatchString(info.Name()) {
- if err := convertPage(newDir, path); err != nil {
- log.Println(err)
- return err
- }
- }
-
- return nil
- })
-
-}
diff --git a/cmd/server/main.go b/cmd/server/main.go
index c18aa55..f034cfa 100644
--- a/cmd/server/main.go
+++ b/cmd/server/main.go
@@ -6,8 +6,11 @@ import (
"log"
"net/http"
"os"
+ "time"
- "git.riedstra.us/mitch/go-website/page"
+ siteHttp "git.riedstra.dev/mitch/go-website/http"
+ // "git.riedstra.dev/mitch/go-website/local"
+ // "git.riedstra.dev/mitch/go-website/page"
)
var VersionString = ""
@@ -32,6 +35,16 @@ func main() {
log.Fatal(err)
}
- page.SetupHandlers()
- _ = http.ListenAndServe(*listen, nil)
+ // We're going to utilize the local version of the website
+ // siteHttp.NewPage = func(u string) page.Page {
+ // return &local.Page{Path: u}
+ // }
+
+ srv := &http.Server{
+ Handler: siteHttp.GetHandler(),
+ Addr: *listen,
+ WriteTimeout: 15 * time.Second,
+ ReadTimeout: 15 * time.Second,
+ }
+ log.Fatal(srv.ListenAndServe())
}
diff --git a/go.mod b/go.mod
index b97fd83..f15f431 100644
--- a/go.mod
+++ b/go.mod
@@ -1,12 +1,12 @@
-module git.riedstra.us/mitch/go-website
+module git.riedstra.dev/mitch/go-website
go 1.13
require (
+ github.com/gorilla/mux v1.8.0
github.com/kr/pretty v0.1.0 // indirect
github.com/russross/blackfriday v2.0.0+incompatible
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
- gopkg.in/yaml.v2 v2.2.7
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
)
diff --git a/go.sum b/go.sum
index da16122..8208b32 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,5 @@
+github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -11,7 +13,5 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
-gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/http/main.go b/http/main.go
new file mode 100644
index 0000000..875f4b9
--- /dev/null
+++ b/http/main.go
@@ -0,0 +1,78 @@
+// A mostly self explanatory package, it handles website specific
+// HTTP requests
+package http
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "git.riedstra.dev/mitch/go-website/local"
+ "git.riedstra.dev/mitch/go-website/page"
+
+ "github.com/gorilla/mux"
+)
+
+// NewPage is required to specify how we acquire a new page from a given URL
+// since an interface is used, you can swap this out with a different
+// library to load pages from different sources
+var NewPage func(string) page.Page = func(u string) page.Page {
+ return &local.Page{Path: u}
+}
+
+func GetHandler() http.Handler {
+ if NewPage == nil {
+ fmt.Fprintln(os.Stderr, "Warning, global NewPage method is not defined!")
+ }
+
+ r := mux.NewRouter()
+ r.HandleFunc("/rebuildIndex/", RebuildIndexHandler)
+ r.PathPrefix("/static/").Handler(StaticHandler())
+ r.PathPrefix("/").HandlerFunc(PageHandler)
+ return r
+}
+
+func PageHandler(w http.ResponseWriter, r *http.Request) {
+ u := r.URL.Path
+ if u == "/" {
+ u = "/index"
+ }
+ u = filepath.Join(".", u)
+ log.Println(u)
+
+ p := NewPage(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", u)
+ p = NewPage("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" {
+ p := NewPage("index")
+ _ = p.RebuildIndex()
+ }
+}
+
+func StaticHandler() http.Handler {
+ return http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
+}
diff --git a/local/index.go b/local/index.go
new file mode 100644
index 0000000..a90276e
--- /dev/null
+++ b/local/index.go
@@ -0,0 +1,69 @@
+package local
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+var pageIndex map[string]PageList
+
+func (p *Page) RebuildIndex() error {
+ pageIndex = nil
+ _, err := p.Index()
+ return err
+}
+
+// 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
+}
+
+func (p *Page) Time() time.Time {
+ return p.Date.Time
+}
diff --git a/page/page.go b/local/page.go
index c5230c6..f514b4a 100644
--- a/page/page.go
+++ b/local/page.go
@@ -1,4 +1,4 @@
-package page
+package local
import (
"bufio"
@@ -6,8 +6,6 @@ import (
"fmt"
"io"
"os"
- "path/filepath"
- "strings"
"text/template"
"github.com/russross/blackfriday"
@@ -32,6 +30,11 @@ 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 {
@@ -134,53 +137,3 @@ func (p *Page) RenderBody() (string, error) {
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/local/pagelist.go
index e326ac9..75106f1 100644
--- a/page/pagelist.go
+++ b/local/pagelist.go
@@ -1,19 +1,22 @@
-package page
+package local
-import "sort"
+import (
+ "sort"
+ // "git.riedstra.dev/mitch/go-website/page"
+)
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[i].Time().After(p[j].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[i].Time().Before(p[j].Time())
})
return p
}
diff --git a/page/time.go b/local/time.go
index 0ac29ab..72ff3c6 100644
--- a/page/time.go
+++ b/local/time.go
@@ -1,4 +1,4 @@
-package page
+package local
import (
"gopkg.in/yaml.v3"
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
+}