模块:TemplateArgPassingTool
外观
函数说明
passArgs
呼叫模板,并将外层模板收到的参数,全数传递进内层模板。
- 使用方法:
{{#invoke:TemplateArgPassingTool|passArgs|template_name=<模板名称>}}
- 例如在模板内输入
{{#invoke:TemplateArgPassingTool|passArgs|template_name=P2}}
- 调用模板
{{<模板名称>| 第一参数 | 第二参数 }}
→“第二参数” - 对比直接调用
{{P2 | 第一参数 | 第二参数 }}
→“ 第二参数 ”
- 例如在模板内输入
passEscapeArgs
呼叫模板,并将外层模板收到的参数全数进行html字符跳脱处理,并传递进内层模板。适合用于呼叫可能会有放入网页标签内之内容的模板,来避免网页标签损坏。
- 使用方法:
{{#invoke:TemplateArgPassingTool|passEscapeArgs|template_name=<模板名称>}}
- 例如,直接调用{{Anchor}}内容输入2i的话:
{{Anchor|{{math|2''i''}}}}
→“<span class="anchor" id="2i">”(网页span标签损坏)- 输出内容为
<span class="anchor" id="<span class="serif"><span class="texhtml" >2''i''</span></span>"></span>
- 如果使用passEscapeArgs函数:
{{#invoke:TemplateArgPassingTool|passEscapeArgs|template_name=Anchor|{{math|2''i''}}}}
→“”(网页span标签正常)- 输出内容为
<span class="anchor" id="'"`UNIQ--templatestyles-00000011-QINU`"'<span class="serif"><span class="texhtml" >2''i''</span></span>"></span>
- 例如,直接调用{{Anchor}}内容输入2i的话:
passNArgs
呼叫模板,但跳过N个参数,例如跳过1个参数表示模板外层参数的第1参数被跳过、第2参数变成第1参数、第3参数变成第2参数,以此类推。
- 使用方法:
{{#invoke:TemplateArgPassingTool|passNArgs|skip=<跳过的参数数量>|template_name=<模板名称>}}
- 例如在模板内输入
{{#invoke:TemplateArgPassingTool|passNArgs|skip=1|template_name=P2}}
- 调用模板
{{<模板名称>| 第一参数 | 第二参数 | 第三参数 }}
→“第三参数” - 对比直接调用
{{P2 | 第一参数 | 第二参数 }}
→“ 第二参数 ”
- 例如在模板内输入
local p={}
local lib_arg={}
local module_pattern = "#%s*[Ii][Nn][Vv][Oo][Kk][Ee]%s*:%s*(.+)%s*%|%s*(.+)"
function p.passArgs(frame)
return p.passNArgs(frame, true)
end
function p.passEscapeArgs(frame)
local args, working_frame
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
args = lib_arg.getArgs(frame, {parentFirst=true})
working_frame = frame
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
working_frame = mw.getCurrentFrame()
if type(args) ~= type({}) then args = {frame} end
end
local template_name = '' .. (args.template_name or 'void')
local module_name, function_name = nil,nil
if mw.ustring.find(template_name, module_pattern) then
mw.ustring.gsub(template_name, module_pattern, function(str, fun)module_name, function_name = str, fun return str end)
end
local escape_args = {}
for key, value in pairs(args) do
local arg_value = value
if mw.isSubsting() then
arg_value = mw.ustring.gsub(value, "[=%|%{%}]", function(esc_str)
local mapping = {} mapping['|']='!' mapping['=']='=' mapping['{']='(' mapping['}']=')'
if mapping[esc_str] then
return "{{" .. mapping[esc_str] .. "}}"
end
return esc_str
end)
end
escape_args[key] = mw.text.encode(arg_value)
end
local body_frame = working_frame:newChild{ title = module_name or template_name, args = escape_args }
if module_name ~= nil then
module_body = require("Module:"..module_name)
if module_body ~= nil then
func_body = module_body[function_name]
if func_body ~= nil then
return func_body(body_frame)
end
end
return ''
end
return body_frame:expandTemplate{ title = template_name, args = escape_args }
end
function p.passNArgs(frame, no_skip)
local args, working_frame
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
args = lib_arg.getArgs(frame, {parentFirst=true})
working_frame = frame
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
working_frame = mw.getCurrentFrame()
if type(args) ~= type({}) then args = {frame} end
end
local skip_args = no_skip and 0 or (tonumber(args.skip) or 1)
local template_name = '' .. (args.template_name or 'void')
local module_name, function_name = nil,nil
if mw.ustring.find(template_name, module_pattern) then
mw.ustring.gsub(template_name, module_pattern, function(str, fun)module_name, function_name = str, fun return str end)
end
local sikp_args = {}
for key, value in pairs(args) do
local i = tonumber(key)
local new_key = key
local skip_flag = false
if i ~= nil then
if i > 0 then
if i <= skip_args then skip_flag = true end
new_key = i - skip_args
end
end
if not skip_flag then sikp_args[new_key] = value end
end
local body_frame = working_frame:newChild{ title = module_name or template_name, args = sikp_args }
if module_name ~= nil then
module_body = require("Module:"..module_name)
if module_body ~= nil then
func_body = module_body[function_name]
if func_body ~= nil then
return func_body(body_frame)
end
end
return ''
end
return body_frame:expandTemplate{ title = template_name, args = sikp_args }
end
return p