@@ 94,7 94,7 @@ end
-- @throws If the field is not one of the allowed types.
local function field(tbl, index, ...)
expect(1, tbl, "table")
- expect(2, index, "string")
+ expect(2, index, "string", "number")
local value = tbl[index]
local t = native_type(value)
@@ 1,12 1,44 @@
-- SPDX-License-Identifier: AGPL-3.0-only
+local function html_escape(s)
+ expect(1, s, "string")
+
+ s = string.gsub(s, "&", "&")
+ s = string.gsub(s, "<", "<")
+ s = string.gsub(s, ">", ">")
+ s = string.gsub(s, "'", "'")
+ s = string.gsub(s, "\"", """)
+
+ return s
+end
+
local function html(el, tbl)
expect(1, el, "string")
- expect(2, el, "table")
+ expect(2, tbl, "table")
+
+ innerHtml = ""
+ attributes = ""
for k, v in pairs(tbl) do
if type(k) == "string" then
- expect.field(tbl, k, "string", "table")
+ expect.field(tbl, k, "string")
+ attributes = attributes .. " " .. k .. "='" .. html_escape(v) .. "'"
end
end
+ for k, v in ipairs(tbl) do
+ expect.field(tbl, k, "string", "table")
+ if type(v) == "table" then v = html_escape(v[1]) end
+ innerHtml = innerHtml .. v
+ end
+
+ return string.format("<%s%s>%s</%s>", el, attributes, innerHtml, el)
end
+
+local function root(tbl)
+ return "<!DOCTYPE html>\n" .. html("html", tbl)
+end
+
+return setmetatable(
+ { root = root },
+ { __call = html,
+ __index = function (idx) return function(tbl) html(idx, tbl) end end })