Difference between revisions of "Module:Check for unknown parameters"

From Nonbinary Wiki
Jump to navigation Jump to search
(add html comments to make it easier to see the output without disrupting the article)
 
(29 intermediate revisions by 6 users not shown)
Line 3: Line 3:
 
-- not on the list
 
-- not on the list
 
local p = {}
 
local p = {}
  +
  +
local function trim(s)
  +
return s:match('^%s*(.-)%s*$')
 
end
   
 
local function isnotempty(s)
 
local function isnotempty(s)
return s and s:match( '^%s*(.-)%s*$' ) ~= ''
+
return s and trim(s) ~= ''
 
end
 
end
   
Line 12: Line 16:
 
local pargs = frame:getParent().args
 
local pargs = frame:getParent().args
 
local ignoreblank = isnotempty(frame.args['ignoreblank'])
 
local ignoreblank = isnotempty(frame.args['ignoreblank'])
local checkpos = isnotempty(frame.args['checkpositional'])
+
local showblankpos = isnotempty(frame.args['showblankpositional'])
 
local knownargs = {}
 
local knownargs = {}
local unknown = 'Found _VALUE_, '
+
local unknown = frame.args['unknown'] or 'Found _VALUE_, '
  +
local preview = frame.args['preview']
   
 
local values = {}
 
local res = {}
 
local res = {}
local comments = {}
+
local regexps = {}
  +
local commentstr = ''
 
 
-- create the list of known args, regular expressions, and the return string
 
-- create the list of known args, and the return string
 
 
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 = mw.ustring.gsub(v, '^%s*(.-)%s*$', '%1')
+
v = trim(v)
 
knownargs[v] = 1
 
knownargs[v] = 1
  +
elseif k:find('^regexp[1-9][0-9]*$') then
else
 
if (k == 'unknown' and type(v) == 'string') then
+
table.insert(regexps, '^' .. v .. '$')
unknown = v
 
end
 
 
end
 
end
 
end
  +
if isnotempty(preview) then
  +
preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>'
  +
elseif preview == nil then
  +
preview = unknown
 
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
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
if( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) then
 
  +
for i, regexp in ipairs(regexps) do
  +
if mw.ustring.match(k, regexp) then
  +
knownflag = true
  +
break
  +
end
  +
end
 
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
 
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
 
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
 
table.insert(values, k)
local r = mw.ustring.gsub(unknown, '_VALUE_', k)
 
table.insert(res, r)
 
table.insert(comments, '"' .. k .. '"')
 
end
 
elseif(checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil) then
 
if( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) then
 
local r = mw.ustring.gsub(unknown, '_VALUE_', k)
 
table.insert(res, r)
 
table.insert(comments, '"' .. k .. '"')
 
 
end
 
end
 
elseif type(k) == 'number' and
  +
knownargs[tostring(k)] == nil and
  +
( showblankpos or isnotempty(v) )
  +
then
  +
local vlen = mw.ustring.len(v)
  +
v = mw.ustring.sub(v, 1, (vlen < 25) and vlen or 25)
 
v = mw.ustring.gsub(v, '[^%w\-_ ]', '?')
  +
table.insert(values, k .. ' = ' .. v .. ((vlen >= 25) and ' ...' or ''))
 
end
 
end
 
end
 
end
   
  +
-- add resuls to the output tables
if(#comments > 0) then
+
if #values > 0 then
commentstr = '<!-- Module:Check for unknown parameters results: ' ..
 
  +
if frame:preprocess( "{{REVISIONID}}" ) == "" then
table.concat(comments, ', ') .. '-->'
 
 
unknown = preview
  +
end
  +
for k, v in pairs(values) do
  +
if v == '' then
  +
-- Fix odd bug for | = which gets stripped to the empty string and
  +
-- breaks category links
  +
v = ' '
  +
end
 
local r = unknown:gsub('_VALUE_', v)
 
table.insert(res, r)
  +
end
 
end
 
end
  +
 
return table.concat(res) .. commentstr
+
return table.concat(res)
 
end
 
end
   

Latest revision as of 09:59, 16 November 2019

Documentation for this module may be created at Module:Check for unknown 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
-- not on the list
local p = {}

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

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

function p.check (frame)
	local args = frame.args
	local pargs = frame:getParent().args
	local ignoreblank = isnotempty(frame.args['ignoreblank'])
	local showblankpos = isnotempty(frame.args['showblankpositional'])
	local knownargs = {}
	local unknown = frame.args['unknown'] or 'Found _VALUE_, '
	local preview = frame.args['preview']

	local values = {}
	local res = {}
	local regexps = {}

	-- create the list of known args, regular expressions, and the return string
	for k, v in pairs(args) do
		if type(k) == 'number' then
			v = trim(v)
			knownargs[v] = 1
		elseif k:find('^regexp[1-9][0-9]*$') then
			table.insert(regexps, '^' .. v .. '$')
		end
	end
	if isnotempty(preview) then 
		preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>'
	elseif preview == nil then
		preview = unknown
	end

	-- loop over the parent args, and make sure they are on the list
	for k, v in pairs(pargs) do
		if type(k) == 'string' and knownargs[k] == nil then
			local knownflag = false
			for i, regexp in ipairs(regexps) do
				if mw.ustring.match(k, regexp) then
					knownflag = true
					break
				end
			end
			if not knownflag and ( not ignoreblank or isnotempty(v) )  then
				k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
				table.insert(values, k)
			end
		elseif type(k) == 'number' and 
			knownargs[tostring(k)] == nil and
			( showblankpos or isnotempty(v) )
		then
			local vlen = mw.ustring.len(v)
			v = mw.ustring.sub(v, 1, (vlen < 25) and vlen or 25) 
			v = mw.ustring.gsub(v, '[^%w\-_ ]', '?')
			table.insert(values, k .. ' = ' .. v .. ((vlen >= 25) and ' ...' or ''))
		end
	end

	-- add resuls to the output tables
	if #values > 0 then
		if frame:preprocess( "{{REVISIONID}}" ) == "" then
			unknown = preview
		end
		for k, v in pairs(values) do
			if v == '' then
			-- Fix odd bug for | = which gets stripped to the empty string and
			-- breaks category links
			v = ' '
			end
			local r =  unknown:gsub('_VALUE_', v)
			table.insert(res, r)
		end
	end

	return table.concat(res)
end

return p