diff options
| -rw-r--r-- | src/eval/Element.zig | 4 | ||||
| -rw-r--r-- | src/eval/Root.zig | 2 | ||||
| -rw-r--r-- | src/eval/blocks.zig | 10 | ||||
| -rw-r--r-- | src/eval/html/Element.zig | 12 | ||||
| -rw-r--r-- | src/eval/html/Root.zig | 10 | ||||
| -rw-r--r-- | src/eval/list.zig | 2 | ||||
| -rw-r--r-- | src/paragraph.zig | 8 |
7 files changed, 25 insertions, 23 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(); } diff --git a/src/paragraph.zig b/src/paragraph.zig index 5b13cf2..f1fca67 100644 --- a/src/paragraph.zig +++ b/src/paragraph.zig @@ -50,19 +50,19 @@ fn doTestMath(parent: Allocator, t: []const u8, v: []const u8) !void { var p = try parse(alloc, &l); const g = try p.renderHTML(alloc); defer alloc.free(g); - try std.testing.expect(brk: { + try std.testing.expect(blk: { var g_iter = std.mem.splitSequence(u8, g, " "); var v_iter = std.mem.splitSequence(u8, v, " "); while (g_iter.next()) |g_it| { - const v_it = v_iter.next() orelse break :brk false; + const v_it = v_iter.next() orelse break :blk false; if ((std.mem.startsWith(u8, g_it, "xlink:href=") and std.mem.startsWith(u8, g_it, "xlink:href")) or (std.mem.startsWith(u8, g_it, "id=") and std.mem.startsWith(u8, v_it, "id="))) continue; if (!std.mem.eql(u8, g_it, v_it)) { std.debug.print("not the same: {s} vs {s}", .{ g_it, v_it }); - break :brk false; + break :blk false; } } - break :brk v_iter.next() == null; + break :blk v_iter.next() == null; }); } |
