lib/zen/src/theme/value.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const model = @import("model.zig");
 3 
 4 pub const Encoding = enum {
 5     raw,
 6     escaped,
 7 };
 8 
 9 pub const Value = struct {
10     text: []const u8,
11     encoding: Encoding,
12 };
13 
14 pub fn resolve(active: model.Theme, page: model.Page, key: []const u8) error{
15     UnknownInclude,
16     UnknownPlaceholder,
17 }!Value {
18     if (std.mem.eql(u8, key, "content")) return raw(page.content);
19     if (std.mem.eql(u8, key, "title")) return escaped(page.title);
20     if (std.mem.eql(u8, key, "description")) return escaped(page.description);
21     if (std.mem.eql(u8, key, "site.title")) return escaped(active.site_title);
22     if (std.mem.eql(u8, key, "language")) return escaped(active.language);
23     if (std.mem.eql(u8, key, "path")) return escaped(page.path);
24     if (std.mem.eql(u8, key, "style.path")) return escaped(active.style_path);
25     if (std.mem.startsWith(u8, key, "include.")) {
26         const name = key["include.".len..];
27         for (active.includes) |include| {
28             if (std.mem.eql(u8, include.name, name)) return raw(include.html);
29         }
30         return error.UnknownInclude;
31     }
32     if (std.mem.startsWith(u8, key, "meta.")) {
33         const text = page.metadata.get(key["meta.".len..]) orelse "";
34         return escaped(text);
35     }
36     return error.UnknownPlaceholder;
37 }
38 
39 fn raw(text: []const u8) Value {
40     return .{ .text = text, .encoding = .raw };
41 }
42 
43 fn escaped(text: []const u8) Value {
44     return .{ .text = text, .encoding = .escaped };
45 }