<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3AReply_to</id>
	<title>Module:Reply to - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3AReply_to"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:Reply_to&amp;action=history"/>
	<updated>2026-06-30T20:10:27Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Module:Reply_to&amp;diff=2691430&amp;oldid=prev</id>
		<title>imported&gt;Tigerzeng：​Wikipedia:互助客栈/其他#Module:Reply_to及相关模版改2版：套用Special:Permalink/78384865</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:Reply_to&amp;diff=2691430&amp;oldid=prev"/>
		<updated>2023-08-13T11:37:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/%E4%BA%92%E5%8A%A9%E5%AE%A2%E6%A0%88/%E5%85%B6%E4%BB%96#Module:Reply_to.E5.8F.8A.E7.9B.B8.E5.85.B3.E6.A8.A1.E7.89.88.E6.94.B92.E7.89.88&quot; class=&quot;extiw&quot; title=&quot;wikipedia:互助客栈/其他&quot;&gt;Wikipedia:互助客栈/其他#Module:Reply_to及相关模版改2版&lt;/a&gt;：套用&lt;a href=&quot;/wiki/Special:%E5%9B%BA%E5%AE%9A%E9%93%BE%E6%8E%A5/78384865&quot; title=&quot;Special:固定链接/78384865&quot;&gt;Special:Permalink/78384865&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- MediaWiki后台配置项$wgEchoMaxMentionsCount。这个配置项决定一笔带签名的编辑最多可以同时提及多少使用者。&lt;br /&gt;
