From b8058ae8d08180b6bae9f1ec013592fe30704e28 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sun, 3 May 2026 15:31:42 -0500 Subject: [PATCH] feat: add rss formatter to turn markdown post into rss entry --- .gitignore | 1 + bin/blog-processor/src/root.zig | 1 + bin/blog-processor/src/rss_formatter.zig | 80 ++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 bin/blog-processor/src/rss_formatter.zig diff --git a/.gitignore b/.gitignore index f10c28b..0bfa928 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ zig-out .zig-cache !public/index.html public/*.html +sample.rss diff --git a/bin/blog-processor/src/root.zig b/bin/blog-processor/src/root.zig index 9270be5..8634ea0 100644 --- a/bin/blog-processor/src/root.zig +++ b/bin/blog-processor/src/root.zig @@ -52,4 +52,5 @@ test "all tests" { _ = @import("./markdown_parser.zig"); _ = @import("./html_formatter.zig"); _ = @import("./string_utils.zig"); + _ = @import("./rss_formatter.zig"); } diff --git a/bin/blog-processor/src/rss_formatter.zig b/bin/blog-processor/src/rss_formatter.zig new file mode 100644 index 0000000..a6fabfc --- /dev/null +++ b/bin/blog-processor/src/rss_formatter.zig @@ -0,0 +1,80 @@ +const std = @import("std"); + +const md = @import("./markdown_parser.zig"); + +pub const RssFormatter = struct { + buffer: std.ArrayList(u8), + alloc: std.mem.Allocator, + + /// Create a new RssFormatter that will use the provided allocator. + pub fn init(alloc: std.mem.Allocator) @This() { + return .{ + .buffer = .empty, + .alloc = alloc, + }; + } + + pub fn deinit(self: *@This()) void { + self.buffer.deinit(self.alloc); + } + + /// Format the provided + pub fn format(self: *@This(), doc: md.MarkdownDoc) ![] const u8 { + try self.buffer.appendSlice( + self.alloc, + \\ + \\goussasalexander@gmail.com (Alexander Goussas) + \\ + ); + + try self.buffer.appendSlice(self.alloc, doc.date); + try self.buffer.appendSlice( + self.alloc, + \\ + \\ + ); + + try self.buffer.appendSlice(self.alloc, doc.title); + try self.buffer.appendSlice( + self.alloc, + \\ + \\ + ); + + // TODO: Add link + // TODO: Add guid (same as link) + // TODO: Add a description + + return self.buffer.items; + } +}; + +test "rss formatter can format markdown document" { + const alloc = std.testing.allocator; + const doc = + \\--- + \\title: A post title + \\date: 12 april 2026 + \\--- + \\# A post title + \\Aujourd'hui, mamam est morte. + ; + + var formatter = RssFormatter.init(alloc); + defer formatter.deinit(); + + var mdDoc = try md.MarkdownDoc.parse(doc, alloc); + defer mdDoc.deinit(alloc); + + const result = try formatter.format(mdDoc); + + try std.testing.expectEqualStrings( + \\ + \\goussasalexander@gmail.com (Alexander Goussas) + \\12 april 2026 + \\A post title + \\ + , + result + ); +} -- 2.43.0