Restructure templates to have a base "page" template with common markup.

This commit is contained in:
Mihai Parparita 2014-08-11 23:06:53 -07:00
parent 35a6407490
commit 0ecaeef5e3
7 changed files with 99 additions and 79 deletions

View file

@ -9,7 +9,9 @@ import (
"io/ioutil"
"log"
"net/http"
"path/filepath"
"strconv"
"strings"
"appengine"
"appengine/mail"
@ -25,6 +27,26 @@ var router *mux.Router
var githubOauthConfig oauth.Config
var sessionStore *sessions.CookieStore
var sessionConfig SessionConfig
var templates map[string]*template.Template
func init() {
initTemplates()
sessionStore, sessionConfig = initSession()
initGithubOAuthConfig()
router = mux.NewRouter()
router.HandleFunc("/", indexHandler).Name("index")
router.HandleFunc("/session/sign-in", signInHandler).Name("sign-in")
router.HandleFunc("/session/sign-out", signOutHandler).Name("sign-out")
router.HandleFunc("/github/callback", githubOAuthCallbackHandler)
router.HandleFunc("/digest/send", sendDigestHandler).Name("send-digest").Methods("POST")
router.HandleFunc("/digest/cron", digestCronHandler)
router.HandleFunc("/admin/digest", digestAdminHandler)
http.Handle("/", router)
}
func initGithubOAuthConfig() {
path := "config/github-oauth"
@ -45,26 +67,34 @@ func initGithubOAuthConfig() {
githubOauthConfig.TokenURL = "https://github.com/login/oauth/access_token"
}
func init() {
sessionStore, sessionConfig = initSession()
initGithubOAuthConfig()
router = mux.NewRouter()
router.HandleFunc("/", indexHandler).Name("index")
router.HandleFunc("/session/sign-in", signInHandler).Name("sign-in")
router.HandleFunc("/session/sign-out", signOutHandler).Name("sign-out")
router.HandleFunc("/github/callback", githubOAuthCallbackHandler)
router.HandleFunc("/digest/send", sendDigestHandler).Name("send-digest").Methods("POST")
router.HandleFunc("/digest/cron", digestCronHandler)
router.HandleFunc("/admin/digest", digestAdminHandler)
http.Handle("/", router)
func initTemplates() {
sharedFileNames, err := filepath.Glob("templates/shared/*.html")
if err != nil {
log.Panicf("Could not read shared template file names %s", err.Error())
}
templateFileNames, err := filepath.Glob("templates/*.html")
if err != nil {
log.Panicf("Could not read template file names %s", err.Error())
}
templates = make(map[string]*template.Template)
for _, templateFileName := range templateFileNames {
templateName := filepath.Base(templateFileName)
templateName = strings.TrimSuffix(templateName, filepath.Ext(templateName))
fileNames := make([]string, 0, len(sharedFileNames)+2)
// The base template has to come first, except for the email template, which
// doesn't use it
if templateName != "digest-email" {
fileNames = append(fileNames, "templates/base/page.html")
}
fileNames = append(fileNames, templateFileName)
fileNames = append(fileNames, sharedFileNames...)
templates[templateName], err = template.ParseFiles(fileNames...)
if err != nil {
log.Panicf("Could not parse template files for %s: %s", templateFileName, err.Error())
}
}
}
var templates = template.Must(template.ParseGlob("templates/*.html"))
func signInHandler(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, githubOauthConfig.AuthCodeURL(""), http.StatusFound)
}
@ -85,7 +115,7 @@ func indexHandler(w http.ResponseWriter, r *http.Request) {
var data = map[string]string{
"SignInUrl": signInUrl.String(),
}
if err := templates.ExecuteTemplate(w, "index-signed-out", data); err != nil {
if err := templates["index-signed-out"].Execute(w, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
return
@ -118,7 +148,7 @@ func indexHandler(w http.ResponseWriter, r *http.Request) {
"SendDigestUrl": sendDigestUrl.String(),
"Digest": digest,
}
if err := templates.ExecuteTemplate(w, "index", data); err != nil {
if err := templates["index"].Execute(w, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
@ -174,14 +204,14 @@ func sendDigestForAccount(account *Account, c appengine.Context) (bool, error) {
return false, nil
}
var data = map[string]interface{}{
"Styles": getDigestStyles(),
"Digest": digest,
}
var digestHtml bytes.Buffer
digestHtml.WriteString("<html><head><style>")
digestHtml.Write(getDigestStyles())
digestHtml.WriteString("</style></head><body>")
if err := templates.ExecuteTemplate(&digestHtml, "digest", digest); err != nil {
if err := templates["digest-email"].Execute(&digestHtml, data); err != nil {
return false, err
}
digestHtml.WriteString("</body></html>")
emails, _, err := githubClient.Users.ListEmails(nil)
if err != nil {
@ -209,12 +239,12 @@ func sendDigestForAccount(account *Account, c appengine.Context) (bool, error) {
return true, err
}
func getDigestStyles() []byte {
func getDigestStyles() template.CSS {
b, err := ioutil.ReadFile("static/digest.css")
if err != nil {
log.Panicf("Could not read digest CSS: %s", err.Error())
}
return b
return template.CSS(string(b[:]))
}
func githubOAuthCallbackHandler(w http.ResponseWriter, r *http.Request) {
@ -280,7 +310,7 @@ func digestAdminHandler(w http.ResponseWriter, r *http.Request) {
var data = map[string]interface{}{
"Digest": digest,
}
if err := templates.ExecuteTemplate(w, "digest-admin", data); err != nil {
if err := templates["digest-admin"].Execute(w, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{template "title" .}}</title>
<link rel="stylesheet" href="/static/main.css">
<link rel="stylesheet" href="/static/digest.css">
</head>
<body>
<h1>{{template "title" .}}</h1>
{{template "body" .}}
</body>
</html>

View file

@ -1,18 +1,7 @@
{{define "digest-admin"}}
{{define "title"}}GitHop Admin{{end}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GitHop Admin</title>
<link rel="stylesheet" href="/static/main.css">
<link rel="stylesheet" href="/static/digest.css">
</head>
<body>
<h1>GitHop Admin</h1>
{{define "body"}}
{{template "digest" .Digest}}
</body>
</html>
{{template "digest" .Digest}}
{{end}}

View file

@ -0,0 +1,8 @@
<html>
<head>
<style>{{.Styles}}</style>
</head>
<body>
{{template "digest" .Digest}}
</body>
</html>

View file

@ -1,19 +1,9 @@
{{define "index-signed-out"}}
{{define "title"}}GitHop{{end}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GitHop</title>
<link rel="stylesheet" href="/static/main.css">
</head>
<body>
<h1>GitHop!</h1>
{{define "body"}}
<a href="{{.SignInUrl}}">
Sign In
</a>
</body>
</html>
<a href="{{.SignInUrl}}">
Sign In
</a>
{{end}}

View file

@ -1,28 +1,17 @@
{{define "index"}}
{{define "title"}}GitHop{{end}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GitHop</title>
<link rel="stylesheet" href="/static/main.css">
<link rel="stylesheet" href="/static/digest.css">
</head>
<body>
<h1>GitHop!</h1>
{{define "body"}}
<p>
<a href="{{.SignOutUrl}}">
Sign Out
</a>
</p>
<p>
<a href="{{.SignOutUrl}}">
Sign Out
</a>
</p>
<form method="POST" action="{{.SendDigestUrl}}">
<input type="submit" value="Email Digest">
</form>
<form method="POST" action="{{.SendDigestUrl}}">
<input type="submit" value="Email Digest">
</form>
{{template "digest" .Digest}}
</body>
</html>
{{template "digest" .Digest}}
{{end}}