Module:Xpsoc: Difference between revisions
Appearance
Content deleted Content added
use frame:preprocess so that this works with things like parser functions too |
|||
Line 1: | Line 1: | ||
-- This module implements {{xpsoc}}. |
-- This module implements {{xpsoc}}. |
||
local mTemplateInvocation = require('Module:Template invocation') |
|||
local p = {} |
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) |
function p._main(args, frame) |
||
Line 73: | Line 27: | ||
end |
end |
||
local invocation = |
local invocation = mTemplateInvocation.invocation(name, invArgs, 'nowiki') |
||
local gives = args.gives or mw.language.getContentLanguage():getArrow('forwards') |
local gives = args.gives or mw.language.getContentLanguage():getArrow('forwards') |
||
local result = frame:preprocess( |
local result = frame:preprocess(mTemplateInvocation.invocation(name, invArgs)) |
||
return string.format('<code>%s</code> %s %s', invocation, gives, result) |
return string.format('<code>%s</code> %s %s', invocation, gives, result) |
Latest revision as of 04:14, 24 November 2014
-- This module implements {{xpsoc}}.
local mTemplateInvocation = require('Module:Template invocation')
local p = {}
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 = mTemplateInvocation.invocation(name, invArgs, 'nowiki')
local gives = args.gives or mw.language.getContentLanguage():getArrow('forwards')
local result = frame:preprocess(mTemplateInvocation.invocation(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