~aleteoryx/lfm_embed

d7727c21586734f19d016fc84f94eaf0764eda34 — alyx 5 months ago 21ffaa0
html.lua functional
2 files changed, 35 insertions(+), 3 deletions(-)

M src/theming/lua-lib/expect.lua
M src/theming/lua-lib/html.lua
M src/theming/lua-lib/expect.lua => src/theming/lua-lib/expect.lua +1 -1
@@ 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)

M src/theming/lua-lib/html.lua => src/theming/lua-lib/html.lua +34 -2
@@ 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, "<", "&lt;")
  s = string.gsub(s, ">", "&gt;")
  s = string.gsub(s, "'", "&#39;")
  s = string.gsub(s, "\"", "&quot;")

  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 })