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)
 
(36 intermediate revisions by 10 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 s:match('%S')
 
end
 
end
   
  +
local function clean(text)
function p.check (frame)
 
  +
-- Return text cleaned for display and truncated if too long.
local args = frame.args
 
  +
-- Strip markers are replaced with dummy text representing the original wikitext.
local pargs = frame:getParent().args
 
  +
local pos, truncated
local ignoreblank = isnotempty(frame.args['ignoreblank'])
 
  +
local function truncate(text)
local checkpos = isnotempty(frame.args['checkpositional'])
 
  +
if truncated then
  +
return ''
  +
end
  +
if mw.ustring.len(text) > 25 then
  +
truncated = true
  +
text = mw.ustring.sub(text, 1, 25) .. '...'
  +
end
  +
return mw.text.nowiki(text)
  +
end
  +
local parts = {}
  +
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
  +
pos = remainder
  +
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
  +
end
  +
table.insert(parts, truncate(text:sub(pos or 1)))
  +
return table.concat(parts)
  +
end
  +
  +
function p._check(args, pargs)
  +
if type(args) ~= "table" or type(pargs) ~= "table" then
  +
-- TODO: error handling
  +
return
  +
end
  +
  +
local ignoreblank = isnotempty(args['ignoreblank'])
  +
local showblankpos = isnotempty(args['showblankpositional'])
 
local knownargs = {}
 
local knownargs = {}
local unknown = 'Found _VALUE_, '
+
local unknown = args['unknown'] or 'Found _VALUE_, '
  +
local preview = 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 _, regexp in ipairs(regexps) do
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
 
local r = mw.ustring.gsub(unknown, '_VALUE_', k)
+
if mw.ustring.match(k, regexp) then
  +
knownflag = true
table.insert(res, r)
 
  +
break
table.insert(comments, '"' .. k .. '"')
 
  +
end
 
end
 
end
elseif(checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil) then
+
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
  +
table.insert(values, clean(k))
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
  +
table.insert(values, k .. ' = ' .. clean(v))
 
end
 
end
 
end
 
end
   
  +
-- add results to the output tables
if(#comments > 0) then
 
  +
if #values > 0 then
commentstr = '<!-- Module:Check for unknown parameters results: ' ..
 
  +
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
table.concat(comments, ', ') .. '-->'
 
  +
unknown = preview
  +
end
  +
for _, 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
  +
-- avoid error with v = 'example%2' ("invalid capture index")
  +
local r = unknown:gsub('_VALUE_', {_VALUE_ = v})
  +
table.insert(res, r)
  +
end
 
end
 
end
  +
 
return table.concat(res) .. commentstr
+
return table.concat(res)
  +
end
  +
  +
function p.check(frame)
  +
local args = frame.args
  +
local pargs = frame:getParent().args
  +
return p._check(args, pargs)
 
end
 
end
   

Latest revision as of 11:41, 21 May 2021

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 s:match('%S')
end

local function clean(text)
	-- Return text cleaned for display and truncated if too long.
	-- Strip markers are replaced with dummy text representing the original wikitext.
	local pos, truncated
	local function truncate(text)
		if truncated then
			return ''
		end
		if mw.ustring.len(text) > 25 then
			truncated = true
			text = mw.ustring.sub(text, 1, 25) .. '...'
		end
		return mw.text.nowiki(text)
	end
	local parts = {}
	for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
		pos = remainder
		table.insert(parts, truncate(before) .. '&lt;' .. tag .. '&gt;...&lt;/' .. tag .. '&gt;')
	end
	table.insert(parts, truncate(text:sub(pos or 1)))
	return table.concat(parts)
end

function p._check(args, pargs)
	if type(args) ~= "table" or type(pargs) ~= "table" then
		-- TODO: error handling
		return
	end

	local ignoreblank = isnotempty(args['ignoreblank'])
	local showblankpos = isnotempty(args['showblankpositional'])
	local knownargs = {}
	local unknown = args['unknown'] or 'Found _VALUE_, '
	local preview = 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 _, 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
				table.insert(values, clean(k))
			end
		elseif type(k) == 'number' and
			knownargs[tostring(k)] == nil and
			( showblankpos or isnotempty(v) )
		then
			table.insert(values, k .. ' = ' .. clean(v))
		end
	end

	-- add results to the output tables
	if #values > 0 then
		if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
			unknown = preview
		end
		for _, 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
			-- avoid error with v = 'example%2' ("invalid capture index")
			local r =  unknown:gsub('_VALUE_', {_VALUE_ = v})
			table.insert(res, r)
		end
	end

	return table.concat(res)
end

function p.check(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	return p._check(args, pargs)
end

return p