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 }