Jump to content

Module:Reply to: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m error message for too many names should default to 50, not 20 (not that this is ever likely to be a problem)
handle blank inputs
Line 6: Line 6:
local args = {}
local args = {}
local maxArg = 0
local maxArg = 0
local usernames = 0
for k, v in pairs(origArgs) do
for k, v in pairs(origArgs) do
if type(k) == 'number' then
if type(k) == 'number' then
if v:match('%S') then
if v:match('%S') then
if k > maxArg then maxArg = k end
if k > maxArg then maxArg = k end
usernames = usernames + 1
local title = mw.title.new(v)
local title = mw.title.new(v)
if not title then
if not title then
Line 21: Line 23:
end
end


if maxArg == 0 then
if usernames < 1 then
if frame.args.example then args[1] = frame.args.example else return htmlerror{'Error in [[Template:Reply to]]: Username not given.'} end
if frame.args.example then args[1] = frame.args.example else return htmlerror{'Error in [[Template:Reply to]]: Username not given.'} end
end
end


if maxArg > (tonumber(frame.args.max) or 50) then
if usernames > (tonumber(frame.args.max) or 50) then
return htmlerror{'Error in [[Template:Reply to]]: More than '..tostring(frame.args.max or 50)..' names specified.'}
return htmlerror{'Error in [[Template:Reply to]]: More than '..tostring(frame.args.max or 50)..' names specified.'}
else
else
local isfirst = true
local outStr = '<span class="template-ping">'..(args['prefix'] or '@')..'[[:User:'..args[1]..'|'..((args['label1'] or args['label']) or args[1])..']]'
local outStr = '<span class="template-ping">'
for i = 2, maxArg do
for i = 1, maxArg do
if ( (maxArg > 2) or ((maxArg == 2) and (args['c'] == '')) ) then outStr = outStr.."," end
if args[i] then
if i == maxArg then outStr = outStr.." "..(args['c'] or "and") end
if isfirst then
outStr = outStr.." [[:User:"..args[i].."|"..(args['label'..tostring(i)] or args[i]).."]]"
outStr = outStr..(args['prefix'] or '@')..'[[:User:'..args[i]..'|'..((args['label1'] or args['label']) or args[i])..']]'
isfirst = false
else
if ( (usernames > 2) or ((usernames == 2) and (args['c'] == '')) ) then outStr = outStr.."," end
if i == maxArg then outStr = outStr.." "..(args['c'] or "and") end
outStr = outStr.." [[:User:"..args[i].."|"..(args['label'..tostring(i)] or args[i]).."]]"
end
end
end
end
outStr = outStr..(args['p'] or ":").."</span>"
outStr = outStr..(args['p'] or ":").."</span>"

Revision as of 22:15, 18 July 2017

local p = {}
local htmlerror = require('Module:Error').error

function p.replyto(frame)
	local origArgs = frame:getParent().args
	local args = {}
	local maxArg = 0
	local usernames = 0
	for k, v in pairs(origArgs) do
		if type(k) == 'number' then
			if v:match('%S') then
				if k > maxArg then maxArg = k end
				usernames = usernames + 1
				local title = mw.title.new(v)
				if not title then
					return htmlerror{'Error in [[Template:Reply to]]: Input contains forbidden characters.'}
				end
				args[k] = title.baseText
			end
		else
			args[k] = v
		end
	end

	if usernames < 1 then
		if frame.args.example then args[1] = frame.args.example else return htmlerror{'Error in [[Template:Reply to]]: Username not given.'} end
	end

	if usernames > (tonumber(frame.args.max) or 50) then
		return htmlerror{'Error in [[Template:Reply to]]: More than '..tostring(frame.args.max or 50)..' names specified.'}
	else
		local isfirst = true
		local outStr = '<span class="template-ping">'
		for i = 1, maxArg do
			if args[i] then
				if isfirst then
					outStr = outStr..(args['prefix'] or '@')..'[[:User:'..args[i]..'|'..((args['label1'] or args['label']) or args[i])..']]'
					isfirst = false
				else
					if ( (usernames > 2) or ((usernames == 2) and (args['c'] == '')) ) then outStr = outStr.."," end
					if i == maxArg then outStr = outStr.." "..(args['c'] or "and") end
					outStr = outStr.." [[:User:"..args[i].."|"..(args['label'..tostring(i)] or args[i]).."]]"
				end
			end
		end
		outStr = outStr..(args['p'] or ":").."</span>"
		return outStr
	end
end

return p