package view import ( "fmt" "html/template" "net/http" "os" "time" "arimelody-web/controller" "arimelody-web/model" "arimelody-web/templates" "github.com/gomarkdown/markdown" "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" ) type BlogView struct { *model.Blog Comments []*model.ThreadViewPost Likes int Reposts int BlueskyURL string MastodonURL string } var mdRenderer = html.NewRenderer(html.RendererOptions{ Flags: html.CommonFlags | html.HrefTargetBlank, }) func BlogHandler(app *model.AppState) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { blog := model.Blog{ Title: "hello world!", Description: "lorem ipsum yadda yadda something boobies babababababababa", Visible: true, Date: time.Now(), AuthorID: "ari", Markdown: ` **i'm ari!** (she/her) 🏳️‍⚧️🏳️‍🌈💫🦆🇮🇪 welcome to my blog! i'm a musician, developer, streamer, youtuber, and probably a bunch of other things i forgot to mention! ## code block test ~~~ c #include int main(int argc, char *argv[]) { printf("hello world!~\n"); return 0; } ~~~ ## aridoodle this is `+"`"+`aridoodle`+"`"+`. please take care of her. ![aridoodle](/img/aridoodle.png) `, BlueskyActorID: "did:plc:yct6cvgfipngizry5umzkxr3", BlueskyPostID: "3llsudsx7pc2u", } // blog.Markdown += " " mdParser := parser.NewWithExtensions(parser.CommonExtensions | parser.AutoHeadingIDs) md := mdParser.Parse([]byte(blog.Markdown)) blog.HTML = template.HTML(markdown.Render(md, mdRenderer)) comments := []*model.ThreadViewPost{} blueskyPost, err := controller.FetchThreadViewPost(blog.BlueskyActorID, blog.BlueskyPostID) if err != nil { fmt.Fprintf(os.Stderr, "WARN: Failed to fetch blog post Bluesky thread: %v\n", err) } else { comments = append(comments, blueskyPost.Replies...) } err = templates.BlogTemplate.Execute(w, BlogView{ Blog: &blog, Comments: blueskyPost.Replies, Likes: blueskyPost.Post.LikeCount, Reposts: blueskyPost.Post.RepostCount, BlueskyURL: fmt.Sprintf("https://bsky.app/profile/%s/post/%s", blog.BlueskyActorID, blog.BlueskyPostID), MastodonURL: "#", }) if err != nil { fmt.Fprintf(os.Stderr, "Error rendering blog post: %v\n", err) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } }) }