149 lines
2.7 KiB
Lua
149 lines
2.7 KiB
Lua
local M = {}
|
|
|
|
M.proto = "http"
|
|
M.__fes_banner_set = false
|
|
|
|
local function isHttp()
|
|
return M.proto == "http"
|
|
end
|
|
|
|
local function isGemini()
|
|
return M.proto == "gemini"
|
|
end
|
|
|
|
M.p = function(s)
|
|
s = s or ""
|
|
if isHttp() then
|
|
return "<p>" .. s .. "</p>"
|
|
elseif isGemini() then
|
|
return s
|
|
end
|
|
end
|
|
|
|
M.h = function(level, s)
|
|
level = tonumber(level) or 1
|
|
if level < 1 then level = 1 end
|
|
if level > 6 then level = 6 end
|
|
s = s or ""
|
|
if isHttp() then
|
|
return "<h" .. level .. ">" .. s .. "</h" .. level .. ">"
|
|
elseif isGemini() then
|
|
return string.rep("#", level) .. " " .. s
|
|
end
|
|
end
|
|
|
|
M.codeblock = function(s)
|
|
s = s or ""
|
|
if isHttp() then
|
|
return "<pre><code>" .. s .. "</code></pre>"
|
|
elseif isGemini() then
|
|
return "```\n" .. s .. "\n```"
|
|
end
|
|
end
|
|
|
|
M.inline = function(s)
|
|
s = s or ""
|
|
if isHttp() then
|
|
return "<code>" .. s .. "</code>"
|
|
elseif isGemini() then
|
|
return "`" .. s .. "`"
|
|
end
|
|
end
|
|
|
|
M.link = function(url, text)
|
|
url = url or ""
|
|
text = text or url
|
|
if isHttp() then
|
|
return "<a href=\"" .. url .. "\">" .. text .. "</a>"
|
|
elseif isGemini() then
|
|
return "=> " .. url .. " " .. text
|
|
end
|
|
end
|
|
|
|
M.list = function(items, ordered)
|
|
items = items or {}
|
|
if isHttp() then
|
|
local tag = ordered and "ol" or "ul"
|
|
local out = "<" .. tag .. ">"
|
|
for _, v in ipairs(items) do
|
|
out = out .. "<li>" .. v .. "</li>"
|
|
end
|
|
out = out .. "</" .. tag .. ">"
|
|
return out
|
|
elseif isGemini() then
|
|
local out = {}
|
|
for i, v in ipairs(items) do
|
|
if ordered then
|
|
table.insert(out, i .. ". " .. v)
|
|
else
|
|
table.insert(out, "* " .. v)
|
|
end
|
|
end
|
|
return table.concat(out, "\n")
|
|
end
|
|
end
|
|
|
|
M.blockquote = function(s)
|
|
s = s or ""
|
|
if isHttp() then
|
|
return "<blockquote>" .. s .. "</blockquote>"
|
|
elseif isGemini() then
|
|
return "> " .. s
|
|
end
|
|
end
|
|
|
|
M.rule = function()
|
|
if isHttp() then
|
|
return "<hr />"
|
|
elseif isGemini() then
|
|
return "---"
|
|
end
|
|
end
|
|
|
|
M.image = function(alt, src)
|
|
alt = alt or ""
|
|
src = src or ""
|
|
if isHttp() then
|
|
return "<img src=\"" .. src .. "\" alt=\"" .. alt .. "\" />"
|
|
elseif isGemini() then
|
|
return "=> " .. src .. " " .. alt
|
|
end
|
|
end
|
|
|
|
M.file = function(text, url)
|
|
text = text or ""
|
|
url = url or ""
|
|
if isHttp() then
|
|
return "<a href=\"" .. url .. "\" download>" .. text .. "</a>"
|
|
elseif isGemini() then
|
|
return "=> " .. url .. " " .. text
|
|
end
|
|
end
|
|
|
|
M.note = function(text)
|
|
text = text or ""
|
|
if isHttp() then
|
|
return "<div class=\"note\">" .. text .. "</div>"
|
|
elseif isGemini() then
|
|
return "\n\n" .. text .. "\n\n"
|
|
end
|
|
end
|
|
|
|
M.banner = function (text)
|
|
text = text or ""
|
|
|
|
if M.__fes_banner_set then
|
|
error("Page already contains header")
|
|
return ""
|
|
end
|
|
|
|
M.__fes_banner_set = true
|
|
if isHttp() then
|
|
return "<div class=\"banner\">" .. text .. "</div>"
|
|
elseif isGemini() then
|
|
return text .. "\n"
|
|
end
|
|
end
|
|
|
|
return M
|