using templates for rendering stuff to html

pull/9/head
Niko Abeler 11 months ago
parent a74fd47710
commit b139b15ca6
  1. 4
      embed/base.html
  2. 2
      embed/post.html
  3. 9
      embed/user-list.html
  4. 73
      renderer.go
  5. 16
      renderer_test.go

@ -5,11 +5,11 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{title}}</title>
<title>{{ .Title }}</title>
</head>
<body>
{{content}}
{{ .Content }}
</body>
</html>

@ -0,0 +1,2 @@
<h1>{{.Title}}</h1>
{{.Post}}

@ -0,0 +1,9 @@
{{range .Users}}
<ul>
<li>
<a href="{{ .Path() }}">
{{ .Name() }}
</a>
</li>
</ul>
{{end}}

@ -1,22 +1,81 @@
package kiss
import "strings"
import (
"bytes"
_ "embed"
"html/template"
)
//go:embed embed/user-list.html
var userListTemplateStr string
//go:embed embed/post.html
var postTemplateStr string
type PageContent struct {
Title string
Content template.HTML
}
type PostRenderData struct {
Title string
Post template.HTML
}
func RenderPost(post Post) (string, error) {
template, _ := post.user.Template()
baseTemplate, _ := post.user.Template()
buf, _ := post.MarkdownData()
postHtml := "<h1>" + post.Title() + "</h1>\n"
postHtml += buf.String()
return strings.Replace(template, "{{content}}", postHtml, -1), nil
postTemplate, _ := template.New("post").Parse(postTemplateStr)
var postHtml bytes.Buffer
err := postTemplate.Execute(&postHtml, PostRenderData{
Title: post.Title(),
Post: template.HTML(buf.String()),
})
if err != nil {
return "", err
}
data := PageContent{
Title: post.Title(),
Content: template.HTML(postHtml.String()),
}
var html bytes.Buffer
t, err := template.New("page").Parse(baseTemplate)
t.Execute(&html, data)
return html.String(), err
}
func RenderIndexPage(user User) (string, error) {
template, _ := user.Template()
baseTemplate, _ := user.Template()
posts, _ := user.Posts()
postHtml := ""
for _, postId := range posts {
post, _ := user.GetPost(postId)
postHtml += "<h2><a href=\"" + post.Path() + "\">" + post.Title() + "</a></h2>\n"
}
return strings.Replace(template, "{{content}}", postHtml, -1), nil
data := PageContent{
Title: "Index",
Content: template.HTML(postHtml),
}
var html bytes.Buffer
t, err := template.New("post").Parse(baseTemplate)
t.Execute(&html, data)
return html.String(), err
}
// func RenderUserList(user User) (string, error) {
// base_template, _ := user.Template()
// users, _ := user.repo.Users()
// template.New("user_list").Parse()
// return strings.Replace(template, "{{content}}", userHtml, -1), nil
// }

@ -9,7 +9,13 @@ import (
func TestCanRenderPost(t *testing.T) {
user := getTestUser()
post, _ := user.CreateNewPost("testpost")
result, _ := kiss.RenderPost(post)
result, err := kiss.RenderPost(post)
if err != nil {
t.Error("Error rendering post: " + err.Error())
return
}
if !strings.Contains(result, "<h1>testpost</h1>") {
t.Error("Post title not rendered as h1. Got: " + result)
}
@ -19,7 +25,13 @@ func TestCanRenderPost(t *testing.T) {
func TestRendererUsesBaseTemplate(t *testing.T) {
user := getTestUser()
post, _ := user.CreateNewPost("testpost")
result, _ := kiss.RenderPost(post)
result, err := kiss.RenderPost(post)
if err != nil {
t.Error("Error rendering post: " + err.Error())
return
}
if !strings.Contains(result, "<html") {
t.Error("Base template not used. Got: " + result)
}

Loading…
Cancel
Save