Module:Check for deprecated parameters

From Phuketer
Revision as of 01:41, 12 June 2026 by imported>Zackmann08 (Adding support for regular expression matching. Credit for this edit goes to User:Frietjes who did this in the sandbox.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- on the list
local p = {}
local MAX_PARAMS = 9 -- Limit to only showing 10 preview warnings

local function isnotempty(s)
	return s and mw.text.trim(s) ~= ''
end

local function scanValues(values,results,args,replaceTable)
    for k, v in pairs(values) do
		local c = args.category:gsub('_VALUE_', v)
		table.insert(results, c)
		if v == '' then
			-- Fix odd bug for | = which gets stripped to the empty string
			-- and breaks category links
			v = ' '
		end
        local replaceString = '<code>'..v..'</code>. '
        local replaceValue = replaceTable and replaceTable[v]
        replaceString = replaceString..(replaceValue and 'Replace with <code>'..replaceValue..'</code>.' or 'It should be removed.')
		local p = args.preview:gsub('_VALUE_',replaceString)
		table.insert(results, p )
	end
end

function p.check (frame)
	-- create the table of deprecated values and their matching new value
	return p._check(frame.args, frame:getParent().args, frame:getParent():getTitle())
end

local moduleParams = {ignoreblank=true, preview=true, _category=true, _remove=true}

function p._check(args, pargs, caller)
	local dep_values = {}
	local reg_exps = {}
	for k, v in pairs(args) do
		if ( type(k) == 'string' and k:find('^_regexp[1-9][0-9]*$') and v:find('=') ) then
			local v_split = mw.text.split(v, '%s*=%s*')
			if ( #v_split == 2 ) then
				table.insert(reg_exps, { '^' .. v_split[1] .. '$', v_split[2] } )
			end
		elseif not moduleParams[k] then
			dep_values[k] = v
		end
	end

	-- Parse params to remove
	local removes = {}
	if args['_remove'] then
		for r in args['_remove']:gmatch("([^;]+)") do
            removes[mw.text.trim(r)] = 1
		end
	end
	
	-- loop over the parent args and see if any are deprecated
	local values = {}
	local remove_values = {}
	local ignoreblank = isnotempty(args['ignoreblank'])
	for k, v in pairs(pargs) do
        if not ignoreblank or isnotempty(v) then
			if dep_values[k] then
				table.insert(values, k)
			elseif removes[k] then
				table.insert(remove_values, k)
			else
				for _, regexp in ipairs(reg_exps) do
					if mw.ustring.match( tostring(k), regexp[1] ) then
						table.insert(values, k)
						dep_values[k] = mw.ustring.gsub(tostring(k), regexp[1], regexp[2])
						break
					end
				end
			end
		end
	end

    -- find out about calling context
    local title = mw.title.getCurrentTitle()

    -- create local defaulted arguments
    local category = args["_category"] or title.namespace == 0 and "[[Category:Pages with deprecated parameters]]" or ""
	local preview = args['preview'] or 'Page using [['..caller..']] with deprecated parameter _VALUE_'
	if isnotempty(preview) then
		preview = require('Module:If preview')._warning({preview})
	end
    local localArgs = {category=category,preview=preview}
	
    -- scan through values and remove_values and create output results
	local results = {}
    scanValues(values,results,localArgs,dep_values)
    scanValues(remove_values,results,localArgs)
	
	if #results >= MAX_PARAMS*2 then
		while #results > MAX_PARAMS*2 do
    		table.remove(results) -- Calling without index removes the last element
		end
   		table.insert(results, require('Module:If preview')._warning({'Page using [['..caller..']] with <b>multiple other</b> deprecated parameters. Fix those above and preview again.'}))
	end
	return table.concat(results)
end

return p