authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-08-13 23:07:25 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2021-08-13 23:07:25 -07:00
logd20900446be9506c189a7a8912d229e0f5690aa7
tree02a5f2fb4c304e4b22ed16fd1a14132600c6d630
parent4ee83638fba28b550486a34e5570cb450375538c

properly close void and non-void html tags


1 files changed, 31 insertions(+), 1 deletions(-)

src/lib.zig+31-1
......@@ -39,7 +39,11 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype
3939 }
4040
4141 if (v.children.len == 0) {
42 try writer.writeAll(" />\n");
42 if (contains(std.meta.fieldNames(HtmlVoidElements), v.name)) {
43 try writer.writeAll(" />\n");
44 } else {
45 try writer.print("></{s}>\n", .{v.name});
46 }
4347 } else {
4448 try writer.writeAll(">");
4549
......@@ -179,3 +183,29 @@ fn entityLookupBefore(in: []const u8) ?htmlentities.Entity {
179183fn assertEqual(comptime a: usize, comptime b: usize) void {
180184 if (a != b) @compileError(std.fmt.comptimePrint("{d} != {d}", .{ a, b }));
181185}
186
187const HtmlVoidElements = enum {
188 area,
189 base,
190 br,
191 col,
192 embed,
193 hr,
194 img,
195 input,
196 link,
197 meta,
198 param,
199 source,
200 track,
201 wbr,
202};
203
204fn contains(haystack: []const []const u8, needle: []const u8) bool {
205 for (haystack) |v| {
206 if (std.mem.eql(u8, v, needle)) {
207 return true;
208 }
209 }
210 return false;
211}