The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Documentation for this module may be created at Module:Check for conflicting parameters/doc

local p = {}

local function trim(s)
	return s:match('^%s*(.-)%s*$')
end

local function isnotempty(s)
	return s and s:match('%S')
end

-- Wraps the call into Module:If preview so a missing/incompatible copy of
-- that module (no '_warning' export, or not present at all) can't crash
-- this module. Falls back to always rendering the warning text directly.
local function renderWarning(msgTable)
	local ok, ifPreview = pcall(require, 'Module:If preview')
	if ok and type(ifPreview) == 'table' and type(ifPreview._warning) == 'function' then
		local ok2, result = pcall(ifPreview._warning, msgTable)
		if ok2 then
			return result
		end
	end
	-- Fallback: Module:If preview isn't available (or doesn't expose
	-- _warning) on this wiki, so just show the warning unconditionally
	-- instead of throwing a Lua error.
	return '<strong class="error">' .. table.concat(msgTable, '<br>') .. '</strong>'
end

function p.check(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	local checknested = isnotempty(args['nested'])
	local delimiter = isnotempty(args['delimiter']) and args['delimiter'] or ';'
	local argpairs = {}

	for k, v in pairs(args) do
		if type(k) == 'number' then
			local plist = mw.text.split(v, delimiter)
			local pfound = {}
			local count = 0
			for ii, vv in ipairs(plist) do
				vv = trim(vv)
				if checknested and pargs[vv] or isnotempty(pargs[vv]) then
					count = count + 1
					table.insert(pfound, vv)
				end
			end
			if count > 1 then
				table.insert(argpairs, pfound)
			end
		end
	end

	local warnmsg = {}
	local res = ''
	local cat = ''
	if args['cat'] and mw.ustring.match(args['cat'],'^[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]:') then
		cat = args['cat']
	end
	local template = args['template'] and ' in ' .. args['template']  or ''
	if #argpairs > 0 then
		for i, v in ipairs( argpairs ) do
			table.insert(
				warnmsg,
				mw.ustring.format(
					'Using more than one of the following parameters%s: <code>%s</code>.',
					template,
					table.concat(v, '</code>, <code>')
				)
			)
			if cat ~= '' then
				res = res .. '[[' .. cat .. '|' .. (v[1] == '' and ' ' or '') .. v[1] .. ']]'
			end
		end
	end

	if #warnmsg > 0 then
		res = renderWarning(warnmsg) .. res
	end

	return res
end

return p