模块:TemplateDemo:修订间差异

来自「荏苒之境」
无编辑摘要
无编辑摘要
 
(未显示同一用户的40个中间版本)
第1行: 第1行:
local utils_str = require("Module:Utils/String")
local utils_str = require("Module:Utils/String")
local template_data = require("Module:TemplateData")


local html = mw.html
local html = mw.html
第5行: 第6行:
local template_demo = {}
local template_demo = {}


local function parse_template_data(title)
local function append_argument(frame, t, k, v, newline, last_num_param)
local content = mw.title.new(title).content
local raw = utils_str.match_xml_noattr(content, "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_argument(t, k, v, last_num_param)
local k_num = tonumber(k)
local k_num = tonumber(k)
if k_num ~= nil then
if k_num == 1 then
if k_num == 1 then
return 1
k = nil
else
k = tostring(k_num - 1)
v = utils_str.trim(v)
end
end
end
if k ~= nil then
if newline then
t[#t+1] = "| "
t[#t+1] = "| "
if k_num == nil or last_num_param ~= k_num - 1 then
else
t[#t+1] = k
t[#t+1] = "|"
end
if k_num == nil or last_num_param ~= k_num - 1 then
t[#t+1] = k_num and tostring(k_num - 1) or k
if newline then
t[#t+1] = " = "
t[#t+1] = " = "
else
t[#t+1] = "="
end
end
t[#t+1] = v
end
t[#t+1] = utils_str.sub_xml_noattr(utils_str.trim(v), "call", "{{%1}}")
if newline then
t[#t+1] = "\n"
t[#t+1] = "\n"
end
end
第46行: 第40行:
end
end
local template_data = parse_template_data("Template:"..template_name)
local tdata = template_data.parse("Template:"..template_name)
local newline = not (tdata ~= nil and tdata.format == "inline")
local args = frame:getParent().args
local args = frame:getParent().args
local t = {"{{", utils_str.trim(template_name), "\n"}
local t = {"{{", utils_str.trim(template_name)}
local last_num_param = 1
local last_num_param = 1
if template_data ~= nil and type(template_data.paramOrder) == "table" then
if newline then
local order = template_data.paramOrder
t[#t+1] = "\n"
end
if tdata ~= nil and type(tdata.paramOrder) == "table" then
local order = tdata.paramOrder
local appended = {}
local appended = {}
for i = 1, #order do
for i = 1, #order do
第61行: 第60行:
local v = args[k]
local v = args[k]
if v ~= nil then
if v ~= nil then
last_num_param = append_argument(t, k, v, last_num_param)
last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
end
end
appended[k] = true
appended[k] = true
第67行: 第66行:
for k, v in pairs(args) do
for k, v in pairs(args) do
if appended[k] == nil then
if appended[k] == nil then
last_num_param = append_argument(t, k, v, last_num_param)
last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
end
end
end
end
else
else
for k, v in pairs(args) do
for k, v in pairs(args) do
last_num_param = append_argument(t, k, v, last_num_param)
last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
end
end
end
end
t[#t+1] = "}}"
if not newline or #t ~= 3 then
t[#t+1] = "}}"
else
t[#t] = "}}"
end
local source = table.concat(t)
local source = table.concat(t)
return frame:expandTemplate(
return frame:preprocess(source).."\n\n示例代码:\n\n"..
source.."\n\n示例代码:\n<syntaxhighlight lang=\"wikitext\">"..source.."\n</syntaxhighlight>")
frame:extensionTag("syntaxhighlight", source, { lang = "wikitext" })
end
end


return template_demo
return template_demo

2025年8月16日 (六) 16:13的最新版本

此模块的文档可以在模块:TemplateDemo/doc创建

local utils_str = require("Module:Utils/String")
local template_data = require("Module:TemplateData")

local html = mw.html

local template_demo = {}

local function append_argument(frame, t, k, v, newline, last_num_param)
	local k_num = tonumber(k)
	if k_num == 1 then
		return 1
	end
	if newline then
		t[#t+1] = "| "
	else
		t[#t+1] = "|"
	end
	if k_num == nil or last_num_param ~= k_num - 1 then
		t[#t+1] = k_num and tostring(k_num - 1) or k
		if newline then
			t[#t+1] = " = "
		else
			t[#t+1] = "="
		end
	end
	t[#t+1] = utils_str.sub_xml_noattr(utils_str.trim(v), "call", "{{%1}}")
	if newline then
		t[#t+1] = "\n"
	end
	return k_num
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 tdata = template_data.parse("Template:"..template_name)
	local newline = not (tdata ~= nil and tdata.format == "inline")
	local args = frame:getParent().args
	
	local t = {"{{", utils_str.trim(template_name)}
	local last_num_param = 1
	
	if newline then
		t[#t+1] = "\n"
	end
	
	if tdata ~= nil and type(tdata.paramOrder) == "table" then
		local order = tdata.paramOrder
		local appended = {}
		for i = 1, #order do
			local k = order[i]
			local k_num = tonumber(k)
			k = k_num and k_num + 1 or k
			local v = args[k]
			if v ~= nil then
				last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
			end
			appended[k] = true
		end
		for k, v in pairs(args) do
			if appended[k] == nil then
				last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
			end
		end
	else
		for k, v in pairs(args) do
			last_num_param = append_argument(frame, t, k, v, newline, last_num_param)
		end
	end
	
	if not newline or #t ~= 3 then
		t[#t+1] = "}}"
	else
		t[#t] = "}}"
	end
	
	local source = table.concat(t)
	return frame:preprocess(source).."\n\n示例代码:\n\n"..
		frame:extensionTag("syntaxhighlight", source, { lang = "wikitext" })
end

return template_demo