diff options
| author | Rosa <rosaontheweb@proton.me> | 2026-05-18 22:00:32 -0400 |
|---|---|---|
| committer | Rosa <rosaontheweb@proton.me> | 2026-05-18 22:00:32 -0400 |
| commit | 7e2c764b24505e0f74e970d627f052899b94e374 (patch) | |
| tree | c2ae3c412002d4f8e66fc7700fa839d5df4d7fd5 /util/generate_html.zig | |
| parent | 1f0749100b22c17272b4d294e1db3034097b57ea (diff) | |
continue work on website build system
Diffstat (limited to 'util/generate_html.zig')
| -rw-r--r-- | util/generate_html.zig | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/util/generate_html.zig b/util/generate_html.zig index f1329ca..928c190 100644 --- a/util/generate_html.zig +++ b/util/generate_html.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const pages = @import("pages.zig"); +const pages = @import("pages.zig").pages; pub fn main(init: std.process.Init) !void { const sources_dir = try std.Io.Dir.cwd().createDirPathOpen(init.io, "src", .{}); @@ -9,29 +9,59 @@ pub fn main(init: std.process.Init) !void { const templates_dir = try sources_dir.createDirPathOpen(init.io, "templates", .{ .open_options = .{ .iterate = true } }); defer templates_dir.close(init.io); - const pages_dir = try sources_dir.createDirPathOpen(init.io, "pages", .{ .open_options = .{ .iterate = true } }); defer pages_dir.close(init.io); + try generateHtmlPages(init.io, init.arena.allocator(), templates_dir, pages_dir, out_dir); const static_dir = try sources_dir.createDirPathOpen(init.io, "static", .{ .open_options = .{ .iterate = true } }); defer static_dir.close(init.io); - try copyStaticFiles(init.io, init.gpa, static_dir, out_dir); + try copyStaticFiles(init.io, init.arena.allocator(), static_dir, out_dir); } -fn copyStaticFiles(io: std.Io, ally: std.mem.Allocator, sources: std.Io.Dir, out: std.Io.Dir) !void { - var walker = try sources.walk(ally); +fn generateHtmlPages(io: std.Io, ally: std.mem.Allocator, templates_dir: std.Io.Dir, pages_dir: std.Io.Dir, out_dir: std.Io.Dir) !void { + for (pages) |page_def| { + const template = try templates_dir.openFile(io, page_def.template_path, .{}); + defer template.close(io); + const template_buf = try ally.alloc(u8, (try template.stat(io)).size); + _ = try template.readPositionalAll(io, template_buf, 0); + + const page = try pages_dir.openFile(io, page_def.source_path, .{}); + defer page.close(io); + const page_buf = try ally.alloc(u8, (try page.stat(io)).size); + _ = try page.readPositionalAll(io, page_buf, 0); + + var out_buf: []u8 = template_buf; + for (page_def.replacements) |replacement| { + switch (replacement.replacement) { + .file_content => { + out_buf = try std.mem.replaceOwned(u8, ally, out_buf, replacement.placeholder, page_buf); + }, + .literal => |value| { + out_buf = try std.mem.replaceOwned(u8, ally, out_buf, replacement.placeholder, value); + }, + } + } + + const out = try out_dir.createFile(io, page_def.source_path, .{}); + defer out.close(io); + std.debug.print("Writing page {s}...\n", .{page_def.source_path}); + try out.writeStreamingAll(io, out_buf); + } +} + +fn copyStaticFiles(io: std.Io, ally: std.mem.Allocator, sources_dir: std.Io.Dir, out_dir: std.Io.Dir) !void { + var walker = try sources_dir.walk(ally); defer walker.deinit(); while (try walker.next(io)) |entry| { switch (entry.kind) { .file, .sym_link => { std.debug.print("Copying static file {s}...\n", .{entry.path}); - try entry.dir.copyFile(entry.basename, out, entry.basename, io, .{}); + try entry.dir.copyFile(entry.basename, out_dir, entry.basename, io, .{}); }, - .directory => { - const new_out = try out.createDirPathOpen(io, entry.basename, .{ .open_options = .{ .iterate = true } }); + const new_out = try out_dir.createDirPathOpen(io, entry.basename, .{ .open_options = .{ .iterate = true } }); defer new_out.close(io); - try copyStaticFiles(io, ally, sources, out); + try copyStaticFiles(io, ally, sources_dir, out_dir); }, else => {}, |
