From ef5c0341ca15f6862294802103b02992b29609e8 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 27 Apr 2026 17:11:08 +0200 Subject: style(html): split elements in multiple files --- src/eval/html/Root.zig | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/eval/html/Root.zig (limited to 'src/eval/html/Root.zig') 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); +} -- cgit v1.2.3