Module:Reply to: Difference between revisions

From Omniversalis
Content added Content deleted
m (error message for too many names should default to 50, not 20 (not that this is ever likely to be a problem))
 
m (1 revision imported)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local p = {}
local p = {}

local htmlerror = require('Module:Error').error
local function makeError(msg)
msg ='Error in [[Template:Reply to]]: ' .. msg
return mw.text.tag('strong', {['class']='error'}, msg)
end


function p.replyto(frame)
function p.replyto(frame)
local origArgs = frame:getParent().args
local origArgs = frame:getParent().args
local args = {}
local args = {}
local maxArg = 0
local maxArg = 1
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 mw.ustring.match(v,'%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 return makeError('Input contains forbidden characters.') end
args[k] = title.rootText
return htmlerror{'Error in [[Template:Reply to]]: Input contains forbidden characters.'}
end
args[k] = title.baseText
end
end
elseif v == '' and k:sub(0,5) == 'label' then
args[k] = '​'
else
else
args[k] = v
args[k] = v
Line 21: Line 27:
end
end


if maxArg == 0 then
if usernames > (tonumber(frame.args.max) or 50) then
return makeError(string.format(
if frame.args.example then args[1] = frame.args.example else return htmlerror{'Error in [[Template:Reply to]]: Username not given.'} end
'More than %s names specified.',
end
tostring(frame.args.max or 50)

))
if maxArg > (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
else
if usernames < 1 then
local outStr = '<span class="template-ping">'..(args['prefix'] or '@')..'[[:User:'..args[1]..'|'..((args['label1'] or args['label']) or args[1])..']]'
if frame.args.example then args[1] = frame.args.example else return makeError('Username not given.') end
for i = 2, maxArg do
end
if ( (maxArg > 2) or ((maxArg == 2) and (args['c'] == '')) ) then outStr = outStr.."," end
args['label1'] = args['label1'] or args['label']
if i == maxArg then outStr = outStr.." "..(args['c'] or "and") end
local isfirst = true
outStr = outStr.." [[:User:"..args[i].."|"..(args['label'..tostring(i)] or args[i]).."]]"
local outStr = args['prefix'] or '@'
for i = 1, maxArg do
if args[i] then
if isfirst then
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
end
outStr = string.format(
'%s[[User:%s|%s]]',
outStr,
args[i],
args['label'..tostring(i)] or args[i]
)
end
end
end
outStr = outStr..(args['p'] or ":").."</span>"
outStr = outStr..(args['p'] or ':')
return outStr
return mw.text.tag('span', {['class']='template-ping'}, outStr)
end
end
end
end

Latest revision as of 03:27, 12 May 2022

This module is used by {{Reply to}} to trigger a notification to one or several registered user(s) you are replying to in a discussion.

Usage from wikitext[edit]

This module cannot be used directly from wikitext. Please use the {{Reply to}} template instead.

Usage within templates[edit]

{{#invoke:Reply to|replyto|<noinclude>example=example name</noinclude>|max=maximum number of names}}
  • The |example= parameter sets the name that will show when the template page is viewed. This parameter should be surrounded by <noinclude>...</noinclude> so that it is not transcluded with the parent template, and the parent template will show an error message if no names are specified.
  • The |max= parameter sets the maximum number of names that the template will accept. If not specified, it defaults to 50 (which is the maximum number that Echo currently supports as of August 2015). If this number of names is exceeded, the parent template will return an error message.



local p = {}

local function makeError(msg)
	msg ='Error in [[Template:Reply to]]: ' .. msg
	return mw.text.tag('strong', {['class']='error'}, msg)
end

function p.replyto(frame)
	local origArgs = frame:getParent().args
	local args = {}
	local maxArg = 1
	local usernames = 0
	for k, v in pairs(origArgs) do
		if type(k) == 'number' then
			if mw.ustring.match(v,'%S') then
				if k > maxArg then maxArg = k end
				usernames = usernames + 1
				local title = mw.title.new(v)
				if not title then return makeError('Input contains forbidden characters.') end
				args[k] = title.rootText
			end
		elseif v == '' and k:sub(0,5) == 'label' then
			args[k] = '&#x200B;'
		else
			args[k] = v
		end
	end

	if usernames > (tonumber(frame.args.max) or 50) then
		return makeError(string.format(
			'More than %s names specified.',
			tostring(frame.args.max or 50)
		))
	else
		if usernames < 1 then
			if frame.args.example then args[1] = frame.args.example else return makeError('Username not given.') end
		end
		args['label1'] = args['label1'] or args['label']
		local isfirst = true
		local outStr = args['prefix'] or '@'
		for i = 1, maxArg do
			if args[i] then
				if isfirst then
					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
				end
				outStr = string.format(
					'%s[[User:%s|%s]]',
					outStr,
					args[i],
					args['label'..tostring(i)] or args[i]
				)
			end
		end
		outStr = outStr..(args['p'] or ':')
		return mw.text.tag('span', {['class']='template-ping'}, outStr)
	end
end

return p