<?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%3APJBSClass</id>
	<title>Module:PJBSClass - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3APJBSClass"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:PJBSClass&amp;action=history"/>
	<updated>2026-07-02T06:00:53Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Module:PJBSClass&amp;diff=4357849&amp;oldid=prev</id>
		<title>imported&gt;Jimmy Xu 来自 2024年7月17日 (三) 17:15</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:PJBSClass&amp;diff=4357849&amp;oldid=prev"/>
		<updated>2024-07-17T17:15:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p={}&lt;br /&gt;
p.titles = {}&lt;br /&gt;
local class_normalize = require(&amp;quot;Module:Class/convert&amp;quot;)._main&lt;br /&gt;
local function flagReturn(value, flag, is_lua)&lt;br /&gt;
	if is_lua then return {value, flag} end&lt;br /&gt;
	return {value}&lt;br /&gt;
end&lt;br /&gt;
--自動判斷頁面評級&lt;br /&gt;
function p.getAutoClass(input_data, class_input)&lt;br /&gt;
	local page_name = input_data&lt;br /&gt;
	local class_default = class_input or &amp;#039;&amp;#039;&lt;br /&gt;
	local is_lua = true&lt;br /&gt;
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame&lt;br /&gt;
		page_name = input_data.args[&amp;#039;1&amp;#039;] or input_data.args[1]&lt;br /&gt;
		class_default = input_data.args.class or input_data.args.CLASS or &amp;#039;&amp;#039;&lt;br /&gt;
		is_lua = false&lt;br /&gt;
	end&lt;br /&gt;
	local class_default_norm = class_normalize({class_default})&lt;br /&gt;
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or mw.title.getCurrentTitle()&lt;br /&gt;
	local page_orig = (page or {}).subjectPageTitle&lt;br /&gt;
	if page_orig then --依據命名空間自動判斷頁面種類&lt;br /&gt;
		if page_orig.isRedirect then&lt;br /&gt;
			if	class_default_norm == &amp;quot;needed&amp;quot; or &lt;br /&gt;
				class_default_norm == &amp;quot;merge&amp;quot;&lt;br /&gt;
			then --可能是重定向頁的級別&lt;br /&gt;
				return unpack(flagReturn(class_default, false, is_lua))&lt;br /&gt;
			end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;重定向&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Template:Ex&amp;quot;).namespace) then&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;模板&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Module:Ex&amp;quot;).namespace) then&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;模块&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Category:Ex&amp;quot;).namespace) then&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;分类&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;File:Ex&amp;quot;).namespace) then&lt;br /&gt;
			if	class_default_norm == &amp;quot;fm&amp;quot; or	&lt;br /&gt;
				class_default_norm == &amp;quot;book&amp;quot; or	--pdf&lt;br /&gt;
				class_default_norm == &amp;quot;audio&amp;quot; or	--wav、ogg...&lt;br /&gt;
				class_default_norm == &amp;quot;image&amp;quot;	--png、jpg、gif、svg...&lt;br /&gt;
			then --特殊文件&lt;br /&gt;
				return unpack(flagReturn(class_default, false, is_lua))&lt;br /&gt;
			end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;文件&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Draft:Ex&amp;quot;).namespace) then&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;草稿&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Portal:Ex&amp;quot;).namespace) then&lt;br /&gt;
			if	class_default_norm == &amp;quot;fpo&amp;quot; or &lt;br /&gt;
				class_default_norm == &amp;quot;complete&amp;quot; or &lt;br /&gt;
				class_default_norm == &amp;quot;substantial&amp;quot; or &lt;br /&gt;
				class_default_norm == &amp;quot;basic&amp;quot; or&lt;br /&gt;
				class_default_norm == &amp;quot;stub&amp;quot; &lt;br /&gt;
			then --有評級的主題級別&lt;br /&gt;
				return unpack(flagReturn(class_default, false, is_lua))&lt;br /&gt;
			end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;主题&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespaces(&lt;br /&gt;
			mw.title.new(&amp;quot;PJ:Ex&amp;quot;).namespace,&lt;br /&gt;
			mw.title.new(&amp;quot;Wikipedia:Ex&amp;quot;).namespace)&lt;br /&gt;
		then&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;专题&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;User:Ex&amp;quot;).namespace) then&lt;br /&gt;
			if mw.text.trim(class_default or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then return unpack(flagReturn(class_default, false, is_lua)) end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;用户&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;Help:Ex&amp;quot;).namespace) then&lt;br /&gt;
			if mw.text.trim(class_default or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then return unpack(flagReturn(class_default, false, is_lua)) end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;使用说明&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespace(mw.title.new(&amp;quot;MediaWiki:Ex&amp;quot;).namespace) then&lt;br /&gt;
			if mw.text.trim(class_default or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then return unpack(flagReturn(class_default, false, is_lua)) end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;界面&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
		if page_orig:inNamespaces(&lt;br /&gt;
			mw.title.new(&amp;quot;MediaWiki:Ex&amp;quot;).namespace,&lt;br /&gt;
			mw.title.new(&amp;quot;TimedText:Ex&amp;quot;).namespace,&lt;br /&gt;
			mw.title.new(&amp;quot;Media:Ex&amp;quot;).namespace,&lt;br /&gt;
			mw.title.new(&amp;quot;Special:Ex&amp;quot;).namespace,&lt;br /&gt;
			2600) &lt;br /&gt;
		then&lt;br /&gt;
			if mw.text.trim(class_default or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then return unpack(flagReturn(class_default, false, is_lua)) end&lt;br /&gt;
			return unpack(flagReturn(&amp;#039;非条目&amp;#039;, true, is_lua))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return unpack(flagReturn(class_default, false, is_lua))&lt;br /&gt;
end&lt;br /&gt;
--輸入頁面名稱，從WPBS讀取評級&lt;br /&gt;
function p.getClassByPage(input_data, flag)&lt;br /&gt;
	local page_name = input_data&lt;br /&gt;
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame&lt;br /&gt;
		page_name = input_data.args[&amp;#039;1&amp;#039;] or input_data.args[1]&lt;br /&gt;
	end&lt;br /&gt;
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or mw.title.getCurrentTitle()&lt;br /&gt;
	local talk_page = (page or {}).talkPageTitle&lt;br /&gt;
	if talk_page then --如果討論頁存在&lt;br /&gt;
		--從討論頁的維基代碼解析WPBS的評級&lt;br /&gt;
		local class_result, has_WPBS = p.getClassByWikitext(talk_page:getContent() or &amp;quot;&amp;quot;, flag)&lt;br /&gt;
		local has_value = mw.text.trim(class_result or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039;&lt;br /&gt;
		--檢查是否可自動評級&lt;br /&gt;
		local result, is_auto = p.getAutoClass(talk_page.fullText, class_result)&lt;br /&gt;
		if has_value then is_auto = false end&lt;br /&gt;
		if flag then --如果從Lua調用並設flag為true，會多返回有無找到WPBS的布林值&lt;br /&gt;
			return result, has_WPBS, is_auto&lt;br /&gt;
		else&lt;br /&gt;
			return result&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--找不到評級值也無法自動評級&lt;br /&gt;
	if flag then --如果從Lua調用並設flag為true，會多返回有無找到WPBS的布林值&lt;br /&gt;
		return &amp;#039;&amp;#039;, false, false&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
--處理WPBS重定向問題&lt;br /&gt;
local function processWPBSRedirect(input_text)&lt;br /&gt;
	local text = input_text&lt;br /&gt;
	local norm_name = &amp;quot;WPBS&amp;quot;&lt;br /&gt;
	local match_list = { --Template:WikiProject banner shell的重定向匹配表&lt;br /&gt;
		--注意：這裡必須全部使用小寫字母&lt;br /&gt;
		&amp;quot;wiki%s*project%s*banner%s*shell&amp;quot;, &lt;br /&gt;
		&amp;quot;w?pj?%s*banner%s*shell&amp;quot;, &lt;br /&gt;
		&amp;quot;wiki%s*project%s*banners&amp;quot;, &lt;br /&gt;
		&amp;quot;multiple%s*wikiprojects?&amp;quot;, &lt;br /&gt;
		&amp;quot;wiki%s*project%s*shell&amp;quot;,&lt;br /&gt;
		&amp;quot;pjbs&amp;quot;,&lt;br /&gt;
		&amp;quot;[維维]基[专專][题題][橫横]幅&amp;quot;, &lt;br /&gt;
		&amp;quot;多?[個个]?[維维]?基?[专專][题題][橫横]幅&amp;quot;,&lt;br /&gt;
		&amp;quot;[維维]基[专專][题題]&amp;quot;, &lt;br /&gt;
		&amp;quot;多?[個个]?[維维]?基?[专專][题題]&amp;quot;,&lt;br /&gt;
		&amp;quot;[专專][题題][橫横]幅&amp;quot;, &lt;br /&gt;
		&amp;quot;通用[評评][級级]&amp;quot;,&lt;br /&gt;
		--如有新WPBS重定向被建立請加入於此&lt;br /&gt;
	}--致管理員：如有新WPBS重定向被建立，請優先受理WPBS重定向匹配項目的編輯請求&lt;br /&gt;
	--以小寫進行匹配&lt;br /&gt;
	local lotext = mw.ustring.gsub(mw.ustring.lower(text), &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	local normtext = text --轉換重定向名稱的過程變數&lt;br /&gt;
	for i = 1,#match_list do --對所有的WPBS重定向匹配清單項目做 :&lt;br /&gt;
		--維基代碼中尋找是否存在此WPBS重定向匹配&lt;br /&gt;
		local j, k = mw.ustring.find(lotext, match_list[i])&lt;br /&gt;
		while j ~= nil do --持續嘗試尋找匹配直到不能匹配到為止&lt;br /&gt;
			--替換為統一的名稱&lt;br /&gt;
			normtext = mw.ustring.sub(normtext, 1, j-1)..norm_name..mw.ustring.sub(normtext, k+1, -1) &lt;br /&gt;
			--重設小寫匹配用變數&lt;br /&gt;
			lotext = mw.ustring.gsub(mw.ustring.lower(normtext), &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
			j, k = mw.ustring.find(lotext, match_list[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--統一的字串改成目標模板名稱WikiProject banner shell。&lt;br /&gt;
	--註：如Template:WikiProject banner shell被移動或更名，請更新此處&lt;br /&gt;
	--致管理員：如此處需要更新，請優先受理更新此處的編輯請求&lt;br /&gt;
	normtext = mw.ustring.gsub(normtext, &amp;quot;[Ww][Pp][Bb][Ss]&amp;quot;, &amp;quot;WikiProject banner shell&amp;quot;)&lt;br /&gt;
	text = normtext --轉換完的文字&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
--抓取會放置WPBS的段落&lt;br /&gt;
local function getTemplateSection(input_text)&lt;br /&gt;
	local text = (input_text or &amp;#039;&amp;#039;)..&amp;#039;\n&amp;#039;&lt;br /&gt;
	--抓取終點1：章節標題&lt;br /&gt;
	local i,j = mw.ustring.find(text, &amp;quot;\n%=+[^\n]*%=+%s*\n&amp;quot;)&lt;br /&gt;
	if i == nil then&lt;br /&gt;
		--抓取終點2：DYK評選標題&lt;br /&gt;
		i,j = mw.ustring.find(text, &amp;quot;%{%{%s*[Dd][Yy][Kk][Ee]ntry/archive&amp;quot;)&lt;br /&gt;
	end --抓取終點3：頁尾&lt;br /&gt;
	--從頭取到抓取終點&lt;br /&gt;
	text = mw.ustring.sub(text, 1, (i or 0)-1)&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
--取得WPBS模板本身的wikitext&lt;br /&gt;
function p.getWPBSTemplateContent(input_text)&lt;br /&gt;
	local text = input_text&lt;br /&gt;
	--匹配WPBS模板開頭&lt;br /&gt;
	local re_WPBS_header = &amp;quot;%{%{[^%{%}%|]*[Ww]iki[Pp]roject[%s_]*[Bb]anner[%s_]*[Ss]hell&amp;quot;&lt;br /&gt;
	--接下來要把成對的{}移除，直到WPBS的也移除則停止，或移除到找不到成對的{}則停止&lt;br /&gt;
	local it = text&lt;br /&gt;
	local old_it = text..&amp;quot;-&amp;quot; --對比用字串，確定上次替換有無成對的{}&lt;br /&gt;
	while it ~= old_it do --如果有成對的{}&lt;br /&gt;
		if not mw.ustring.match(it, re_WPBS_header) then break end --如果WPBS也被移除了則停止&lt;br /&gt;
		old_it = it --更新對比字串&lt;br /&gt;
		it = mw.ustring.gsub(it, &amp;quot;%{[^%{%}]*%}&amp;quot;, &amp;quot;&amp;quot;) --移除成對的{}&lt;br /&gt;
	end&lt;br /&gt;
	--移除到沒有WPBS後，前一個結果恰好是最後一個有WPBS的結果&lt;br /&gt;
	local WPBS = mw.ustring.match(old_it, re_WPBS_header..&amp;quot;[^%{%}]*%}%}&amp;quot;) or &amp;#039;&amp;#039;&lt;br /&gt;
	return WPBS&lt;br /&gt;
end&lt;br /&gt;
--從wikitext中解析出WPBS中輸入的評級。flag為是有關 &amp;quot;是否要返回有無找到WPBS模板&amp;quot; 的參數&lt;br /&gt;
function p.getClassByWikitext(input_data, flag)&lt;br /&gt;
	local wikitext = input_data&lt;br /&gt;
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame&lt;br /&gt;
		wikitext = input_data.args[&amp;#039;1&amp;#039;] or input_data.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local text=wikitext or &amp;#039;&amp;#039;&lt;br /&gt;
	text = getTemplateSection(text) --取得掛模板的段落&lt;br /&gt;
	text = processWPBSRedirect(text) --處理WPBS的重定向頁&lt;br /&gt;
	local WPBS = p.getWPBSTemplateContent(text) --讀取WPBS模板內容&lt;br /&gt;
	if tostring(mw.title.getCurrentTitle().rootText or &amp;#039;&amp;#039;):lower():gsub(&amp;quot;[_%s-]&amp;quot;, &amp;quot; &amp;quot;) ~= &amp;quot;wikiproject banner shell&amp;quot; then&lt;br /&gt;
		local template_name = mw.ustring.gsub(mw.ustring.match(WPBS, &amp;quot;%{%{%s*([^%}%|]+)%s*[%}%|]&amp;quot;) or &amp;#039;&amp;#039;,&amp;#039;\n&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		if mw.ustring.match(template_name, &amp;quot;/sandbox&amp;quot;) then&lt;br /&gt;
			require(&amp;#039;Module:TrackingCategory&amp;#039;).append(mw.getCurrentFrame(), &amp;quot;使用沙盒評級模板的頁面&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--匹配 | class = XX&lt;br /&gt;
	local select_class = mw.ustring.gsub(mw.ustring.match(WPBS, &amp;quot;%|%s*[Cc][Ll][Aa][Ss][Ss]%s*%=%s*([^%|%}]+)&amp;quot;) or &amp;#039;&amp;#039;, &amp;#039;\n&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	--返回匹配到的評級&lt;br /&gt;
	if flag then --如果需要返回有關 &amp;quot;是否要返回有無找到WPBS模板&amp;quot; 之資訊&lt;br /&gt;
		return select_class, mw.text.trim(WPBS or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return select_class&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jimmy Xu</name></author>
	</entry>
</feed>