aboutsummaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2026-04-30 17:25:04 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2026-04-30 17:25:04 +0200
commit103efd52b59f77fbfde6a1b7daf65b16c2c26810 (patch)
tree722f7be1ea5ffc36fb5d17aab0fb64cb6cb28665 /src/eval
parent987bd9323a384e8f042311262d9b0e0eba38da15 (diff)
refactor(html): supports more type in root append
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/Element.zig4
-rw-r--r--src/eval/Root.zig2
-rw-r--r--src/eval/blocks.zig10
-rw-r--r--src/eval/html/Element.zig12
-rw-r--r--src/eval/html/Root.zig10
-rw-r--r--src/eval/list.zig2
6 files changed, 21 insertions, 19 deletions
diff --git a/src/eval/Element.zig b/src/eval/Element.zig
index 16905b4..228e36c 100644
--- a/src/eval/Element.zig
+++ b/src/eval/Element.zig
@@ -13,10 +13,6 @@ pub const Callout = blocks.Callout;
pub const Quote = blocks.Quote;
pub const Math = @import("math.zig");
-comptime {
- _ = Math;
-}
-
pub const Node = struct {
ptr: *anyopaque,
vtable: struct { element: *const fn (*anyopaque) Element },
diff --git a/src/eval/Root.zig b/src/eval/Root.zig
index d4ccf30..1f2b61b 100644
--- a/src/eval/Root.zig
+++ b/src/eval/Root.zig
@@ -57,6 +57,6 @@ fn html(context: *anyopaque, alloc: Allocator) HTML.Error!HTML {
const self: *Self = @ptrCast(@alignCast(context));
const el = try HTML.Root.init(alloc);
var v = self.content.first;
- while (v) |it| : (v = it.next) el.append(try Node.from(it).element().html(el.allocator()));
+ while (v) |it| : (v = it.next) try el.append(Node.from(it).element());
return el.element();
}
diff --git a/src/eval/blocks.zig b/src/eval/blocks.zig
index a270ec9..9357799 100644
--- a/src/eval/blocks.zig
+++ b/src/eval/blocks.zig
@@ -44,7 +44,7 @@ pub const Code = struct {
if (self.attribute) |attr| try el.base.setAttribute("data-code", attr);
var code = try HTML.Content.init(alloc, "code");
var root = try HTML.Root.init(alloc);
- for (self.content.items) |it| root.append(try it.html(root.allocator()));
+ for (self.content.items) |it| try root.append(it);
code.content = root.element();
el.content = code.element();
return el.element();
@@ -87,12 +87,12 @@ pub const Figure = struct {
var el = try HTML.Content.init(parent, "figure");
var root = try HTML.Root.init(parent);
const alloc = root.allocator();
- root.append(try self.content.html(alloc));
+ try root.append(self.content);
el.content = root.element();
const caption = self.caption orelse return el.element();
var figcap = try HTML.Content.init(alloc, "figcaption");
figcap.content = try caption.html(alloc);
- root.append(figcap.element());
+ try root.append(figcap.element());
return el.element();
}
};
@@ -138,8 +138,8 @@ pub const Callout = struct {
const root = try HTML.Root.init(alloc);
const title = try HTML.Content.init(alloc, "h4");
title.content = (try HTML.Literal.init(alloc, self.title orelse kind)).element();
- root.append(title.element());
- root.append(try self.content.html(alloc));
+ try root.append(title.element());
+ try root.append(self.content);
el.content = root.element();
return el.element();
}
diff --git a/src/eval/html/Element.zig b/src/eval/html/Element.zig
index c44f4ef..c6197b8 100644
--- a/src/eval/html/Element.zig
+++ b/src/eval/html/Element.zig
@@ -45,9 +45,9 @@ pub const Node = struct {
vtable: struct { element: *const fn (*anyopaque) Element },
node: std.DoublyLinkedList.Node = .{},
- pub fn from(n: *std.DoublyLinkedList.Node) *Node {
- const v: *Node = @fieldParentPtr("node", n);
- return v;
+ pub fn from(n: *std.DoublyLinkedList.Node) Element {
+ const self: *Node = @fieldParentPtr("node", n);
+ return self.vtable.element(self.ptr);
}
pub fn element(self: Node) Element {
@@ -106,7 +106,7 @@ test "content" {
p.content = root.element();
var content = try Literal.init(alloc, "hello world");
- root.append(content.element());
+ try root.append(content.element());
try doTest(alloc, content.element(), "hello world");
try doTest(alloc, p.element(), "<p>hello world</p>");
@@ -115,8 +115,8 @@ test "content" {
var rootDiv = try Root.init(alloc);
div.content = rootDiv.element();
try div.base.appendClass("foo-bar");
- rootDiv.append(p.element());
- rootDiv.append((try Void.init(alloc, "br")).element());
+ try rootDiv.append(p.element());
+ try rootDiv.append((try Void.init(alloc, "br")).element());
try doTest(alloc, div.element(), "<div class=\"foo-bar\"><p>hello world</p><br></div>");
}
diff --git a/src/eval/html/Root.zig b/src/eval/html/Root.zig
index 83859d4..acfe82e 100644
--- a/src/eval/html/Root.zig
+++ b/src/eval/html/Root.zig
@@ -35,7 +35,13 @@ pub fn allocator(self: *Self) Allocator {
return self.arena.allocator();
}
-pub fn append(self: *Self, el: Element) void {
+pub fn append(self: *Self, raw: anytype) Error!void {
+ const el: Element = blk: {
+ const T = @TypeOf(raw);
+ if (T == Element) break :blk raw;
+ if (@hasDecl(T, "html")) break :blk try raw.html(self.allocator());
+ @compileError("cannot convert " ++ @typeName(T) ++ " into " ++ @typeName(Element));
+ };
self.content.append(&el.node().node);
}
@@ -52,6 +58,6 @@ pub fn render(self: *Self, alloc: Allocator) Error![]const u8 {
var arena = Arena.init(alloc);
defer arena.deinit();
var v = self.content.first;
- while (v) |it| : (v = it.next) try acc.appendSlice(alloc, try Node.from(it).element().render(arena.allocator()));
+ while (v) |it| : (v = it.next) try acc.appendSlice(alloc, try Node.from(it).render(arena.allocator()));
return acc.toOwnedSlice(alloc);
}
diff --git a/src/eval/list.zig b/src/eval/list.zig
index 1a7949c..160bde2 100644
--- a/src/eval/list.zig
+++ b/src/eval/list.zig
@@ -45,7 +45,7 @@ fn List(comptime tag: []const u8) type {
for (self.content.items) |it| {
var li = try HTML.Content.init(root.allocator(), "li");
li.content = try it.html(root.allocator());
- root.append(li.element());
+ try root.append(li.element());
}
return el.element();
}