模块:TemplateDemo
来自「荏苒之境」
此模块的文档可以在模块:TemplateDemo/doc创建
local html = mw.html
local template_demo = {}
local function trim(str)
return string.gsub(str, "^%s*(.-)%s*$", "%1")
end
local function parse_template_data(title)
local content = mw.title.new(title).content
local raw = string.match(content, "<templatedata>(.-)</templatedata>")
if raw == nil then
return nil
end
local succ, res = pcall(mw.text.jsonDecode, raw)
return succ and res or nil
end
local function append_template_argument(t, k, v)
local num = tonumber(k)
if num ~= nil then
if num == 1 then
k = nil
else
k = tostring(num - 1)
end
end
if k ~= nil then
t[#t+1] = "| "
t[#t+1] = k
t[#t+1] = " = "
t[#t+1] = v
t[#t+1] = "\n"
end
end
template_demo.show = function(frame)
local args = frame.args
local template_name = args[1]
if template_name == nil or template_name == '' then
return html.create("p"):addClass("error")
:wikitext("没有指定模板名!")
end
local parent_frame = frame:getParent()
local template_data = parse_template_data(parent_frame:getParent():getTitle())
local args = parent_frame.args
local t = {"{{", trim(template_name), "\n"}
if template_data ~= nil and type(template_data.paramOrder) == "table" then
local order = template_data.paramOrder
for i = 1, #order do
local k = paramOrder[i]
local v = args[k]
if v ~= nil then
append_template_argument(t, k, v)
end
end
else
for k, v in pairs(args) do
append_template_argument(t, k, v)
end
end
t[#t+1] = "}}"
local source = table.concat(t)
local result = frame:preprocess(source)
return parent_frame:getTitle()..result.."示例:\n<pre>"..source.."\n</pre>"
end
return template_demo