Theme: iWiki Log in Register

Diff: Module:Check for unknown parameters

Comparing revision #1 (2022-02-21 05:24:13) with revision #2 (2023-02-02 05:29:42).

OldNew
-- This module may be used to compare the arguments passed to the parent
-- 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
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
-- not on the list
local p = {}
local p = {}
local function trim(s)
local function trim(s)
	return s:match('^%s*(.-)%s*$')
	return s:match('^%s*(.-)%s*$')
end
end
local function isnotempty(s)
local function isnotempty(s)
	return s and s:match('%S')
	return s and s:match('%S')
end
end
local function clean(text)
local function clean(text)
	-- Return text cleaned for display and truncated if too long.
	-- Return text cleaned for display and truncated if too long.
	-- Strip markers are replaced with dummy text representing the original wikitext.
	-- Strip markers are replaced with dummy text representing the original wikitext.
	local pos, truncated
	local pos, truncated
	local function truncate(text)
	local function truncate(text)
		if truncated then
		if truncated then
			return ''
			return ''
		end
		end
		if mw.ustring.len(text) > 25 then
		if mw.ustring.len(text) > 25 then
			truncated = true
			truncated = true
			text = mw.ustring.sub(text, 1, 25) .. '...'
			text = mw.ustring.sub(text, 1, 25) .. '...'
		end
		end
		return mw.text.nowiki(text)
		return mw.text.nowiki(text)
	end
	end
	local parts = {}
	local parts = {}
	for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
	for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
		pos = remainder
		pos = remainder
		table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
		table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
	end
	end
	table.insert(parts, truncate(text:sub(pos or 1)))
	table.insert(parts, truncate(text:sub(pos or 1)))
	return table.concat(parts)
	return table.concat(parts)
end
end
function p._check(args, pargs)
function p._check(args, pargs)
	if type(args) ~= "table" or type(pargs) ~= "table" then
	if type(args) ~= "table" or type(pargs) ~= "table" then
		-- TODO: error handling
		-- TODO: error handling
		return
		return
	end
	end
	-- create the list of known args, regular expressions, and the return string
	-- create the list of known args, regular expressions, and the return string
	local knownargs = {}
	local knownargs = {}
	local regexps = {}
	local regexps = {}
	for k, v in pairs(args) do
	for k, v in pairs(args) do
		if type(k) == 'number' then
		if type(k) == 'number' then
			v = trim(v)
			v = trim(v)
			knownargs[v] = 1
			knownargs[v] = 1
		elseif k:find('^regexp[1-9][0-9]*$') then
		elseif k:find('^regexp[1-9][0-9]*$') then
			table.insert(regexps, '^' .. v .. '$')
			table.insert(regexps, '^' .. v .. '$')
		end
		end
	end
	end
	-- loop over the parent args, and make sure they are on the list
	-- loop over the parent args, and make sure they are on the list
	local ignoreblank = isnotempty(args['ignoreblank'])
	local ignoreblank = isnotempty(args['ignoreblank'])
	local showblankpos = isnotempty(args['showblankpositional'])
	local showblankpos = isnotempty(args['showblankpositional'])
	local values = {}
	local values = {}
	for k, v in pairs(pargs) do
	for k, v in pairs(pargs) do
		if type(k) == 'string' and knownargs[k] == nil then
		if type(k) == 'string' and knownargs[k] == nil then
			local knownflag = false
			local knownflag = false
			for _, regexp in ipairs(regexps) do
			for _, regexp in ipairs(regexps) do
				if mw.ustring.match(k, regexp) then
				if mw.ustring.match(k, regexp) then
					knownflag = true
					knownflag = true
					break
					break
				end
				end
			end
			end
			if not knownflag and ( not ignoreblank or isnotempty(v) )  then
			if not knownflag and ( not ignoreblank or isnotempty(v) )  then
				table.insert(values, clean(k))
				table.insert(values, clean(k))
			end
			end
		elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
		elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
			local knownflag = false
			local knownflag = false
			for _, regexp in ipairs(regexps) do
			for _, regexp in ipairs(regexps) do
				if mw.ustring.match(tostring(k), regexp) then
				if mw.ustring.match(tostring(k), regexp) then
					knownflag = true
					knownflag = true
					break
					break
				end
				end
			end
			end
			if not knownflag and ( showblankpos or isnotempty(v) ) then
			if not knownflag and ( showblankpos or isnotempty(v) ) then
				table.insert(values, k .. ' = ' .. clean(v))
				table.insert(values, k .. ' = ' .. clean(v))
			end
			end
		end
		end
	end
	end
	-- add results to the output tables
	-- add results to the output tables
	local res = {}
	local res = {}
	if #values > 0 then
	if #values > 0 then
		local unknown_text = args['unknown'] or 'Found _VALUE_, '
		local unknown_text = args['unknown'] or 'Found _VALUE_, '
		if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
		if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
			local preview_text = args['preview']
			local preview_text = args['preview']
			if isnotempty(preview_text) then
			if isnotempty(preview_text) then
				preview_text = require('Module:If preview')._warning({preview_text})
				preview_text = require('Module:If preview')._warning({preview_text})
			elseif preview == nil then
			elseif preview == nil then
				preview_text = unknown_text
				preview_text = unknown_text
			end
			end
			unknown_text = preview_text
			unknown_text = preview_text
		end
		end
		for _, v in pairs(values) do
		for _, v in pairs(values) do
			-- Fix odd bug for | = which gets stripped to the empty string and
			-- Fix odd bug for | = which gets stripped to the empty string and
			-- breaks category links
			-- breaks category links
			if v == '' then v = ' ' end
			if v == '' then v = ' ' end
			-- avoid error with v = 'example%2' ("invalid capture index")
			-- avoid error with v = 'example%2' ("invalid capture index")
			local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
			local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
			table.insert(res, r)
			table.insert(res, r)
		end
		end
	end
	end
	return table.concat(res)
	return table.concat(res)
end
end
function p.check(frame)
function p.check(frame)
	local args = frame.args
	local args = frame.args
	local pargs = frame:getParent().args
	local pargs = frame:getParent().args
	return p._check(args, pargs)
	return p._check(args, pargs)
end
end
return p
return p