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