Module:Xpsoc
From Zoophilia Wiki
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 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) 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