/* catcrafts.net Copyright (C) 2025 Catcrafts The source code of this website is made available for viewing purposes only. No permission is granted to copy, modify, distribute, or create derivative works. */ export module Catcrafts:Blog_impl; import :Blog; import :Root; import :Views; import std; using namespace Crafter::CppDOMBindings; export namespace Catcrafts { std::vector* blogButtons = new std::vector(); void RenderBlog() { delete blogButtons; blogButtons = new std::vector(); std::string html = ""; for(const BlogPost& post : *posts) { // For preview, we'll limit the content to first 200 characters std::string previewContent = post.content; if(previewContent.length() > 200) { // Find the last space before 200 characters to avoid cutting words std::size_t lastSpace = previewContent.find_last_of(' ', 200); if(lastSpace != std::string::npos) { previewContent = previewContent.substr(0, lastSpace) + "..."; } else { previewContent = previewContent.substr(0, 200) + "..."; } } html += std::format(R"(

{}

{}
)", post.name, post.date, previewContent, post.slug); } main->SetInnerHTML(html); for(const BlogPost& post : *posts) { HtmlElementView& view = blogButtons->emplace_back(std::format("blog-button-{}", post.slug)); view.AddClickListener([slug = post.slug](Crafter::MouseEvent e) { PushState("{}", "", std::format("/blog/{}", slug)); RenderRoot(std::format("/blog/{}", slug)); }); } } void RenderBlogPost(const std::string_view slug) { for(const BlogPost& post : *posts) { if(post.slug == slug) { main->SetInnerHTML(std::format(R"(

{}

{}
)", post.name, post.date, post.content)); return; } } main->SetInnerHTML("

Post Not Found

The requested blog post could not be found.

"); } }