Added blog page, article page and added latest articles to start page.

This commit is contained in:
2020-06-14 02:16:39 +02:00
parent 71ca09427f
commit da2bc2ef28
11 changed files with 325 additions and 57 deletions

65
main.go
View File

@@ -1,13 +1,14 @@
package main
import (
"bytes"
"github.com/Kugelschieber/marvinblum.de/blog"
"github.com/Kugelschieber/marvinblum.de/tpl"
"github.com/NYTimes/gziphandler"
"github.com/caddyserver/certmagic"
emvi "github.com/emvi/api-go"
"github.com/emvi/logbuch"
"github.com/gorilla/mux"
"github.com/rs/cors"
"html/template"
"net/http"
"os"
"strings"
@@ -16,17 +17,10 @@ import (
const (
staticDir = "static"
staticDirPrefix = "/static/"
templateDir = "template/*"
logTimeFormat = "2006-01-02_15:04:05"
envPrefix = "MB_"
)
var (
tpl *template.Template
tplCache = make(map[string][]byte)
hotReload bool
)
func configureLog() {
logbuch.SetFormatter(logbuch.NewFieldFormatter(logTimeFormat, "\t\t"))
logbuch.Info("Configure logging...")
@@ -50,42 +44,17 @@ func logEnvConfig() {
}
}
func loadTemplate() {
logbuch.Debug("Loading templates")
var err error
tpl, err = template.ParseGlob(templateDir)
if err != nil {
logbuch.Fatal("Error loading template", logbuch.Fields{"err": err})
}
hotReload = os.Getenv("MB_HOT_RELOAD") == "true"
logbuch.Debug("Templates loaded", logbuch.Fields{"hot_reload": hotReload})
}
func renderTemplate(name string) {
logbuch.Debug("Rendering template", logbuch.Fields{"name": name})
var buffer bytes.Buffer
if err := tpl.ExecuteTemplate(&buffer, name, nil); err != nil {
logbuch.Fatal("Error executing template", logbuch.Fields{"err": err, "name": name})
}
tplCache[name] = buffer.Bytes()
}
func serveTemplate(name string) http.HandlerFunc {
// render once so we have it in cache
renderTemplate(name)
func serveAbout() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if hotReload {
loadTemplate()
renderTemplate(name)
data := struct {
Articles []emvi.Article
}{
blog.GetLatestArticles(),
}
if _, err := w.Write(tplCache[name]); err != nil {
logbuch.Error("Error returning page to client", logbuch.Fields{"err": err, "name": name})
if err := tpl.Get().ExecuteTemplate(w, "about.html", data); err != nil {
logbuch.Error("Error executing blog template", logbuch.Fields{"err": err})
w.WriteHeader(http.StatusInternalServerError)
}
}
}
@@ -93,10 +62,11 @@ func serveTemplate(name string) http.HandlerFunc {
func setupRouter() *mux.Router {
router := mux.NewRouter()
router.PathPrefix(staticDirPrefix).Handler(http.StripPrefix(staticDirPrefix, gziphandler.GzipHandler(http.FileServer(http.Dir(staticDir)))))
router.Handle("/legal", serveTemplate("legal.html"))
router.Handle("/blog", serveTemplate("blog.html"))
router.Handle("/", serveTemplate("about.html"))
router.NotFoundHandler = serveTemplate("notfound.html")
router.Handle("/blog/{slug}", blog.ServeBlogArticle())
router.Handle("/blog", blog.ServeBlogPage())
router.Handle("/legal", tpl.ServeTemplate("legal.html"))
router.Handle("/", serveAbout())
router.NotFoundHandler = tpl.ServeTemplate("notfound.html")
return router
}
@@ -136,7 +106,8 @@ func start(handler http.Handler) {
func main() {
configureLog()
logEnvConfig()
loadTemplate()
tpl.LoadTemplate()
blog.InitBlog()
router := setupRouter()
corsConfig := configureCors(router)
start(corsConfig)