<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://blockland.wiki/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AQQ%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95</id>
	<title>模块:QQ聊天记录 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://blockland.wiki/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AQQ%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95"/>
	<link rel="alternate" type="text/html" href="https://blockland.wiki/index.php?title=%E6%A8%A1%E5%9D%97:QQ%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95&amp;action=history"/>
	<updated>2026-10-19T09:59:49Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://blockland.wiki/index.php?title=%E6%A8%A1%E5%9D%97:QQ%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95&amp;diff=7257&amp;oldid=prev</id>
		<title>KK：​创建页面，内容为“local p = {}  local function escapeHtml(s) 	return mw.text.nowiki(s or &#039;&#039;) end  local function formatMessage(text) 	if not text or text == &#039;&#039; then 		return &#039;&lt;span class=&quot;qqchat-empty&quot;&gt;（无文字消息）&lt;/span&gt;&#039; 	end  	text = escapeHtml(text)  	-- 高亮 @用户名 	text = text:gsub(&#039;(@[^%s@]+)&#039;, &#039;&lt;span class=&quot;qqchat-mention&quot;&gt;%1&lt;/span&gt;&#039;)  	-- 简单支持换行 	text = text:gsub(&#039;\n&#039;, &#039;&lt;br&gt;&#039;)  	return text end  function p.main(frame) 	local args = frame:getPa…”</title>
		<link rel="alternate" type="text/html" href="https://blockland.wiki/index.php?title=%E6%A8%A1%E5%9D%97:QQ%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%95&amp;diff=7257&amp;oldid=prev"/>
		<updated>2026-08-13T02:58:29Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“local p = {}  local function escapeHtml(s) 	return mw.text.nowiki(s or &amp;#039;&amp;#039;) end  local function formatMessage(text) 	if not text or text == &amp;#039;&amp;#039; then 		return &amp;#039;&amp;lt;span class=&amp;quot;qqchat-empty&amp;quot;&amp;gt;（无文字消息）&amp;lt;/span&amp;gt;&amp;#039; 	end  	text = escapeHtml(text)  	-- 高亮 @用户名 	text = text:gsub(&amp;#039;(@[^%s@]+)&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;qqchat-mention&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&amp;#039;)  	-- 简单支持换行 	text = text:gsub(&amp;#039;\n&amp;#039;, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)  	return text end  function p.main(frame) 	local args = frame:getPa…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function escapeHtml(s)&lt;br /&gt;
	return mw.text.nowiki(s or &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatMessage(text)&lt;br /&gt;
	if not text or text == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;qqchat-empty&amp;quot;&amp;gt;（无文字消息）&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = escapeHtml(text)&lt;br /&gt;
&lt;br /&gt;
	-- 高亮 @用户名&lt;br /&gt;
	text = text:gsub(&amp;#039;(@[^%s@]+)&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;qqchat-mention&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- 简单支持换行&lt;br /&gt;
	text = text:gsub(&amp;#039;\n&amp;#039;, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local title = args[&amp;#039;标题&amp;#039;] or args[&amp;#039;title&amp;#039;] or &amp;#039;QQ聊天记录&amp;#039;&lt;br /&gt;
	local content = args[&amp;#039;内容&amp;#039;] or args[&amp;#039;content&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local collapsed = args[&amp;#039;折叠&amp;#039;] or args[&amp;#039;collapsed&amp;#039;] or &amp;#039;yes&amp;#039;&lt;br /&gt;
	local note = args[&amp;#039;说明&amp;#039;] or args[&amp;#039;note&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
	-- 去除首尾空白&lt;br /&gt;
	content = mw.text.trim(content)&lt;br /&gt;
&lt;br /&gt;
	local messages = {}&lt;br /&gt;
&lt;br /&gt;
	-- 按行解析&lt;br /&gt;
	for line in content:gmatch(&amp;#039;[^\r\n]+&amp;#039;) do&lt;br /&gt;
		line = mw.text.trim(line)&lt;br /&gt;
&lt;br /&gt;
		if line ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			-- 格式：&lt;br /&gt;
			-- 用户名: 2025-03-15 20:45:03 消息&lt;br /&gt;
			local username, date, time, message =&lt;br /&gt;
				line:match(&amp;#039;^(.-):%s*(%d%d%d%d%-%d%d%-%d%d)%s+(%d%d:%d%d:%d%d)%s*(.*)$&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			if username and date and time then&lt;br /&gt;
				table.insert(messages, {&lt;br /&gt;
					username = mw.text.trim(username),&lt;br /&gt;
					datetime = date .. &amp;#039; &amp;#039; .. time,&lt;br /&gt;
					message = message or &amp;#039;&amp;#039;&lt;br /&gt;
				})&lt;br /&gt;
			else&lt;br /&gt;
				-- 无法识别的行附加到上一条消息&lt;br /&gt;
				if #messages &amp;gt; 0 then&lt;br /&gt;
					local old = messages[#messages].message or &amp;#039;&amp;#039;&lt;br /&gt;
					if old ~= &amp;#039;&amp;#039; then&lt;br /&gt;
						old = old .. &amp;#039;\n&amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
					messages[#messages].message = old .. line&lt;br /&gt;
				else&lt;br /&gt;
					table.insert(messages, {&lt;br /&gt;
						username = &amp;#039;&amp;#039;,&lt;br /&gt;
						datetime = &amp;#039;&amp;#039;,&lt;br /&gt;
						message = line,&lt;br /&gt;
						unparsed = true&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local root = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	root:addClass(&amp;#039;qqchat&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if collapsed ~= &amp;#039;no&amp;#039; and collapsed ~= &amp;#039;否&amp;#039; and collapsed ~= &amp;#039;false&amp;#039; then&lt;br /&gt;
		root:addClass(&amp;#039;mw-collapsible&amp;#039;)&lt;br /&gt;
		root:addClass(&amp;#039;mw-collapsed&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		root:addClass(&amp;#039;mw-collapsible&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- 标题栏&lt;br /&gt;
	local header = root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
	header:addClass(&amp;#039;qqchat-header&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	header:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;qqchat-icon&amp;#039;)&lt;br /&gt;
		:wikitext(&amp;#039;💬&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	header:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;qqchat-title&amp;#039;)&lt;br /&gt;
		:wikitext(escapeHtml(title))&lt;br /&gt;
&lt;br /&gt;
	header:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;qqchat-count&amp;#039;)&lt;br /&gt;
		:wikitext(&amp;#039;共 &amp;#039; .. tostring(#messages) .. &amp;#039; 条消息&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- 内容区域&lt;br /&gt;
	local body = root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
	body:addClass(&amp;#039;qqchat-body&amp;#039;)&lt;br /&gt;
	body:addClass(&amp;#039;mw-collapsible-content&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if note and mw.text.trim(note) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		body:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;qqchat-note&amp;#039;)&lt;br /&gt;
			:wikitext(escapeHtml(note))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, item in ipairs(messages) do&lt;br /&gt;
		local row = body:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		row:addClass(&amp;#039;qqchat-message&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		if item.unparsed then&lt;br /&gt;
			row:addClass(&amp;#039;qqchat-unparsed&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local meta = row:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		meta:addClass(&amp;#039;qqchat-meta&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		meta:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;qqchat-user&amp;#039;)&lt;br /&gt;
			:wikitext(escapeHtml(item.username))&lt;br /&gt;
&lt;br /&gt;
		if item.datetime ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			meta:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;qqchat-time&amp;#039;)&lt;br /&gt;
				:wikitext(escapeHtml(item.datetime))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		row:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;qqchat-text&amp;#039;)&lt;br /&gt;
			:wikitext(formatMessage(item.message))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>KK</name></author>
	</entry>
</feed>