diff options
| -rw-r--r-- | src/pages/index.html | 1 | ||||
| -rw-r--r-- | src/templates/base.html (renamed from src/index.html) | 6 | ||||
| -rw-r--r-- | util/generate_html.zig | 48 | ||||
| -rw-r--r-- | util/pages.zig | 33 |
4 files changed, 65 insertions, 23 deletions
diff --git a/src/pages/index.html b/src/pages/index.html new file mode 100644 index 0000000..c69a23e --- /dev/null +++ b/src/pages/index.html @@ -0,0 +1 @@ +<p>blah</p> diff --git a/src/index.html b/src/templates/base.html index 3d2c0cd..0da5dd2 100644 --- a/src/index.html +++ b/src/templates/base.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html lang="en"> <head> - <title>the evil transgenders club</title> + <title>{{title}} - the evil transgenders club</title> <style> :root { --trans-blue: #5bcefa; @@ -20,7 +20,7 @@ } .trans-shadow { - text-shadow: 1px 1px var(--trans-pink), 2px 2px #fff, 3px 3px var(--trans-pink), 4px 4px var(--trans-blue); + text-shadow: 1px 1px var(--trans-pink), 2px 2px white, 3px 3px var(--trans-pink), 4px 4px var(--trans-blue); } .subtitle { @@ -45,7 +45,7 @@ <body> <header> <h1 class="trans-shadow">the evil transgenders club</h1> - <p class="subtitle">soon...</p> </header> + {{body}} </body> </html> 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 => {}, diff --git a/util/pages.zig b/util/pages.zig index 13d62a1..1881aff 100644 --- a/util/pages.zig +++ b/util/pages.zig @@ -1,16 +1,27 @@ const std = @import("std"); -pub const Template = struct { - file: std.Io.File, +pub const pages = [_]Page{Page{ + .source_path = "index.html", + .template_path = "base.html", + .replacements = &[_]Replacement{ Replacement{ + .placeholder = "{{title}}", + .replacement = .{ .literal = "home" }, + }, Replacement{ + .placeholder = "{{body}}", + .replacement = .{ .file_content = {} }, + } }, +}}; - pub fn init(io: std.Io, dir: std.Io.Dir, sub_path: []const u8) !@This() { - const file = try dir.openFile(io, sub_path, .{}); - return .{ .file = file }; - } +const Page = struct { + source_path: []const u8, + template_path: []const u8, + replacements: []const Replacement, +}; - pub fn replacePlaceholder(template: *Template, key: []const u8, content: []u8) void { - _ = template; - _ = key; - _ = content; - } +const Replacement = struct { + placeholder: []const u8, + replacement: union(enum) { + file_content, + literal: []const u8, + }, }; |
