diff --git a/src/fragment.zig b/src/fragment.zig index 323ebe3..080a54a 100644 --- a/src/fragment.zig +++ b/src/fragment.zig @@ -28,6 +28,7 @@ const VOID_ELEMENTS = [_][]const u8{ const ElementConfig = struct { close: bool = true, empty: bool = false, + raw: bool = false, pub fn default(ntype: ?[]const u8) @This() { const name = ntype orelse return .{}; @@ -113,7 +114,7 @@ fn elem(l: *Lua, w: *std.Io.Writer) Error!void { if (name != null) try w.writeByte('>'); // children - try writeChildren(l, w); + try writeChildren(l, w, config); l.pop(1); // close @@ -175,7 +176,7 @@ fn writeProps(l: *Lua, w: *std.Io.Writer) !void { } } -fn writeChildren(l: *Lua, w: *std.Io.Writer) !void { +fn writeChildren(l: *Lua, w: *std.Io.Writer, config: ElementConfig) !void { var arena: std.heap.ArenaAllocator = .init(maivi.allocator); defer arena.deinit(); var allocator = arena.allocator(); @@ -198,16 +199,20 @@ fn writeChildren(l: *Lua, w: *std.Io.Writer) !void { _ = try display.elem(l); // stack now contains: -1 => value (parsed); -2 => value; -3 => key; -4 => table - // uses -1 => value (parsed) - _ = try str.escape(l); - // stack now contains: -1 => value (escaped); -2 => value (parsed); -3 => value; -4 => key; -5 => table + if (!config.raw) { + // uses -1 => value (parsed) + _ = try str.escape(l); + // stack now contains: -1 => value (escaped); -2 => value (parsed); -3 => value; -4 => key; -5 => table + } const vz = try l.toString(-1); const v = try allocator.dupe(u8, vz); - try w.writeAll(v); + if (!config.raw) + l.pop(1); // pop escaped + l.pop(1); // pop parsed - l.pop(2); // pop parsed + escaped + try w.writeAll(v); } else { // uses -1 => value try elem(l, w); diff --git a/src/lua/runtime/h.lua b/src/lua/runtime/h.lua index d83169a..ed1acff 100644 --- a/src/lua/runtime/h.lua +++ b/src/lua/runtime/h.lua @@ -3,8 +3,10 @@ local h = {} h.document = maivi.elem("!DOCTYPE html", { close = false }) +h.raw = maivi.elem(nil, { raw = true }) h.comment = function(str) - return string.format("", str) + str = maivi.str.escape(str) + return h.raw(string.format("", str)) end -- svg