-- 维基媒体旗下的wiki站点将这个值设定为50。若未来该配置出现变更，或将此模块使用在其他wiki站点，需要修改此值，在本模组内也仅需修改此值。&lt;br /&gt;
local WG_ECHO_MAX_MENTIONS_COUNT = 50&lt;br /&gt;
&lt;br /&gt;
-- 引入[[Module:Error]]&lt;br /&gt;
local mod_error = require(&amp;#039;Module:Error&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	创建一个由于不当使用模组而产生的错误消息。&lt;br /&gt;
&lt;br /&gt;
	`msg`：错误消息的内容。&lt;br /&gt;
]]&lt;br /&gt;
local function errormsg(msg)&lt;br /&gt;
	return mod_error.error{ [1] = &amp;#039;[[Module:Reply to]]錯誤：&amp;#039; .. msg }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	创建一个由于使用者不当使用模版、完全不提供任何使用者名称而产生的错误消息。&lt;br /&gt;
&lt;br /&gt;
	`template`：使用者不当使用的模版名称。&lt;br /&gt;
]]&lt;br /&gt;
local function nouser(template)&lt;br /&gt;
	return mod_error.error{ [1] = &amp;#039;使用[[&amp;#039; ..  template .. &amp;#039;]]時出現錯誤：並無提供-{zh-hant:使用者名稱;zh-hans:用户名;}-。模板用法見於[[&amp;#039; ..  template .. &amp;#039;]]。&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	创建一个由于使用者不当使用模版、提供了多于最大数量的使用者名称而产生的错误消息。&lt;br /&gt;
&lt;br /&gt;
	`template`：使用者不当使用的模版名称。&lt;br /&gt;
	`count`：模版最多允许加入的使用者个数。&lt;br /&gt;
]]&lt;br /&gt;
local function maxuser(template, count)&lt;br /&gt;
	return mod_error.error{ [1] = &amp;#039;[[&amp;#039; ..  template .. &amp;#039;]]最多-{zh-hans:支持;zh-hant:支援}-提及&amp;#039; .. (count or WG_ECHO_MAX_MENTIONS_COUNT) .. &amp;#039;个-{zh-hant:使用者;zh-hans:用户;}-。如果需要提及超过&amp;#039; .. (count or WG_ECHO_MAX_MENTIONS_COUNT) .. &amp;#039;个-{zh-hant:使用者;zh-hans:用户;}-，必须多次留言。模板用法見於[[&amp;#039; ..  template .. &amp;#039;]]。&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	创建一个由于使用者不当使用模版、试图以更大数值绕过设定的最大提及数量而产生的错误消息。&lt;br /&gt;
&lt;br /&gt;
	`template`：使用者不当使用的模版名称。&lt;br /&gt;
	`max`：试图设定的最大值。&lt;br /&gt;
]]&lt;br /&gt;
local function invalidmaxoverride(template, max)&lt;br /&gt;
	return mod_error.error{ [1] = &amp;#039;试图让[[&amp;#039; ..  template .. &amp;#039;]]允许一次性提及&amp;#039; .. max .. &amp;#039;位-{zh-hant:使用者;zh-hans:用户;}-。MediaWiki限制一次性最多只能提及&amp;#039; .. WG_ECHO_MAX_MENTIONS_COUNT .. &amp;#039;位-{zh-hant:使用者;zh-hans:用户;}-。&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	创建一个由于使用者不当使用模版、试图提及非法使用者名称而产生的错误消息。&lt;br /&gt;
&lt;br /&gt;
	`username`：非法的使用者名称。&lt;br /&gt;
]]&lt;br /&gt;
local function invalidusername(username)&lt;br /&gt;
	return mod_error.error{ [1] = &amp;#039;试图提及的-{zh-hant:使用者名稱;zh-hans:用户名;}-「&amp;#039; .. username ..&amp;#039;」在技术上不合法。&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	模块核心内部调用代码。输出字符串编码的提及内容，以及错误消息。&lt;br /&gt;
&lt;br /&gt;
	`echo`：是否触发MediaWiki的echo机制。默认为true。&lt;br /&gt;
	`args`：参数列表。允许包含的内容有：&lt;br /&gt;
		`1`, `2`, ...：需要提及的使用者名称。只应当从模版参数间接获取。&lt;br /&gt;
		`label1`, `label2`, ...：使用者管道链接显示的标签。只应当从模版参数间接读取。&lt;br /&gt;
		`c`、`c2`：用作连接各个被提及的使用者的连接符号。如果只有一个使用者，没有连接符号；如果只有两个使用者，使用`c2`；如果有三个或更多使用者，最后一对使用者之间使用`c2`连接，其他使用`c`连接。默认`c`和`c2`都是「、」。只应当从模组参数直接获取。&lt;br /&gt;
			`c2`有fallback机制。如果没有指定`c2`，但是指定了`c`，那么`c2`将会使用`c`的值。只应当从模组参数直接获取。&lt;br /&gt;
		`@`：用作替代输出结果前缀「@」字样的文字。如不指定则为「@」。只应当从模组参数直接获取。&lt;br /&gt;
		`p`：用作替代输出结果后缀「：」字样的文字。如不指定则为「：」。只应当从模组参数直接获取。&lt;br /&gt;
		`max`：用作重新设定默认最大提及数量的值。只允许重新设定为更小的数字，否则该参数无效。只应当从模组参数直接获取。&lt;br /&gt;
		`template`：使用者调用该方法所使用的模版名称。用作错误消息输出。原则上调用此方法者都需要指定该值，但是该方法也提供一个绝对正确的默认值：「Template:Reply to」。只应当从模组参数直接获取。&lt;br /&gt;
		`example`：模组进入示范模式，示范模式会忽略所有提供的使用者名称，只展示User:Example。只应当从模组参数直接获取。&lt;br /&gt;
]]&lt;br /&gt;
local function reply_core(args, echo)&lt;br /&gt;
	local ret = {}			-- 返回内容&lt;br /&gt;
	local error = {}		-- 捕获的错误文字&lt;br /&gt;
&lt;br /&gt;
	local template = args.template or &amp;#039;Template:Reply to&amp;#039;&lt;br /&gt;
	if echo == nil then echo = true end&lt;br /&gt;
