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) }