UsageEdit

{{subst:#invoke:Forward parameters to template call|main|_template=template name}}

This module is for a very particular set of circumstances: when a substituted template needs to dynamically generate the wikimarkup for a template call, forwarding all numbered parameters. It also allows for the option of designating a prefix for a series of named parameters which will be converted to numbered ones. Because it generates wikitext, this module only works when substituted, unless all you want is to show the template call's markup without actually executing it.

To specify a prefix to convert to numbered parameters, set Template:Param (or Template:Param, Template:Param, etc.) The order of items within that family of parameters will be retained, with those items being placed after any true numbered parameters. For instance, {{subst:#invoke:Forward parameters to template call|main|_template=foo|_convert_prefix=bar|1|2|bar2=b|bar1=a}} will become Template:Tlc. If multiple prefixes are converted, order of items within each set is retained, but the ordering of the sets is unpredictable.



local p = {}
local getArgs = require('Module:Arguments').getArgs
local sparseIpairs = require('Module:TableTools').sparseIpairs

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function convert(args)
	local filter = {}
	local newParams = {}
	for arg, val in pairs(args) do
		if arg == tostring(arg) then
			if arg:match("^_convert_prefix") then
				filter[val] = {}
			else
				if arg:match("^_forward_name") then
					newParams[val] = args[val]
	end end end end
	for arg, val in pairs(args) do
		if arg == tonumber(arg) then
			newParams[#newParams + 1] = val
		else
			for prefix, _ in pairs(filter) do
				if arg:match("^" .. prefix) then
					if arg == prefix then
						filter[prefix][0] = val
					else
						local prefixnum = arg:match("^" .. prefix .. "(%d)")
						if prefixnum then
							filter[prefix][tonumber(prefixnum)] = val
	end end end end end end
	for _, values in pairs(filter) do
		for _, val in sparseIpairs(values) do
			newParams[#newParams + 1] = val
	end end
	return newParams
end
	
function p._main(args)
	local markup = "{{" .. args._template
	local convertedArgs = convert(args)
	for i, val in ipairs(convertedArgs) do
		markup = markup .. "|" .. i .. "=" .. val
	end
	for param, val in pairs(convertedArgs) do
		if param == tostring(param) and not param:match("^_") then
			markup = markup .. "|" .. param .. "=" .. val
	end end
	return markup .. "}}"
end

return p