aboutsummaryrefslogtreecommitdiff
path: root/src/eval/html/Content.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/html/Content.zig')
-rw-r--r--src/eval/html/Content.zig51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/eval/html/Content.zig b/src/eval/html/Content.zig
new file mode 100644
index 0000000..f21bcf3
--- /dev/null
+++ b/src/eval/html/Content.zig
@@ -0,0 +1,51 @@
+const std = @import("std");
+const Allocator = std.mem.Allocator;
+const List = std.ArrayList;
+const Element = @import("Element.zig");
+const Error = Element.Error;
+
+base: Element.Void,
+content: List(Element),
+
+pub const Self = @This();
+
+pub fn init(alloc: Allocator, tag: []const u8) Error!*Self {
+ const v = try alloc.create(Self);
+ v.* = .{
+ .base = .{
+ .alloc = alloc,
+ .tag = tag,
+ .attributes = .init(alloc),
+ .class_list = .init(alloc),
+ },
+ .content = try .initCapacity(alloc, 2),
+ };
+ return v;
+}
+
+pub fn element(self: *Self) Element {
+ return .{ .vtable = .{ .render = Self.render }, .ptr = self };
+}
+
+pub fn append(self: *Self, content: Element) Error!void {
+ return self.content.append(self.base.alloc, content);
+}
+
+fn render(context: *anyopaque, alloc: Allocator) Error![]const u8 {
+ const self: *Self = @ptrCast(@alignCast(context));
+ var base = self.base;
+ const b = try base.element().render(alloc);
+ defer alloc.free(b);
+ var acc = try List(u8).initCapacity(alloc, b.len + self.content.items.len);
+ try acc.appendSlice(alloc, b);
+ for (self.content.items) |it| {
+ var v = it;
+ const sub = try v.render(alloc);
+ defer alloc.free(sub);
+ try acc.appendSlice(alloc, sub);
+ }
+ try acc.appendSlice(alloc, "</");
+ try acc.appendSlice(alloc, base.tag);
+ try acc.append(alloc, '>');
+ return acc.toOwnedSlice(alloc);
+}