aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dom/Element.zig27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/dom/Element.zig b/src/dom/Element.zig
index 5b6c685..3ab7789 100644
--- a/src/dom/Element.zig
+++ b/src/dom/Element.zig
@@ -48,7 +48,7 @@ pub fn deinit(self: *Self) void {
self.content.deinit(self.alloc);
}
-pub fn render(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
+pub fn render(self: *Self, alloc: Allocator) !std.ArrayList(u8) {
var attr = try self.renderAttribute(alloc);
defer attr.deinit(alloc);
var acc = try std.ArrayList(u8).initCapacity(alloc, 2);
@@ -63,7 +63,8 @@ pub fn render(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
.void => return acc,
.content => {
for (self.content.items) |it| {
- var sub = try it.render(alloc);
+ var v = it;
+ var sub = try v.render(alloc);
defer sub.deinit(alloc);
try acc.appendSlice(alloc, sub.items);
}
@@ -78,7 +79,10 @@ pub fn render(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
return acc;
}
-fn renderAttribute(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
+fn renderAttribute(self: *Self, alloc: Allocator) !std.ArrayList(u8) {
+ var class = try self.renderClass(alloc);
+ defer class.deinit(alloc);
+ if (class.items.len > 0) try self.setAttribute("class", class.items);
var iter = self.attributes.iterator();
if (iter.len == 0) return .empty;
var acc = try std.ArrayList(u8).initCapacity(alloc, 2);
@@ -96,6 +100,19 @@ fn renderAttribute(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
return acc;
}
+fn renderClass(self: *const Self, alloc: Allocator) !std.ArrayList(u8) {
+ var iter = self.class_list.iterator();
+ if (iter.len == 0) return .empty;
+ var acc = try std.ArrayList(u8).initCapacity(alloc, 2);
+ errdefer acc.deinit(alloc);
+ var i: usize = 0;
+ while (iter.next()) |it| : (i += 1) {
+ try acc.appendSlice(alloc, it.*);
+ if (i < self.class_list.count() - 1) try acc.append(alloc, ' ');
+ }
+ return acc;
+}
+
pub fn setAttribute(self: *Self, k: []const u8, v: []const u8) !void {
try self.attributes.put(k, v);
}
@@ -178,12 +195,14 @@ test "content element" {
var p_managed = try initParagraph(alloc, "hello world");
defer p_managed.deinit();
+
try doTest(alloc, &p_managed, "<p>hello world</p>");
var div = init(alloc, .content, "div");
defer div.deinit();
- try div.setAttribute("class", "foo-bar");
+ try div.class_list.insert("foo-bar");
try div.appendContent(try initParagraph(alloc, "hello world"));
try div.appendContent(try initImg(alloc, "example.org", "example"));
+
try doTest(alloc, &div, "<div class=\"foo-bar\"><p>hello world</p><img src=\"example.org\" alt=\"example\"></div>");
}