Module:Xpsoc
This module implements {{xpsoc}}. Please see the template page for documentation.
-- This module implements {{xpsoc}}.
local p = {}
local function makeInvocation(name, args, useNoWiki)
-- This function makes a template invocation from the name and the arguments
-- given.
-- Copy the invocation args and convert magic words.
-- We need to make a copy of the table rather than just using the original,
-- as some of the values may be erased when building the invocation.
local invArgs = {}
for k, v in pairs(args) do
invArgs[k] = v
end
-- Get the separators to use.
local seps = {
openb = '{{',
closeb = '}}',
pipe = '|'
}
if useNoWiki then
for k, v in pairs(seps) do
seps[k] = mw.text.nowiki(v)
end
end
-- Build the invocation body with numbered args first, then named.
local ret = {}
ret[#ret + 1] = seps.openb
ret[#ret + 1] = name
for k, v in ipairs(invArgs) do
if v:find('=', 1, true) then
-- Likely something like 1=foo=bar, we need to do it as a named arg
break
end
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = v
invArgs[k] = nil -- Erase the key so that we don't add the value twice
end
for k, v in pairs(invArgs) do
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = k
ret[#ret + 1] = '='
ret[#ret + 1] = v
end
ret[#ret + 1] = seps.closeb
return table.concat(ret)
end
function p._main(args, frame)
frame = frame or mw.getCurrentFrame()
-- Get the invocation arguments.
local name = args[1]
if not name then
error('no template name passed to xpsoc', 2)
end
local invArgs = {}
for k, v in pairs(args) do
if k ~= 1 then
if type(k) == 'number' then
invArgs[k - 1] = v
else
local num = k:match('^n([1-9][0-9]*)$')
if num then
invArgs[args[k]] = args['v' .. num]
end
end
end
end
local invocation = makeInvocation(name, invArgs, true)
local gives = args.gives or mw.language.getContentLanguage():getArrow('forwards')
local result = frame:preprocess(makeInvocation(name, invArgs))
return string.format('<code>%s</code> %s %s', invocation, gives, result)
end
function p.main(frame)
return p._main(frame:getParent().args, frame)
end
return p