--[=[
以[[Module:TemplateParameters]]發想的模組
功能類似,但套用位置不同,傳遞方式也不一樣
部分地方為複製品,避免調用時效果走樣
]=]--
local p = {}
local lib_arg = {}
local yesno = require('Module:Yesno')
local lib_editstate = {}
local function errmsg(msg)
return require('Module:Error').error({[1] = '[[Module:TemplateParameters2]]錯誤:' .. msg})
end
function p._pass_spstr2(template, arg_to_spstr, args)
---- Module:TemplateParameters.pass_spstr 變種 ----
local frame = mw.getCurrentFrame()
local input_text = template
local input_args = {}
local input_title = mw.title.getCurrentTitle()
local spilt_args = mw.text.split( arg_to_spstr, '<參數分隔/>')
local k, v
for _,x in pairs(spilt_args) do
local text = mw.text.trim(x)
if text ~= '' then
if mw.ustring.gmatch(text, '<參數值/>') then
local spilt_kv = mw.text.split( text, '<參數值/>')
local spilt_list = {}
k, v = mw.text.trim(spilt_kv[1]), spilt_kv[2]
if k ~= '' then
input_args[k] = v
end
end
end
end
if args and type(args) == type(frame) then
for k,v in pairs(spilt_args) do
input_args[k] = v
end
end
frame = frame:newChild{ title = tostring(mw.title.getCurrentTitle().fullText), args = input_args }
return frame:preprocess({ text = input_text })
end
function p.pass_spstr2(frame)
local args
local template = '{{safesubst:'
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.
args = frame.args
--local parent = frame:getParent().args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
if type(frame) ~= type({}) then args = {frame}
else args = frame end
end
if args['_TemplateTitle'] then
template = template .. args['_TemplateTitle']
end
for k, v in pairs( args ) do
if mw.text.trim(v) == '' then elseif k ~= '_args' or k ~= '_parent' or k ~= '_TemplateTitle' then
local numberargs = tonumber(k)
if template == '{{safesubst:' then
template = template .. v
elseif (mw.ustring.gmatch(args[1], '#invoke:') and k == 2) then
template = template .. '|' .. v
elseif ((not numberargs) or (numberargs ~= k) or (numberargs == k and mw.ustring.gmatch(v, '=')) ) then
template = template .. '|' .. k .. '=' .. v
else
template = template .. '|' .. v
end
end
end
template = template .. '}}'
--require('Module:Template invocation').invocation('foo', {'bar', 'baz', abc = 'def'})
if ((type(parent) == nil) and (not args['_args']) and (not args['_parent'])) then
return mw.getCurrentFrame():preprocess( template )
end
if (args['_args']) then
pass_spstr_arg = args['_args']
elseif (args['_parent']) then
pass_spstr_arg = args['_parent']
end
--[=[
return require('Module:TemplateParameters').pass_spstr({
delnowiki = 0,
delmsgnw = 0,
code = template,
TemplateTitle = args['_TemplateTitle'] or mw.title.getCurrentTitle(),
args = pass_spstr_arg
})]=]--
return p._pass_spstr2(template, pass_spstr_arg, args)
end
function p.arg_to_spstr(frame)
local args
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.
args = frame.args
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
if type(frame) ~= type({}) then args = {frame}
else args = frame end
end
local wt = ''
for k,v in pairs(args) do
if wt == '' then
wt = k .. '<參數值/>' ..v
else
wt = wt .. '<參數分隔/>' .. k .. '<參數值/>' ..v
end
end
return wt
end
function p.arg_to_spstr2(frame)
if frame ~= mw.getCurrentFrame() then
return errmsg('arg_to_spstr2僅給解析<code>frame:getParent().args</code>用,無法套用在模組間接調用!')
end
local wt = ''
for k,v in pairs(frame:getParent().args) do
if wt == '' then
wt = k .. '<參數值/>' ..v
else
wt = wt .. '<參數分隔/>' .. k .. '<參數值/>' ..v
end
end
return wt
end
return p