Module:Xpsoc: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Mr. Stradivarius (raise an error if we don't get given a template name) |
meta>Mr. Stradivarius (assigning args[1] as nil doesn't seem to work, so test for key "1" during the loop) |
||
Line 48: | Line 48: | ||
error('no template name passed to xpsoc', 2) | error('no template name passed to xpsoc', 2) | ||
end | end | ||
local invArgs = {} | local invArgs = {} | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
if type(k) == 'number' then | if type(k) == 'number' and k ~= 1 then | ||
invArgs[k - 1] = v | invArgs[k - 1] = v | ||
else | else |
Revision as of 02:32, 28 October 2014
Documentation for this module may be created at Module:Xpsoc/doc
-- This module implements {{xpsoc}}. local p = {} local function makeInvocation(name, args) -- 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 -- Build the invocation body with numbered args first, then named. local pipe = mw.text.nowiki('|') local ret = {} ret[#ret + 1] = mw.text.nowiki('{{') 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] = 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] = pipe ret[#ret + 1] = k ret[#ret + 1] = '=' ret[#ret + 1] = v end ret[#ret + 1] = mw.text.nowiki('}}') 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 type(k) == 'number' and k ~= 1 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 local invocation = makeInvocation(name, invArgs) local gives = args.gives or '→' local result = frame:expandTemplate{title = name, args = 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