diff options
| -rwxr-xr-x | build.sh | 2 | ||||
| -rw-r--r-- | cmd/convert/main.go | 94 | ||||
| -rw-r--r-- | cmd/server/main.go | 19 | ||||
| -rw-r--r-- | go.mod | 4 | ||||
| -rw-r--r-- | go.sum | 4 | ||||
| -rw-r--r-- | http/main.go | 78 | ||||
| -rw-r--r-- | local/index.go | 69 | ||||
| -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.go | 58 | ||||
| -rw-r--r-- | page/main.go | 10 |
12 files changed, 193 insertions, 217 deletions
@@ -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()) } @@ -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 ) @@ -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 +} |
