lib/zen/src/theme/fill.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const html = @import("../root.zig").html;
3 const model = @import("model.zig");
4 const scan = @import("scan.zig");
5 const storage_mod = @import("storage.zig");
6 const value = @import("value.zig");
7
8 pub fn renderPage(
9 storage: *storage_mod.Storage,
10 active: model.Theme,
11 page: model.Page,
12 ) model.Error![]u8 {
13 const regions = try storage.acquire(active, page);
14 errdefer storage.reset();
15 var output_index: usize = 0;
16 var iterator = scan.Iterator.init(active.layout);
17 while (try iterator.next()) |event| switch (event) {
18 .literal => |literal| copy(regions.output, &output_index, literal),
19 .placeholder => |key| {
20 const resolved = try value.resolve(active, page, key);
21 switch (resolved.encoding) {
22 .raw => copy(regions.output, &output_index, resolved.text),
23 .escaped => {
24 const written = html.writeEscaped(regions.output[output_index..], resolved.text);
25 output_index += written.len;
26 },
27 }
28 },
29 };
30 std.debug.assert(output_index == regions.plan.output_bytes);
31 return regions.output[0..output_index];
32 }
33
34 fn copy(output: []u8, index: *usize, source: []const u8) void {
35 @memcpy(output[index.*..][0..source.len], source);
36 index.* += source.len;
37 }