diff --git a/config.go b/config.go index 0b20d29..ad41c02 100644 --- a/config.go +++ b/config.go @@ -9,6 +9,7 @@ type config struct { server *configServer db *configDb cache *configCache + blog *configBlog } type configServer struct { @@ -25,10 +26,19 @@ type configCache struct { expiration int64 } +// exposed to templates via function "blog" +type configBlog struct { + // Language of the blog, e.g. "en" or "de" + Lang string + // Title of the blog, e.g. "My blog" + Title string +} + var appConfig = &config{ server: &configServer{}, db: &configDb{}, cache: &configCache{}, + blog: &configBlog{}, } func initConfig() error { @@ -61,6 +71,15 @@ func initConfig() error { viper.SetDefault(cacheExpiration, 600) appConfig.cache.expiration = viper.GetInt64(cacheExpiration) logConfig(cacheExpiration, appConfig.cache.expiration) + // Blog meta + blogLang := "blog.lang" + viper.SetDefault(blogLang, "en") + appConfig.blog.Lang = viper.GetString(blogLang) + logConfig(blogLang, appConfig.blog.Lang) + blogTitle := "blog.title" + viper.SetDefault(blogTitle, "My blog") + appConfig.blog.Title = viper.GetString(blogTitle) + logConfig(blogTitle, appConfig.blog.Title) return nil } diff --git a/emoji.go b/emoji.go index e700c86..d4fcd0d 100644 --- a/emoji.go +++ b/emoji.go @@ -72,5 +72,4 @@ func initEmoji() { emojiMaxSize = len(k) } } - } diff --git a/example-config.yaml b/example-config.yaml index b309d54..0f371ee 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -2,4 +2,10 @@ server: logging: false port: 8080 database: - file: data/db.sqlite \ No newline at end of file + file: data/db.sqlite +cache: + enable: true + expiration: 600 +blog: + lang: en + title: My blog \ No newline at end of file diff --git a/main.go b/main.go index c044471..5c01396 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,9 @@ func main() { } }() log.Println("Loaded database") + log.Println("Initializing template rendering") + initEmoji() + initRendering() log.Println("Start server") err = startServer() if err != nil { diff --git a/posts.go b/posts.go index 0e4e594..9524139 100644 --- a/posts.go +++ b/posts.go @@ -9,12 +9,12 @@ import ( var errPostNotFound = errors.New("post not found") -type post struct { - path string - content string - published string - updated string - parameters map[string]string +type Post struct { + Path string + Content string + Published string + Updated string + Parameters map[string]string } func servePost(w http.ResponseWriter, r *http.Request) { @@ -27,19 +27,16 @@ func servePost(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - htmlContent, err := renderMarkdown(post.content) + err = templates.ExecuteTemplate(w, templatePostName, post) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) - return } - w.Header().Set("Content-Type", "text/html") - _, _ = w.Write(htmlContent) } -func getPost(context context.Context, path string) (*post, error) { - queriedPost := &post{} +func getPost(context context.Context, path string) (*Post, error) { + queriedPost := &Post{} row := appDb.QueryRowContext(context, "select path, COALESCE(content, ''), COALESCE(published, ''), COALESCE(updated, '') from posts where path=?", path) - err := row.Scan(&queriedPost.path, &queriedPost.content, &queriedPost.published, &queriedPost.updated) + err := row.Scan(&queriedPost.Path, &queriedPost.Content, &queriedPost.Published, &queriedPost.Updated) if err == sql.ErrNoRows { return nil, errPostNotFound } else if err != nil { @@ -52,17 +49,17 @@ func getPost(context context.Context, path string) (*post, error) { return queriedPost, nil } -func (p *post) fetchParameters(context context.Context) error { - rows, err := appDb.QueryContext(context, "select parameter, COALESCE(value, '') from post_parameters where path=?", p.path) +func (p *Post) fetchParameters(context context.Context) error { + rows, err := appDb.QueryContext(context, "select parameter, COALESCE(value, '') from post_parameters where path=?", p.Path) if err != nil { return err } - p.parameters = make(map[string]string) + p.Parameters = make(map[string]string) for rows.Next() { var parameter string var value string _ = rows.Scan(¶meter, &value) - p.parameters[parameter] = value + p.Parameters[parameter] = value } return nil } diff --git a/redirects.go b/redirects.go index 80c11e8..712a780 100644 --- a/redirects.go +++ b/redirects.go @@ -18,7 +18,12 @@ func serveRedirect(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - http.Redirect(w, r, redirect, http.StatusFound) + w.WriteHeader(http.StatusFound) + _ = templates.ExecuteTemplate(w, templateRedirectName, struct { + Permalink string + }{ + Permalink: redirect, + }) } func getRedirect(context context.Context, fromPath string) (string, error) { diff --git a/render.go b/render.go new file mode 100644 index 0000000..50f63da --- /dev/null +++ b/render.go @@ -0,0 +1,37 @@ +package main + +import ( + "html/template" + "log" +) + +const templatePostName = "post.gohtml" +const templateRedirectName = "redirect.gohtml" + +var templates *template.Template + +func initRendering() { + templateFunctions := template.FuncMap{ + "blog": func() *configBlog { + return appConfig.blog + }, + "md": func(content string) template.HTML { + htmlContent, err := renderMarkdown(content) + if err != nil { + log.Fatal(err) + return "" + } + return template.HTML(htmlContent) + }, + "title": func(post Post) string { + return post.Parameters["title"] + }, + } + + var err error + + templates, err = template.New("templates").Funcs(templateFunctions).ParseGlob("templates/*.gohtml") + if err != nil { + log.Fatal(err) + } +} diff --git a/templates/base.gohtml b/templates/base.gohtml new file mode 100644 index 0000000..824e062 --- /dev/null +++ b/templates/base.gohtml @@ -0,0 +1,9 @@ +{{ define "base" }} + + + + + +{{ template "title" . }} +{{ template "main" . }} +{{ end }} \ No newline at end of file diff --git a/templates/post.gohtml b/templates/post.gohtml new file mode 100644 index 0000000..43aa5ae --- /dev/null +++ b/templates/post.gohtml @@ -0,0 +1,14 @@ +{{ template "base" . }} + +{{ define "title" }} + {{ with title . }}{{ . }} - {{end}}{{ blog.Title }} +{{ end }} + +{{ define "main" }} +
+
+ {{ with title . }}

{{ . }}

{{ end }} +
{{ md .Content }}
+
+
+{{ end }} \ No newline at end of file diff --git a/templates/redirect.gohtml b/templates/redirect.gohtml new file mode 100644 index 0000000..c9218e0 --- /dev/null +++ b/templates/redirect.gohtml @@ -0,0 +1,7 @@ + + + + +{{ .Permalink }} + + \ No newline at end of file