Add simple index (or /blog) site

This commit is contained in:
Jan-Lukas Else 2020-08-05 19:14:10 +02:00
parent fa10bd03d3
commit 626000ab96
8 changed files with 71 additions and 9 deletions

23
http.go
View File

@ -10,7 +10,7 @@ import (
"sync"
)
const contentTypeHTML = "text/html"
const contentTypeHTML = "text/html; charset=utf-8"
var d *dynamicHandler
@ -53,12 +53,9 @@ func buildHandler() (http.Handler, error) {
r := chi.NewRouter()
if appConfig.Server.Logging {
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.RealIP, middleware.Logger)
}
r.Use(middleware.Recoverer)
r.Use(middleware.StripSlashes)
r.Use(middleware.GetHead)
r.Use(middleware.Recoverer, middleware.StripSlashes, middleware.GetHead)
r.Route("/api", func(apiRouter chi.Router) {
apiRouter.Use(middleware.BasicAuth("API", map[string]string{
@ -88,11 +85,25 @@ func buildHandler() (http.Handler, error) {
}
}
routePatterns := routesToStringSlice(r.Routes())
if !routePatterns.has("/") {
r.With(cacheMiddleware, minifier.Middleware).Get("/", serveIndex)
} else if !routePatterns.has("/blog") {
r.With(cacheMiddleware, minifier.Middleware).Get("/blog", serveIndex)
}
r.With(minifier.Middleware).NotFound(serve404)
return r, nil
}
func routesToStringSlice(routes []chi.Route) (ss stringSlice) {
for _, r := range routes {
ss = append(ss, r.Pattern)
}
return
}
type dynamicHandler struct {
realHandler http.Handler
changeMutex *sync.Mutex

View File

@ -12,7 +12,7 @@ var minifier *minify.M
func initMinify() {
minifier = minify.New()
minifier.AddFunc(contentTypeHTML, html.Minify)
minifier.AddFunc("text/html", html.Minify)
minifier.AddFunc("text/css", css.Minify)
minifier.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-)?(java|ecma)script$"), js.Minify)
}

View File

@ -31,6 +31,15 @@ func servePost(w http.ResponseWriter, r *http.Request) {
render(w, templatePost, post)
}
func serveIndex(w http.ResponseWriter, r *http.Request) {
posts, err := getAllPosts(r.Context())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
render(w, templateIndex, posts)
}
func getPost(context context.Context, path string) (*Post, error) {
posts, err := getPosts(context, path)
if err != nil {

View File

@ -11,6 +11,8 @@ import (
const templatePost = "post"
const templateError = "error"
const templateRedirect = "redirect"
const templateIndex = "index"
const templateSummary = "summary"
var templates map[string]*template.Template
var templateFunctions template.FuncMap
@ -31,10 +33,15 @@ func initRendering() {
"p": func(post Post, parameter string) string {
return post.Parameters[parameter]
},
"include": func(templateName string, data interface{}) (template.HTML, error) {
buf := new(bytes.Buffer)
err := templates[templateName].ExecuteTemplate(buf, templateName, data)
return template.HTML(buf.String()), err
},
}
templates = make(map[string]*template.Template)
for _, name := range []string{templatePost, templateError, templateRedirect} {
for _, name := range []string{templatePost, templateError, templateRedirect, templateIndex, templateSummary} {
templates[name] = loadTemplate(name)
}
}

15
templates/index.gohtml Normal file
View File

@ -0,0 +1,15 @@
{{ define "title" }}
<title>{{ blog.Title }}</title>
{{ end }}
{{ define "main" }}
<main>
{{ range $i, $post := . }}
{{ include "summary" . }}
{{ end }}
</main>
{{ end }}
{{ define "index" }}
{{ template "base" . }}
{{ end }}

View File

@ -13,6 +13,6 @@
</main>
{{ end }}
{{ define "post"}}
{{ define "post" }}
{{ template "base" . }}
{{ end }}

8
templates/summary.gohtml Normal file
View File

@ -0,0 +1,8 @@
{{ define "summary" }}
<article>
{{ with p . "title" }}<h2>{{ . }}</h2>{{ end }}
<p>{{ md .Content }}</p>
<a href="{{ .Path }}">View</a>
</article>
<hr>
{{ end }}

12
utils.go Normal file
View File

@ -0,0 +1,12 @@
package main
type stringSlice []string
func (s stringSlice) has(value string) bool {
for _, v := range s {
if v == value {
return true
}
}
return false
}