From 42365414410d1b9b8ab7dac0cfab402f8bc6fce2 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Mon, 22 Aug 2022 21:15:36 +0200 Subject: [PATCH 1/3] refactoring reading Meta and RenderedContent --- cmd/owl-web/handler.go | 2 +- post.go | 53 ++++++++++++++++++++++++++++++++---------- post_test.go | 47 ++++++++++++++++++++++++++++++++++--- renderer.go | 2 +- rss.go | 2 +- user.go | 9 +++---- user_test.go | 2 +- 7 files changed, 94 insertions(+), 23 deletions(-) diff --git a/cmd/owl-web/handler.go b/cmd/owl-web/handler.go index ee4041a..4c95b67 100644 --- a/cmd/owl-web/handler.go +++ b/cmd/owl-web/handler.go @@ -95,7 +95,7 @@ func postHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Request, return } - _, meta := post.MarkdownData() + meta := post.Meta() if meta.Draft { println("Post is a draft") notFoundHandler(repo)(w, r) diff --git a/post.go b/post.go index d6bc658..7a2cd7d 100644 --- a/post.go +++ b/post.go @@ -13,9 +13,11 @@ import ( ) type Post struct { - user *User - id string - title string + user *User + id string + title string + metaLoaded bool + meta PostMeta } type PostMeta struct { @@ -57,17 +59,24 @@ func (post Post) ContentFile() string { return path.Join(post.Dir(), "index.md") } +func (post *Post) Meta() PostMeta { + if !post.metaLoaded { + post.LoadMeta() + } + return post.meta +} + func (post Post) Content() []byte { // read file data, _ := ioutil.ReadFile(post.ContentFile()) return data } -func (post Post) MarkdownData() (bytes.Buffer, PostMeta) { +func (post Post) RenderedContent() bytes.Buffer { data := post.Content() - // get yaml metadata block - meta := PostMeta{} + // trim yaml block + // TODO this can be done nicer trimmedData := bytes.TrimSpace(data) // check first line is --- if string(trimmedData[0:4]) == "---\n" { @@ -75,8 +84,6 @@ func (post Post) MarkdownData() (bytes.Buffer, PostMeta) { // find --- end end := bytes.Index(trimmedData, []byte("\n---\n")) if end != -1 { - metaData := trimmedData[:end] - yaml.Unmarshal(metaData, &meta) data = trimmedData[end+5:] } } @@ -100,13 +107,35 @@ func (post Post) MarkdownData() (bytes.Buffer, PostMeta) { if err := markdown.Convert(data, &buf, parser.WithContext(context)); err != nil { panic(err) } - // metaData := meta.Get(context) - return buf, meta + return buf } func (post Post) Aliases() []string { - _, metaData := post.MarkdownData() - return metaData.Aliases + return post.Meta().Aliases +} + +func (post *Post) LoadMeta() error { + data := post.Content() + + // get yaml metadata block + meta := PostMeta{} + trimmedData := bytes.TrimSpace(data) + // check first line is --- + if string(trimmedData[0:4]) == "---\n" { + trimmedData = trimmedData[4:] + // find --- end + end := bytes.Index(trimmedData, []byte("\n---\n")) + if end != -1 { + metaData := trimmedData[:end] + err := yaml.Unmarshal(metaData, &meta) + if err != nil { + return err + } + } + } + + post.meta = meta + return nil } diff --git a/post_test.go b/post_test.go index 83ee19d..72616b8 100644 --- a/post_test.go +++ b/post_test.go @@ -79,7 +79,7 @@ func TestDraftInMetaData(t *testing.T) { content += "\n" content += "Write your post here.\n" os.WriteFile(post.ContentFile(), []byte(content), 0644) - _, meta := post.MarkdownData() + meta := post.Meta() if !meta.Draft { t.Error("Draft should be true") } @@ -97,7 +97,7 @@ func TestNoRawHTMLIfDisallowedByRepo(t *testing.T) { content += "\n" content += "\n" os.WriteFile(post.ContentFile(), []byte(content), 0644) - html, _ := post.MarkdownData() + html := post.RenderedContent() html_str := html.String() if strings.Contains(html_str, "\n" os.WriteFile(post.ContentFile(), []byte(content), 0644) - html, _ := post.MarkdownData() + html := post.RenderedContent() html_str := html.String() if !strings.Contains(html_str, "\n" + os.WriteFile(post.ContentFile(), []byte(content), 0644) + + err := post.LoadMeta() + + if err != nil { + t.Errorf("Got Error: %v", err) + } + + if post.Meta().Title != "test" { + t.Errorf("Expected title: %s, got %s", "test", post.Meta().Title) + } + + if len(post.Meta().Aliases) != 1 || post.Meta().Aliases[0] != "foo/bar/" { + t.Errorf("Expected title: %v, got %v", []string{"foo/bar/"}, post.Meta().Aliases) + } + + if post.Meta().Date != "Wed, 17 Aug 2022 10:50:02 +0000" { + t.Errorf("Expected title: %s, got %s", "Wed, 17 Aug 2022 10:50:02 +0000", post.Meta().Title) + } + + if post.Meta().Draft != true { + t.Errorf("Expected title: %v, got %v", true, post.Meta().Draft) + } + +} diff --git a/renderer.go b/renderer.go index aeb0aff..f4ac784 100644 --- a/renderer.go +++ b/renderer.go @@ -68,7 +68,7 @@ func renderIntoBaseTemplate(user User, data PageContent) (string, error) { } func RenderPost(post Post) (string, error) { - buf, _ := post.MarkdownData() + buf := post.RenderedContent() postHtml, err := renderEmbedTemplate("embed/post.html", PostRenderData{ Title: post.Title(), Post: template.HTML(buf.String()), diff --git a/rss.go b/rss.go index b1839de..68405f6 100644 --- a/rss.go +++ b/rss.go @@ -41,7 +41,7 @@ func RenderRSSFeed(user User) (string, error) { posts, _ := user.Posts() for _, post := range posts { - _, meta := post.MarkdownData() + meta := post.Meta() rss.Channel.Items = append(rss.Channel.Items, RSSItem{ Guid: post.FullUrl(), Title: post.Title(), diff --git a/user.go b/user.go index d5746c2..ae4d1e2 100644 --- a/user.go +++ b/user.go @@ -68,7 +68,7 @@ func (user User) Posts() ([]*Post, error) { // remove drafts n := 0 for _, post := range posts { - _, meta := post.MarkdownData() + meta := post.Meta() if !meta.Draft { posts[n] = post n++ @@ -83,7 +83,7 @@ func (user User) Posts() ([]*Post, error) { postDates := make([]PostWithDate, len(posts)) for i, post := range posts { - _, meta := post.MarkdownData() + meta := post.Meta() date, err := time.Parse(time.RFC1123Z, meta.Date) if err != nil { // invalid date -> use 1970-01-01 @@ -111,8 +111,9 @@ func (user User) GetPost(id string) (Post, error) { } post := Post{user: &user, id: id} - _, metaData := post.MarkdownData() - title := metaData.Title + // post.loadMeta() + meta := post.Meta() + title := meta.Title post.title = fmt.Sprint(title) return post, nil diff --git a/user_test.go b/user_test.go index f8f03f9..c2f449c 100644 --- a/user_test.go +++ b/user_test.go @@ -41,7 +41,7 @@ func TestCreateNewPostAddsDateToMetaBlock(t *testing.T) { user.CreateNewPost("testpost") posts, _ := user.Posts() post, _ := user.GetPost(posts[0].Id()) - _, meta := post.MarkdownData() + meta := post.Meta() if meta.Date == "" { t.Error("Found no date. Got: " + meta.Date) } From 769c4133d5b385d51d1cce86f3d296792c9fdd95 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Mon, 22 Aug 2022 21:22:06 +0200 Subject: [PATCH 2/3] date in post-list --- embed/post-list.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/embed/post-list.html b/embed/post-list.html index aa358bc..46d5a16 100644 --- a/embed/post-list.html +++ b/embed/post-list.html @@ -1,7 +1,10 @@
{{range .}}
-

{{.Title}}

+

{{.Title}}

+
Published: {{.Meta.Date}}
+
+
{{end}}
\ No newline at end of file From 179559250a8ece437c3346541c449a2d736e69fc Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Mon, 22 Aug 2022 21:35:50 +0200 Subject: [PATCH 3/3] added publishing date to post and post list with microformat tags --- cmd/owl-web/handler.go | 2 +- embed/post-list.html | 12 +++++++++--- embed/post.html | 14 ++++++++++++-- renderer.go | 12 +++++++----- renderer_test.go | 8 ++++---- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/cmd/owl-web/handler.go b/cmd/owl-web/handler.go index 4c95b67..482cf69 100644 --- a/cmd/owl-web/handler.go +++ b/cmd/owl-web/handler.go @@ -102,7 +102,7 @@ func postHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Request, return } - html, err := owl.RenderPost(post) + html, err := owl.RenderPost(&post) if err != nil { println("Error rendering post: ", err.Error()) w.WriteHeader(http.StatusInternalServerError) diff --git a/embed/post-list.html b/embed/post-list.html index 46d5a16..054b7db 100644 --- a/embed/post-list.html +++ b/embed/post-list.html @@ -1,10 +1,16 @@
{{range .}}
-

{{.Title}}

-
Published: {{.Meta.Date}}
+
+

{{.Title}}

+ + Published: + + +

-
{{end}}
\ No newline at end of file diff --git a/embed/post.html b/embed/post.html index d6c1ffb..e4e545b 100644 --- a/embed/post.html +++ b/embed/post.html @@ -1,6 +1,16 @@
-

{{.Title}}

+
+

{{.Title}}

+ + Published: + + +
+
+
- {{.Post}} + {{.Content}}
\ No newline at end of file diff --git a/renderer.go b/renderer.go index f4ac784..74034a6 100644 --- a/renderer.go +++ b/renderer.go @@ -12,8 +12,9 @@ type PageContent struct { } type PostRenderData struct { - Title string - Post template.HTML + Title string + Post *Post + Content template.HTML } func renderEmbedTemplate(templateFile string, data interface{}) (string, error) { @@ -67,11 +68,12 @@ func renderIntoBaseTemplate(user User, data PageContent) (string, error) { return html.String(), nil } -func RenderPost(post Post) (string, error) { +func RenderPost(post *Post) (string, error) { buf := post.RenderedContent() postHtml, err := renderEmbedTemplate("embed/post.html", PostRenderData{ - Title: post.Title(), - Post: template.HTML(buf.String()), + Title: post.Title(), + Post: post, + Content: template.HTML(buf.String()), }) if err != nil { return "", err diff --git a/renderer_test.go b/renderer_test.go index d97f8e2..bbd5358 100644 --- a/renderer_test.go +++ b/renderer_test.go @@ -11,7 +11,7 @@ import ( func TestCanRenderPost(t *testing.T) { user := getTestUser() post, _ := user.CreateNewPost("testpost") - result, err := owl.RenderPost(post) + result, err := owl.RenderPost(&post) if err != nil { t.Error("Error rendering post: " + err.Error()) @@ -27,7 +27,7 @@ func TestCanRenderPost(t *testing.T) { func TestRenderPostHEntry(t *testing.T) { user := getTestUser() post, _ := user.CreateNewPost("testpost") - result, _ := owl.RenderPost(post) + result, _ := owl.RenderPost(&post) if !strings.Contains(result, "class=\"h-entry\"") { t.Error("h-entry container not rendered. Got: " + result) } @@ -43,7 +43,7 @@ func TestRenderPostHEntry(t *testing.T) { func TestRendererUsesBaseTemplate(t *testing.T) { user := getTestUser() post, _ := user.CreateNewPost("testpost") - result, err := owl.RenderPost(post) + result, err := owl.RenderPost(&post) if err != nil { t.Error("Error rendering post: " + err.Error()) @@ -132,7 +132,7 @@ func TestRendersHeaderTitle(t *testing.T) { }) post, _ := user.CreateNewPost("testpost") - result, _ := owl.RenderPost(post) + result, _ := owl.RenderPost(&post) if !strings.Contains(result, "Test Title") { t.Error("Header title not rendered. Got: " + result) }