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 }