<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://library.hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ATopic_list</id>
	<title>模块:Topic list - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://library.hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ATopic_list"/>
	<link rel="alternate" type="text/html" href="https://library.hmoegirl.com/index.php?title=%E6%A8%A1%E5%9D%97:Topic_list&amp;action=history"/>
	<updated>2026-09-11T20:07:49Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://library.hmoegirl.com/index.php?title=%E6%A8%A1%E5%9D%97:Topic_list&amp;diff=284&amp;oldid=prev</id>
		<title>CaoPig：​创建页面，内容为“-- 中文Minecraft Wiki同名模块，原作者为Star00和MysticNebula70 -- 授权协议：CC BY-NC-SA 3.0  local p = {}  local getArgs = require(&#039;Module:Arguments&#039;).getArgs  function conv(talk) 	-- 关键词替换 	-- 如有字符导致生成错误，请在这里添加转换 	talk = talk 		:gsub(&#039;===(.-)===&#039;, &#039;%1&#039;) 		:gsub(&#039;Special:用户贡献/(%d+%.%d+%.%d+%.%d+)&#039;, &#039;User:ip:%1&#039;) -- handle ip user first 		:gsub(&#039;Special:Contributions/(%d+%.%d+%.%d+%.%d+)&#039;, &#039;…”</title>
		<link rel="alternate" type="text/html" href="https://library.hmoegirl.com/index.php?title=%E6%A8%A1%E5%9D%97:Topic_list&amp;diff=284&amp;oldid=prev"/>
		<updated>2026-08-01T08:21:09Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“-- 中文Minecraft Wiki同名模块，原作者为Star00和MysticNebula70 -- 授权协议：CC BY-NC-SA 3.0  local p = {}  local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs  function conv(talk) 	-- 关键词替换 	-- 如有字符导致生成错误，请在这里添加转换 	talk = talk 		:gsub(&amp;#039;===(.-)===&amp;#039;, &amp;#039;%1&amp;#039;) 		:gsub(&amp;#039;Special:用户贡献/(%d+%.%d+%.%d+%.%d+)&amp;#039;, &amp;#039;User:ip:%1&amp;#039;) -- handle ip user first 		:gsub(&amp;#039;Special:Contributions/(%d+%.%d+%.%d+%.%d+)&amp;#039;, &amp;#039;…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- 中文Minecraft Wiki同名模块，原作者为Star00和MysticNebula70&lt;br /&gt;
-- 授权协议：CC BY-NC-SA 3.0&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
function conv(talk)&lt;br /&gt;
	-- 关键词替换&lt;br /&gt;
	-- 如有字符导致生成错误，请在这里添加转换&lt;br /&gt;
	talk = talk&lt;br /&gt;
		:gsub(&amp;#039;===(.-)===&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;Special:用户贡献/(%d+%.%d+%.%d+%.%d+)&amp;#039;, &amp;#039;User:ip:%1&amp;#039;) -- handle ip user first&lt;br /&gt;
		:gsub(&amp;#039;Special:Contributions/(%d+%.%d+%.%d+%.%d+)&amp;#039;, &amp;#039;User:ip:%1&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;Special:Contribs/(%d+%.%d+%.%d+%.%d+)&amp;#039;, &amp;#039;User:ip:%1&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;用户&amp;#039;, &amp;#039;User&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;user&amp;#039;, &amp;#039;User&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;UTC&amp;#039;, &amp;#039;CST&amp;#039;)&lt;br /&gt;
	return talk&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function titleStrip(talk)&lt;br /&gt;
	-- 论题转换&lt;br /&gt;
	talk = talk&lt;br /&gt;
		:gsub(&amp;#039;===(.-)===&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
	return talk&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function titleConv(title)&lt;br /&gt;
	-- 论题转换&lt;br /&gt;
	title = title&lt;br /&gt;
		:gsub(&amp;#039;&amp;lt;.-&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;%[%[:?.-|(.-)%]%]&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;%[%[:?(.-)%]%]&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
	return title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function table.unique(t, bArray)&lt;br /&gt;
	local check = {}&lt;br /&gt;
	local n = {}&lt;br /&gt;
	local idx = 1&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if not check[v] then&lt;br /&gt;
			if bArray then&lt;br /&gt;
				n[idx] = v&lt;br /&gt;
				idx = idx + 1&lt;br /&gt;
			else&lt;br /&gt;
				n[k] = v&lt;br /&gt;
			end&lt;br /&gt;
			check[v] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return n&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTimeStyle(time)&lt;br /&gt;
	if time == &amp;#039;该讨论主题已被移动&amp;#039; then&lt;br /&gt;
		return &amp;#039;background-color: #fee;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local _, _, year, month, day, hour, min = time:find &amp;#039;(%d+)年(%d+)月(%d+)日%s%(.-%)%s(%d+):(%d+)&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- divided by 86400 is to convert seconds to days&lt;br /&gt;
	local diff = os.difftime(os.time(), os.time {year = year, month = month, day = day, hour = hour, min = min}) / 86400&lt;br /&gt;
&lt;br /&gt;
	if diff &amp;gt;= 30 then&lt;br /&gt;
		return &amp;#039;background-color: #bbb;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if diff &amp;gt;= 7 then&lt;br /&gt;
		return &amp;#039;background-color: #ddd;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if diff &amp;gt;= 1 then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;background-color: #efe;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function close(text)&lt;br /&gt;
	if text:match &amp;#039;closed%-topic%-yes&amp;#039; then&lt;br /&gt;
		return &amp;#039;background-color: #efe;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if text:match &amp;#039;closed%-topic%-no&amp;#039; then&lt;br /&gt;
		return &amp;#039;background-color: #fee;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trim(text)&lt;br /&gt;
	-- remove special strip markers and spaces&lt;br /&gt;
	text = mw.text.killMarkers(text):gsub(&amp;#039;^[%s\t\r\n\f]*(.-)[%s\t\r\n\f]*$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeUserLink(text)&lt;br /&gt;
	if text == &amp;#039;?&amp;#039; then&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
	-- 输入用户名以及带有ip:前缀的ip用户。&lt;br /&gt;
	local ipUser = text:match &amp;#039;ip:(.*)&amp;#039;&lt;br /&gt;
	if ipUser then&lt;br /&gt;
		return &amp;#039;[[Special:用户贡献/&amp;#039; .. ipUser .. &amp;#039;|&amp;#039; .. ipUser .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[[User:&amp;#039; .. text .. &amp;#039;|&amp;#039; .. text .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTalkList(pageName)&lt;br /&gt;
	-- 输入页面名，返回一个包含文本的讨论信息表&lt;br /&gt;
	-- 例如：talklist[1][text]&lt;br /&gt;
	local talk = conv(mw.getCurrentFrame():expandTemplate {title = &amp;#039;:&amp;#039; .. pageName}) .. &amp;#039;==&amp;#039;&lt;br /&gt;
	local talkList = {}&lt;br /&gt;
	for topic in talk:gmatch &amp;#039;==\n(.-)==&amp;#039; do&lt;br /&gt;
		talkList[#talkList + 1] = topic&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return talkList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTitleList(pageName)&lt;br /&gt;
	local talk = titleStrip(mw.getCurrentFrame():expandTemplate {title = &amp;#039;:&amp;#039; .. pageName})&lt;br /&gt;
	local titleList = {}&lt;br /&gt;
	for title in talk:gmatch &amp;#039;==(.-)==&amp;#039; do&lt;br /&gt;
		titleList[#titleList + 1] = titleConv(trim(title))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return titleList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTalkTime(talk)&lt;br /&gt;
	local result = talk:match &amp;#039;[%s%S]*(%d%d%d%d.*) %(CST%)&amp;#039; or &amp;#039;该讨论主题已被移动&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getUserInfo(text)&lt;br /&gt;
	-- 输入讨论的文本，输出和User有关的转换部分table&lt;br /&gt;
	local userList = {}&lt;br /&gt;
	if text:match &amp;#039;[^\n]*User:([^\n]-)%|[^\n]-CST&amp;#039; == nil then&lt;br /&gt;
		return {userNum = &amp;#039;-&amp;#039;, uniqueUserNum = &amp;#039;-&amp;#039;, firstUser = &amp;#039;-&amp;#039;, lastUser = &amp;#039;-&amp;#039;}&lt;br /&gt;
	end&lt;br /&gt;
	for user in text:gmatch &amp;#039;[^\n]*User:([^\n]-)%|[^\n]-CST&amp;#039; do&lt;br /&gt;
		userList[#userList + 1] = user&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local userNum = #userList&lt;br /&gt;
	local uniqueUserNum = #(table.unique(userList, true))&lt;br /&gt;
&lt;br /&gt;
	return {userNum = userNum, uniqueUserNum = uniqueUserNum, firstUser = userList[1], lastUser = userList[#userList]}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function generateTable(pageName, talkTitle, talkText)&lt;br /&gt;
	local body = {&lt;br /&gt;
		&amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible talktable&amp;quot; style=&amp;quot;text-align: center; margin: 0 auto; width: 100%;&amp;quot;&amp;#039;,&lt;br /&gt;
		&amp;#039;|-&amp;#039;,&lt;br /&gt;
		&amp;#039;! # !! 话题 !! 发言条数 !! 参与人数 &amp;#039;,&lt;br /&gt;
		&amp;#039;! class=&amp;quot;talkpage-topic-list-author&amp;quot; | 发起者&amp;#039;,&lt;br /&gt;
		&amp;#039;! class=&amp;quot;talkpage-topic-list-last-editor&amp;quot; | 最后发言者&amp;#039;,&lt;br /&gt;
		&amp;#039;! class=&amp;quot;talkpage-topic-list-time&amp;quot; | 最后发言时间（CST）&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local userInfo, time&lt;br /&gt;
	local userStyle, uniqueUserStyle, timeStyle, serialStyle&lt;br /&gt;
&lt;br /&gt;
	for i = 1, #talkText do&lt;br /&gt;
		time, userInfo = getTalkTime(talkText[i]), getUserInfo(talkText[i])&lt;br /&gt;
		-- 对表格添加样式&lt;br /&gt;
		userStyle = userInfo.userNum == 1 and &amp;#039;background-color: #fcc;&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
		uniqueUserStyle = userInfo.uniqueUserNum == 1 and &amp;#039;background-color: #fcc;&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
		timeStyle = getTimeStyle(time)&lt;br /&gt;
		serialStyle = close(talkText[i])&lt;br /&gt;
		-- 组装表格一个话题的部分&lt;br /&gt;
		table.insert(&lt;br /&gt;
			body,&lt;br /&gt;
			table.concat(&lt;br /&gt;
				{&lt;br /&gt;
					&amp;#039;|-&amp;#039;,&lt;br /&gt;
					&amp;#039;! style=&amp;quot;&amp;#039; .. serialStyle .. &amp;#039;&amp;quot; | &amp;#039; .. i,&lt;br /&gt;
					&amp;#039;| [[&amp;#039; .. pageName .. &amp;#039;#&amp;#039; .. talkTitle[i] .. &amp;#039;|&amp;#039; .. talkTitle[i].. &amp;#039;]]&amp;#039;,&lt;br /&gt;
					&amp;#039;| style=&amp;quot;&amp;#039; .. userStyle .. &amp;#039;&amp;quot; | &amp;#039; .. userInfo.userNum,&lt;br /&gt;
				        &amp;#039;| style=&amp;quot;&amp;#039; .. uniqueUserStyle .. &amp;#039;&amp;quot; | &amp;#039; .. userInfo.uniqueUserNum,&lt;br /&gt;
					&amp;#039;| class=&amp;quot;talkpage-topic-list-author&amp;quot; | &amp;#039; .. makeUserLink(userInfo.firstUser),&lt;br /&gt;
					&amp;#039;| class=&amp;quot;talkpage-topic-list-last-editor&amp;quot; style=&amp;quot;&amp;#039; .. timeStyle .. &amp;#039;&amp;quot; | &amp;#039; .. makeUserLink(userInfo.lastUser),&lt;br /&gt;
					&amp;#039;| class=&amp;quot;talkpage-topic-list-time&amp;quot; style=&amp;quot;&amp;#039; .. timeStyle .. &amp;#039;&amp;quot; | &amp;#039; .. time&lt;br /&gt;
				},&lt;br /&gt;
				&amp;#039;\n&amp;#039;&lt;br /&gt;
			)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(body, &amp;#039;|}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return table.concat(body, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
&lt;br /&gt;
	local talkTitle, talkText = getTitleList(args[1]), getTalkList(args[1])&lt;br /&gt;
	if #talkTitle ~= #talkText then&lt;br /&gt;
		return error &amp;#039;Topic list获取错误。&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, #talkTitle do&lt;br /&gt;
		talkTitle[i] = f:preprocess(talkTitle[i])&lt;br /&gt;
	end&lt;br /&gt;
	return generateTable(args[1], talkTitle, talkText)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>CaoPig</name></author>
	</entry>
</feed>