From 5247c708f57342880873cb1fb9441666f3affa6e Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sat, 18 Apr 2026 22:45:17 -0500 Subject: [PATCH] finish beta pipeline for processing blog posts --- README.md | 5 ++ bin/blog-processor/src/html_formatter.zig | 4 +- bin/blog-processor/src/main.zig | 14 ++++-- bin/blog-processor/src/root.zig | 49 +++++++++++++++++-- posts/06-05-2026-language-checkpoint-april.md | 5 +- index.html => public/index.html | 0 styles.css => public/styles.css | 0 templates/index.html | 13 +++++ 8 files changed, 78 insertions(+), 12 deletions(-) rename index.html => public/index.html (100%) rename styles.css => public/styles.css (100%) create mode 100644 templates/index.html diff --git a/README.md b/README.md index 7515ba5..58352cc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ +# frustrated-functor.dev +My personal blog. +I write my entries in markdown files that I convert into HTML with a Zig program I built. + +The public assets are then deployed in a Dockerfile for ease and portability. ## Notes diff --git a/bin/blog-processor/src/html_formatter.zig b/bin/blog-processor/src/html_formatter.zig index 99644ba..95d6be3 100644 --- a/bin/blog-processor/src/html_formatter.zig +++ b/bin/blog-processor/src/html_formatter.zig @@ -6,11 +6,11 @@ const stdC = @cImport({ @cInclude("stdio.h"); }); -const Options = struct { +pub const Options = struct { template: ?[]const u8, }; -const HtmlFormatter = struct { +pub const HtmlFormatter = struct { buffer: std.ArrayList(u8), opts: Options, diff --git a/bin/blog-processor/src/main.zig b/bin/blog-processor/src/main.zig index a624fad..d9bb7b2 100644 --- a/bin/blog-processor/src/main.zig +++ b/bin/blog-processor/src/main.zig @@ -1,8 +1,14 @@ const std = @import("std"); const blog_processor = @import("blog_processor"); -pub fn main() !void { - const alloc = std.heap.page_allocator; - const arena = std.heap.ArenaAllocator.init(alloc); - _ = arena; +pub fn main(init: std.process.Init) !void { + var dirName: []const u8 = undefined; + var args_iter = std.process.Args.iterate(init.minimal.args); + _ = args_iter.next(); // Skip exec name + while (args_iter.next()) |arg| { + dirName = arg; + break; + } + + try blog_processor.processBlog(init.arena.allocator(), init.io, dirName); } diff --git a/bin/blog-processor/src/root.zig b/bin/blog-processor/src/root.zig index 49eabb0..6978da5 100644 --- a/bin/blog-processor/src/root.zig +++ b/bin/blog-processor/src/root.zig @@ -1,7 +1,50 @@ -// const std = @import("std"); +const std = @import("std"); -// const md_parser = @import("./markdown_parser.zig"); -// const html = @import("./html_formatter.zig"); +const md_parser = @import("./markdown_parser.zig"); +const html = @import("./html_formatter.zig"); + +pub fn processBlog(alloc: std.mem.Allocator, io: std.Io, dirName: []const u8) !void { + const dir = try std.Io.Dir.openDirAbsolute(io, dirName, .{ .iterate = true}); + defer dir.close(io); + + var iter = dir.iterate(); + while(try iter.next(io)) |entry| { + try processFile(alloc, dir, io, entry.name); + } +} + +fn processFile(alloc: std.mem.Allocator, dir: std.Io.Dir, io: std.Io, fileName: []const u8) !void { + if (!std.mem.eql(u8, ".md", std.fs.path.extension(fileName))) return; + + const postContents = try std.Io.Dir.readFileAlloc(dir, io, fileName, alloc, .unlimited); + + var mdDoc = try md_parser.MarkdownDoc.parse(postContents, alloc); + defer mdDoc.deinit(alloc); + + // TODO: Customize this via command line + const templateFile = "templates/index.html"; + const template = try std.Io.Dir.readFileAlloc( + std.Io.Dir.cwd(), io, templateFile, alloc, .unlimited); + var formatter = html.HtmlFormatter.init(.{ .template = template }); + defer formatter.deinit(alloc); + + const htmlOut = try formatter.format(alloc, mdDoc); + + // TODO: Change to file stem + const baseName = std.fs.path.basename(fileName); + const ext = ".html"; + const newFileName = try alloc.alloc(u8, baseName.len + ext.len); + defer alloc.free(newFileName); + + @memcpy(newFileName.ptr, baseName); + @memcpy(newFileName[baseName.len..].ptr, ext); + + // TODO: Put them in public directory + try std.Io.Dir.cwd().writeFile(io, .{ + .data = htmlOut, + .sub_path = newFileName, + }); +} test "all tests" { _ = @import("./markdown_parser.zig"); diff --git a/posts/06-05-2026-language-checkpoint-april.md b/posts/06-05-2026-language-checkpoint-april.md index 1796338..f52fe66 100644 --- a/posts/06-05-2026-language-checkpoint-april.md +++ b/posts/06-05-2026-language-checkpoint-april.md @@ -1,7 +1,6 @@ --- -title: Language Checkpoint - April -tags: language-learning -date: 6 April 2026 +title: Language Checkpoint April +summary: shit --- This is my April 2026 language checkpoint. diff --git a/index.html b/public/index.html similarity index 100% rename from index.html rename to public/index.html diff --git a/styles.css b/public/styles.css similarity index 100% rename from styles.css rename to public/styles.css diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..22e7489 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,13 @@ + + + + Alexander Goussas + + + + +
+ {body} +
+ + -- 2.43.0