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
args[1] = nil
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