Module documentation

Implements {{reply to}}.

Module Quality edit

Test Status
Module:Reply to success: 20, error: 0, skipped: 0

Usage edit

{{#invoke:Reply to|replyTo}}

local p = {}

require("strict")
local _format = require("Module:TNT").format
local function format(msg, ...)
	return _format('I18n/reply.tab', msg, ...)
end

local TEMPLATE_LINK = mw.text.tag(
	'span',
	{
		class = 'monospaced nowrap',
		style = 'font-family:monospace,monospace;white-space:nowrap'
	},
	mw.text.nowiki('{{')
	.. '[[Template:reply to|reply to]]'
	.. mw.text.nowiki('}}')
)

local function makeError(msg, ...)
	return mw.text.tag(
		'strong',
		{ class = 'error' },
		format('error', TEMPLATE_LINK, format(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('error-forbidden-input') end
				args[k] = title.rootText
			end
		elseif v == '' and k:sub(0,5) == 'label' then
			args[k] = '​'
		else
			args[k] = v
		end
	end

	if usernames > (tonumber(frame.args.max) or 50) then
		return makeError('error-too-many-params', (frame.args.max or 50))
	else
		if usernames < 1 then
			if frame.args.example then args[1] = frame.args.example else return makeError('error-no-username') end
		end

		args['label1'] = args['label1'] or args['label']
		local isFirst = true
		local outStr = args['prefix'] or '@'

		local msgComma	= mw.message.new('comma-separator'):plain()
		local msgAnd	= mw.message.new('and'):plain()
		local msgSpace	= mw.message.new('word-separator'):plain()
		local msgColon	= mw.message.new('colon-separator'):plain()

		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 .. msgComma
					end

					if ((i == maxArg) and (args['c'] ~= '')) then
						outStr = outStr
							.. (args['c']
								and (msgSpace .. args['c'])
								or  msgAnd)
							.. msgSpace
					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 msgColon)
		return mw.text.tag(
			'span',
			{ class = 'template-ping' },
			outStr
		)
	end
end

return p