&lt;br /&gt;
	-- 设定最大提及数量的override。&lt;br /&gt;
	local max = tonumber(args.max) or WG_ECHO_MAX_MENTIONS_COUNT&lt;br /&gt;
	if max &amp;gt; WG_ECHO_MAX_MENTIONS_COUNT then&lt;br /&gt;
		error[#error + 1] = invalidmaxoverride(template, max)&lt;br /&gt;
		max = WG_ECHO_MAX_MENTIONS_COUNT&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- 模版进入示范模式。&lt;br /&gt;
	if args.example then&lt;br /&gt;
		local link&lt;br /&gt;
		if echo then&lt;br /&gt;
			link = &amp;#039;-{[[User:&amp;#039; .. args.example .. &amp;#039;|&amp;#039; .. args.example .. &amp;#039;]]}-&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			local url = mw.uri.fullUrl(mw.site.namespaces.User.name .. &amp;#039;:&amp;#039; .. args.example)&lt;br /&gt;
			url = tostring(url)&lt;br /&gt;
			link = string.format(&amp;#039;-{[%s %s]}-&amp;#039;, url, args.example)&lt;br /&gt;
		end&lt;br /&gt;
		return {&lt;br /&gt;
			[&amp;#039;body&amp;#039;] = (args[&amp;#039;@&amp;#039;] or &amp;#039;@&amp;#039;) .. link .. (args[&amp;#039;p&amp;#039;] or &amp;#039;：&amp;#039;),&lt;br /&gt;
			[&amp;#039;error&amp;#039;] = &amp;#039;&amp;#039;,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- 模版不在示范模式。&lt;br /&gt;
	-- 生成每一位使用者的wikilink，以table/array方式存储，暂存至ret当中。&lt;br /&gt;
	local i = 0&lt;br /&gt;
	while true do&lt;br /&gt;
		username = args[i + 1]  -- Lua的数组下标从1开始&lt;br /&gt;
		if (username ~= nil and username ~= &amp;#039;&amp;#039;) then&lt;br /&gt;
			-- 检查是否超出数量&lt;br /&gt;
			if i &amp;gt;= max then&lt;br /&gt;
				error[#error + 1] = maxuser(template, max)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- 检查用户名是否合法&lt;br /&gt;
			local success, title = pcall(mw.title.new, username)&lt;br /&gt;
			-- 註：因為username不該包含命名空間，因此經過解析後必須在條目命名空間&lt;br /&gt;
			if not success or not title or title.namespace ~= 0 then&lt;br /&gt;
				error[#error + 1] = invalidusername(username)&lt;br /&gt;
			else&lt;br /&gt;
				if echo then&lt;br /&gt;
					ret[#ret + 1] = &amp;#039;-{[[User:&amp;#039; .. username .. &amp;#039;|&amp;#039; .. (args[&amp;#039;label&amp;#039; .. (i + 1)] or username)  .. &amp;#039;]]}-&amp;#039;&lt;br /&gt;
				else&lt;br /&gt;
					local url = mw.uri.fullUrl(mw.site.namespaces.User.name .. &amp;#039;:&amp;#039; .. username)&lt;br /&gt;
					url = tostring(url)&lt;br /&gt;
					local label = args[&amp;#039;label&amp;#039; .. tostring(i + 1)]&lt;br /&gt;
					url = string.format(&amp;#039;-{[%s %s]}-&amp;#039;, url, label or username)&lt;br /&gt;
					ret[#ret + 1] = url&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		else&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret_text = &amp;#039;&amp;#039;&lt;br /&gt;
	if #ret &amp;lt;= 0 then&lt;br /&gt;
		if i &amp;lt;= 0 then&lt;br /&gt;
			-- 完全没有提供使用者名称。抛出错误消息。&lt;br /&gt;
			error[#error + 1] = nouser(template)&lt;br /&gt;
		else&lt;br /&gt;
			-- 有提及使用者，但是没有一个使用者的名称是合法的。由于不合法使用者名称已经抛出了消息，所以这里不抛出错误消息。&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		ret_text = mw.text.listToText(ret, (args[&amp;#039;c&amp;#039;] or &amp;#039;、&amp;#039;), (args[&amp;#039;c2&amp;#039;] or args[&amp;#039;c&amp;#039;] or &amp;#039;、&amp;#039;))&lt;br /&gt;
		ret_text = (args[&amp;#039;@&amp;#039;] or &amp;#039;@&amp;#039;) .. ret_text .. (args[&amp;#039;p&amp;#039;] or &amp;#039;：&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret_err = mw.text.listToText(error, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return {&lt;br /&gt;
		[&amp;#039;body&amp;#039;] = ret_text,&lt;br /&gt;
		[&amp;#039;error&amp;#039;] = ret_err,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------- 导出方法 -----------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	对传入模版/模组的参数进行预先处理。&lt;br /&gt;
	处理原则：传入模版的参数`1`、`2`、`label1`、`label2`等，与传入模组的参数`c`、`c2`、`@`、`p`合并。&lt;br /&gt;
	此外，对于参数 `1`、`2` 和 `label1`、`label2` 等，该方法会将它们按自然数顺序重组。因此传入编号1、2、4、10的参数，会被重组为1、2、3、4。&lt;br /&gt;
]]&lt;br /&gt;
local function getargs(frame)&lt;br /&gt;
	local moduleargs = frame.args	-- 传入模组的参数，{{#invoke:Reply to|method|...}}&lt;br /&gt;
	local templateargs = {}			-- 传入模版的参数，{{Reply to|...}}&lt;br /&gt;
	if frame:getParent() then&lt;br /&gt;
		templateargs = frame:getParent().args&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tmp = {}&lt;br /&gt;
	-- 加入传入模版的参数&lt;br /&gt;
	for k, v in pairs(templateargs) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			tmp[k] = v&lt;br /&gt;
		elseif k:sub(0, 5) == &amp;#039;label&amp;#039; then&lt;br /&gt;
			if v == &amp;#039;&amp;#039; then&lt;br /&gt;
				tmp[k] = &amp;#039;&amp;amp;#x200B;&amp;#039; -- 如果提供了labelx参数，但是参数数值留空，则改为不换行空格&amp;amp;nbsp;。&lt;br /&gt;
			else&lt;br /&gt;
				tmp[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- 重组加入模版的参数&lt;br /&gt;
	local n = 1&lt;br /&gt;
	local merged = {}&lt;br /&gt;
	for k, v in pairs(tmp) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			merged[n] = v&lt;br /&gt;
			merged[&amp;#039;label&amp;#039; .. n] = tmp[&amp;#039;label&amp;#039; .. k]&lt;br /&gt;
			n = n + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- 加入传入模组的参数&lt;br /&gt;
	local allowedfixednameparam = {&lt;br /&gt;
		[&amp;#039;c&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;c2&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;@&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;p&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;max&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;template&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;example&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
	for k, v in pairs(moduleargs) do&lt;br /&gt;
		if allowedfixednameparam[k] then&lt;br /&gt;
			merged[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return merged&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	{{Reply to}}的主入口。&lt;br /&gt;
]]&lt;br /&gt;
function p.replyto(frame)&lt;br /&gt;
	local args = getargs(frame)&lt;br /&gt;
	args[&amp;#039;template&amp;#039;] = args[&amp;#039;template&amp;#039;] or (frame:getParent() and frame:getParent():getTitle()) or &amp;#039;Template:Reply to&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local data = reply_core(args, true)&lt;br /&gt;
	return mw.text.tag(&amp;#039;span&amp;#039;, {[&amp;#039;class&amp;#039;]=&amp;#039;template-ping&amp;#039;}, data[&amp;#039;body&amp;#039;]) .. data[&amp;#039;error&amp;#039;]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	p.replyto的兼容用别名。以函数指针实现，因而在调用此方法时可以少一层嵌套。&lt;br /&gt;
]]&lt;br /&gt;
p.ping = p.replyto&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	{{Unping}}的主入口。&lt;br /&gt;
]]&lt;br /&gt;
function p.unping(frame)&lt;br /&gt;
	local args = getargs(frame)&lt;br /&gt;
	args[&amp;#039;template&amp;#039;] = args[&amp;#039;template&amp;#039;] or (frame:getParent() and frame:getParent():getTitle()) or &amp;#039;Template:Unping&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local data = reply_core(args, false)&lt;br /&gt;
	return mw.text.tag(&amp;#039;span&amp;#039;, {[&amp;#039;class&amp;#039;]=&amp;#039;plainlinks&amp;#039;}, data[&amp;#039;body&amp;#039;]) .. data[&amp;#039;error&amp;#039;]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	{{Noping}}的主入口。&lt;br /&gt;
]]&lt;br /&gt;
function p.hidden_ping(frame)&lt;br /&gt;
	local args = getargs(frame)&lt;br /&gt;
	args[&amp;#039;template&amp;#039;] = args[&amp;#039;template&amp;#039;] or (frame:getParent() and frame:getParent():getTitle()) or &amp;#039;Template:Noping&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local data = reply_core(args, true)&lt;br /&gt;
	return mw.text.tag(&amp;#039;span&amp;#039;, {[&amp;#039;style&amp;#039;]=&amp;#039;display:none&amp;#039;}, data[&amp;#039;body&amp;#039;]) .. data[&amp;#039;error&amp;#039;]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Tigerzeng</name></author>
	</entry>
</feed>