diff options
| author | Christine Dodrill <me@christine.website> | 2017-05-20 23:30:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-05-20 23:30:47 -0700 |
| commit | 55f50910d96b94658b8d9d6bcaa09be5cc90bc05 (patch) | |
| tree | 07112ff8f7d2a67dbb5f99652181d4e205f877cb /html.go | |
| parent | 372573572913bebe24312b72f2c62d74bb8aba54 (diff) | |
| parent | e8f967619e02ebdd6daa5132012ea2382f34ce91 (diff) | |
| download | xesite-55f50910d96b94658b8d9d6bcaa09be5cc90bc05.tar.xz xesite-55f50910d96b94658b8d9d6bcaa09be5cc90bc05.zip | |
Merge pull request #4 from Xe/Xe/feat/server-side-rendering
Use server-side rendering, redo frontend with hack.css
Diffstat (limited to 'html.go')
| -rw-r--r-- | html.go | 72 |
1 files changed, 72 insertions, 0 deletions
@@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "html/template" + "net/http" + "time" + + "github.com/Xe/ln" +) + +func logTemplateTime(name string, from time.Time) { + now := time.Now() + ln.Log(ln.F{"action": "template_rendered", "dur": now.Sub(from).String(), "name": name}) +} + +func (s *Site) renderTemplatePage(templateFname string, data interface{}) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer logTemplateTime(templateFname, time.Now()) + s.tlock.RLock() + defer s.tlock.RUnlock() + + var t *template.Template + var err error + + if s.templates[templateFname] == nil { + t, err = template.ParseFiles("templates/base.html", "templates/"+templateFname) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + ln.Error(err, ln.F{"action": "renderTemplatePage", "page": templateFname}) + fmt.Fprintf(w, "error: %v", err) + } + + ln.Log(ln.F{"action": "loaded_new_template", "fname": templateFname}) + + s.tlock.RUnlock() + s.tlock.Lock() + s.templates[templateFname] = t + s.tlock.Unlock() + s.tlock.RLock() + } else { + t = s.templates[templateFname] + } + + err = t.Execute(w, data) + if err != nil { + panic(err) + } + }) +} + +func (s *Site) showPost(w http.ResponseWriter, r *http.Request) { + if r.RequestURI == "/blog/" { + http.Redirect(w, r, "/blog", http.StatusSeeOther) + return + } + + var p *Post + for _, pst := range s.Posts { + if pst.Link == r.RequestURI[1:] { + p = pst + } + } + + if p == nil { + w.WriteHeader(http.StatusNotFound) + s.renderTemplatePage("error.html", "no such post found: "+r.RequestURI).ServeHTTP(w, r) + return + } + + s.renderTemplatePage("blogpost.html", p).ServeHTTP(w, r) +} |
