Check for unknown parameters

From Redazione
Jump to navigation Jump to search
(from en wiki)
(Added entry point for modules per talk page discussion. Report any errors on talk page.)
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
 +
 
 +
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) .. '<' .. tag .. '>...</' .. tag .. '>')
 +
end
 +
table.insert(parts, truncate(text:sub(pos or 1)))
 +
return table.concat(parts)
 
end
 
end
  
−
function p.check (frame)
+
function p._check(args, pargs)
−
local args = frame.args
+
if type(args) ~= "table" or type(pargs) ~= "table" then
−
local pargs = frame:getParent().args
+
-- TODO: error handling
−
local ignoreblank = isnotempty(frame.args['ignoreblank'])
+
return
−
local checkpos = isnotempty(frame.args['checkpositional'])
+
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 regexps = {}
 
local regexps = {}
−
local comments = {}
+
 
−
local commentstr = ''
 
−
 
 
-- create the list of known args, regular expressions, and the return string
 
-- create the list of known args, regular expressions, 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
−
else
+
elseif k:find('^regexp[1-9][0-9]*$') then
−
if (k == 'unknown' and type(v) == 'string') then
+
table.insert(regexps, '^' .. v .. '$')
−
unknown = v
 
−
elseif (mw.ustring.match(k, '^regexp[%d]*$') and type(v) == 'string') then
 
−
table.insert(regexps, '^' .. 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 = nil
+
local knownflag = false
−
for r = 1,#regexps do
+
for _, regexp in ipairs(regexps) do
−
if( mw.ustring.match(k,regexps[r]) ) then
+
if mw.ustring.match(k, regexp) then
−
knownflag = 1
+
knownflag = true
 +
break
 
end
 
end
 
end
 
end
−
if( (not knownflag) and ( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) ) then
+
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
−
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
+
table.insert(values, clean(k))
−
local r = mw.ustring.gsub(unknown, '_VALUE_', k)
 
−
table.insert(res, r)
 
−
table.insert(comments, '"' .. k .. '"')
 
 
end
 
end
−
elseif(checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil) then
+
elseif type(k) == 'number' and
−
if( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) then
+
knownargs[tostring(k)] == nil and
−
local r = mw.ustring.gsub(unknown, '_VALUE_', k)
+
( showblankpos or isnotempty(v) )
−
table.insert(res, r)
+
then
−
table.insert(comments, '"' .. k .. '"')
+
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
 
end
 +
-- avoid error with v = 'example%2' ("invalid capture index")
 +
local r =  unknown:gsub('_VALUE_', {_VALUE_ = v})
 +
table.insert(res, r)
 
end
 
end
 
end
 
end
  
−
if(#comments > 0) then
+
return table.concat(res)
−
commentstr = '<!-- Module:Check for unknown parameters results: ' ..
+
end
−
table.concat(comments, ', ') .. '-->'
+
 
−
end
+
function p.check(frame)
−
+
local args = frame.args
−
return table.concat(res) .. commentstr
+
local pargs = frame:getParent().args
 +
return p._check(args, pargs)
 
end
 
end
  
 
return p
 
return p

Revision as of 17:25, 7 January 2020

Documentation for this module may be created at 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