diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2026-04-27 17:11:08 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2026-04-27 17:11:08 +0200 |
| commit | ef5c0341ca15f6862294802103b02992b29609e8 (patch) | |
| tree | 9b5a274a77d44053b8e53d249b2d59b754c9f673 /src/eval/html/Root.zig | |
| parent | 9f1a0bf3b0437770a7b62fd28a8748908c38dac4 (diff) | |
style(html): split elements in multiple files
Diffstat (limited to 'src/eval/html/Root.zig')
| -rw-r--r-- | src/eval/html/Root.zig | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/eval/html/Root.zig b/src/eval/html/Root.zig new file mode 100644 index 0000000..80c556a --- /dev/null +++ b/src/eval/html/Root.zig @@ -0,0 +1,54 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const Arena = std.heap.ArenaAllocator; +const List = std.ArrayList; +const Element = @import("Element.zig"); +const Error = Element.Error; + +content: List(Element), +arena: Arena, + +const Self = @This(); + +pub fn init(parent: Allocator) Error!*Self { + var s = Self{ + .content = undefined, + .arena = .init(parent), + }; + var alloc = s.arena.allocator(); + s.content = try .initCapacity(alloc, 2); + const v = try alloc.create(Self); + v.* = s; + return v; +} + +pub fn deinit(self: *Self) void { + self.arena.deinit(); +} + +pub fn element(self: *Self) Element { + return .{ .vtable = .{ .render = Self.render, }, .ptr = self }; +} + +pub fn allocator(self: *Self) Allocator { + return self.arena.allocator(); +} + +pub fn append(self: *Self, el: Element) Error!void { + try self.content.append(self.allocator(), el); +} + +fn render(context: *anyopaque, alloc: Allocator) Error![]const u8 { + const self: *Self = @ptrCast(@alignCast(context)); + if (self.content.items.len == 0) return ""; + var acc = try List(u8).initCapacity(alloc, self.content.items.len); + errdefer acc.deinit(alloc); + + var arena = Arena.init(alloc); + defer arena.deinit(); + for (self.content.items) |it| { + const res = try it.render(arena.allocator()); + try acc.appendSlice(alloc, res); + } + return acc.toOwnedSlice(alloc); +} |
