From 05f77926b147fe3a849eb1dbeeed2afcf97ad866 Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Thu, 2 Jul 2026 01:10:58 +0200 Subject: add blog post rendering --- clams-server/pom.xml | 8 ++++-- .../clams/server/controller/BlogController.java | 32 ++++++++++++++-------- .../clams/server/utils/MarkdownConverter.java | 15 ++++++++++ .../src/main/resources/public/css/post.css | 14 ++++------ .../src/main/resources/templates/post.html | 3 +- 5 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 clams-server/src/main/java/no/eliashaugsbakk/clams/server/utils/MarkdownConverter.java (limited to 'clams-server') diff --git a/clams-server/pom.xml b/clams-server/pom.xml index 3f45608..8eba32c 100644 --- a/clams-server/pom.xml +++ b/clams-server/pom.xml @@ -23,19 +23,16 @@ clams-shared ${project.version} - io.javalin javalin 7.2.2 - io.javalin javalin-rendering-pebble 7.2.2 - org.slf4j slf4j-simple @@ -51,6 +48,11 @@ HikariCP 7.1.0 + + org.commonmark + commonmark + 0.29.0 + diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java index 076e0e3..9111a0a 100644 --- a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/controller/BlogController.java @@ -2,11 +2,13 @@ package no.eliashaugsbakk.clams.server.controller; import io.javalin.http.Context; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import no.eliashaugsbakk.clams.server.repository.BlogPostRepo; import no.eliashaugsbakk.clams.server.repository.BlogPostRepoSqlite; import no.eliashaugsbakk.clams.server.repository.SqliteManager; +import no.eliashaugsbakk.clams.server.utils.MarkdownConverter; public class BlogController { private final BlogPostRepo blogPostRepo; @@ -16,10 +18,17 @@ public class BlogController { } public void handleGetPost(Context ctx) { - ctx.render("templates/post.html", - Map.of("page_title", "place holder Title - Elias Haugsbakk", "page_css", "post", - "title", "place holder Title", "published_date", "place holder Release Date", - "author", "place holder Author", "content", "place holder Content")); + blogPostRepo.getPost(ctx.pathParam("slug")).ifPresentOrElse(post -> ctx.render( + "templates/post.html", + Map.of("page_title", post.title() + " -- Elias Haugsbakk", + "page_css", "post", + "title", post.title(), + "published_date", post.timePublished().atZone(ZoneId.of("Europe/Oslo")).format( + DateTimeFormatter.ofPattern("MMM dd, yyyy")), + "author", "by Elias Haugsbakk", + "content", MarkdownConverter.convertToHtml(post.content()), + "back_to_index", "back to all posts" + )), () -> ctx.status(404)); } public void handleGetOverview(Context ctx) { @@ -64,17 +73,16 @@ public class BlogController { featuredPosts.append(""); ctx.render("templates/blog.html", - Map.of("page_title", "Elias Haugsbakk's Blog", "page_css", "blog", - "all_posts", allPosts.toString(), "recent_posts", featuredPosts.toString())); + Map.of("page_title", "Elias Haugsbakk's Blog", "page_css", "blog", "all_posts", + allPosts.toString(), "recent_posts", featuredPosts.toString())); } } diff --git a/clams-server/src/main/java/no/eliashaugsbakk/clams/server/utils/MarkdownConverter.java b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/utils/MarkdownConverter.java new file mode 100644 index 0000000..a0d24c8 --- /dev/null +++ b/clams-server/src/main/java/no/eliashaugsbakk/clams/server/utils/MarkdownConverter.java @@ -0,0 +1,15 @@ +package no.eliashaugsbakk.clams.server.utils; + +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; + +public class MarkdownConverter { + public static String convertToHtml(String markdown) { + Parser parser = Parser.builder().build(); + HtmlRenderer renderer = HtmlRenderer.builder().build(); + + Node document = parser.parse(markdown); + return renderer.render(document); + } +} diff --git a/clams-server/src/main/resources/public/css/post.css b/clams-server/src/main/resources/public/css/post.css index e905cbc..8c4b91d 100644 --- a/clams-server/src/main/resources/public/css/post.css +++ b/clams-server/src/main/resources/public/css/post.css @@ -17,22 +17,18 @@ margin-bottom: 1.5rem; } -.post-image { +.post-content p:has(img) { margin: 40px 0; text-align: center; } -.post-image img { - max-width: 100%; +.post-content img { + width: 100%; + max-width: 550px; height: auto; border: 1px solid var(--border-color); border-radius: 8px; -} - -.post-image figcaption { - margin-top: 10px; - font-size: 0.85rem; - opacity: 0.7; + display: inline-block; } .post-nav { diff --git a/clams-server/src/main/resources/templates/post.html b/clams-server/src/main/resources/templates/post.html index 40444b2..7e99e1f 100644 --- a/clams-server/src/main/resources/templates/post.html +++ b/clams-server/src/main/resources/templates/post.html @@ -14,8 +14,7 @@ {% endblock %} -- cgit v1.2.3