跳转到内容

Module:PJBSClass/main:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
无编辑摘要
避免重複組合。以避免出現Category:调用重复模板参数的页面
(未显示同一用户的3个中间版本)
第96行: 第96行:
local talk_page = (page or {}).talkPageTitle
local talk_page = (page or {}).talkPageTitle
local subject_page = (page or {}).subjectPageTitle
local subject_page = (page or {}).subjectPageTitle
if re_disambiguation_title(subject_page.fullText or "") then --檢查是否有消歧義標題
if subject_page:inNamespaces(mw.title.new("Article").namespace) then --只有條目空間有消歧義
if re_disambiguation_title(subject_page.fullText or "") then --檢查是否有消歧義標題
return true
end
local body = ""
if subject_page.getContent then body = subject_page:getContent() or "" end
if re_disambiguation_template(body) then --尋找消歧義的模板
return true
end
if not mw.title.equals(subject_page or "", mw.title.getCurrentTitle()) then
if mw.ustring.match(mw.getCurrentFrame():preprocess(mw.ustring.sub(body, 1, 200)..mw.ustring.sub(body, -200, -1)) --頭尾限400字,以節省效能
, "__DISAMBIG__") then --匹配展開的模板有無消歧義的魔術字
return true
return true
end
local body = ""
if subject_page.getContent then body = subject_page:getContent() or "" end
if re_disambiguation_template(body) then --尋找消歧義的模板
return true
end
if not mw.title.equals(subject_page or "", mw.title.getCurrentTitle()) then
--頭尾限400字,以節省效能
local check_body = (mw.ustring.len(body) > 400) and (mw.ustring.sub(body, 1, 200)..mw.ustring.sub(body, -200, -1)) or body
if mw.ustring.match(mw.getCurrentFrame():preprocess(check_body)
, "__DISAMBIG__") then --匹配展開的模板有無消歧義的魔術字
return true
end
end
end
end
end

2023年12月26日 (二) 13:38的版本

local p = {}
local yesno = require('Module:Yesno')
local cat_auto_class = "自動評級的頁面"

function p.subjectPageTitle(input_data)
	local page_name = input_data
	local is_lua = true
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		page_name = input_data.args['1'] or input_data.args[1]
		is_lua = false
	end
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or mw.title.getCurrentTitle()
	local subject_page = (page or {}).subjectPageTitle
	if is_lua then return subject_page end
	return subject_page.fullText
end

--讀取所在頁面的評級 函數本體
function p._getClass(input_data)
	local class_name = input_data
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		class_name = input_data.args['1'] or input_data.args[1]
	end
	if class_name ~= nil and 
		(mw.ustring.lower(class_name or '') ~= 'no_input') and
		(mw.ustring.lower(class_name or '') ~= '¬') then
		return class_name
	end
	return mw.loadData("Module:PJBSClass/page").class or ''
end

--讀取所在頁面的評級 供呼叫的函數
function p.getClass(input_data)
	local success, result = pcall(p._getClass, input_data)
	if not success then return "" end
	return result
end

--偵測消歧義標題
local function re_disambiguation_title(input_text)
	local text = input_text or ""
	local match_list = {
		"%([消分]歧[義义頁页]?%)",
		"%([消分]歧[義义][頁页]?%)",
		"%(disambiguous%)",
		"%disambiguation%)",
		"%(disambi?g?%)",
	}
	local lotext = mw.ustring.lower(text)
	local normtext = text
	for i = 1,#match_list do
		local j, k = mw.ustring.find(lotext, "%s+"..match_list[i])
		if j ~= nil then 
			local result = mw.ustring.sub(text, j, k)
			result = mw.ustring.match(result, "%(([^%)]+)%)$")
			return result
		end
	end
	return nil
end

--偵測消歧義模板
local function re_disambiguation_template(input_text)
	local text = input_text or ""
	local match_list = {
		{"[消分]歧[義义頁页]?",true},
		{"[消分]歧[義义][頁页]?",true},
		{"dab",false},
		{"disambiguous",true},
		{"disambiguation",true},
		{"disambi?g?",true},
		{"aimai",false},
		{"disambiguation%s*page",true},
	}
	local lotext = mw.ustring.lower(text)
	local normtext = text
	for i = 1,#match_list do
		local j, k = mw.ustring.find(lotext, "%{%{"..
			(match_list[i][2] and "[^%}]*" or "%s*")..match_list[i][1].."[^%}%|]*")
		if j ~= nil then 
			local result = mw.ustring.sub(text, j, k)
			result = mw.text.trim(mw.ustring.match(result, "%{%{%s*(.+)$"))
			return result
		end
	end
	return nil
end

--偵測消歧義頁
function p.is_disambiguation(input_data)
	local page_name = input_data
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		page_name = input_data.args['1'] or input_data.args[1]
	end
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or mw.title.getCurrentTitle()
	local talk_page = (page or {}).talkPageTitle
	local subject_page = (page or {}).subjectPageTitle
	if subject_page:inNamespaces(mw.title.new("Article").namespace) then --只有條目空間有消歧義
		if re_disambiguation_title(subject_page.fullText or "") then --檢查是否有消歧義標題
			return true
		end
		local body = ""
		if subject_page.getContent then body = subject_page:getContent() or "" end
		if re_disambiguation_template(body) then --尋找消歧義的模板
			return true
		end
	
		if not mw.title.equals(subject_page or "", mw.title.getCurrentTitle()) then
			 --頭尾限400字,以節省效能
			local check_body = (mw.ustring.len(body) > 400) and (mw.ustring.sub(body, 1, 200)..mw.ustring.sub(body, -200, -1)) or body
			if mw.ustring.match(mw.getCurrentFrame():preprocess(check_body)
				, "__DISAMBIG__") then --匹配展開的模板有無消歧義的魔術字
				return true
			end
		end
	end
	return false
end

--自動偵測重定向、消歧義和命名空間 (模板、模組、分類、檔案、草稿、主題、專題) 產生評級
function p.getClassAuto(input_data, class_input, demo)
	local page_name = input_data
	local page_name_inputed = false
	local class_default = class_input or ''
	local demo_flag = yesno(demo or "no")
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		page_name = input_data.args['1'] or input_data.args[1]
		class_default = input_data.args.class or input_data.args.CLASS or ''
		demo_flag = yesno(input_data.args.demo or "no")
	end
	if mw.text.trim(page_name or '') ~= '' then page_name_inputed = true end
	if demo_flag then return class_default end
	local current_title = mw.title.getCurrentTitle()
	--取得頁面標題物件
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or current_title
	local current_page = page.subjectPageTitle or current_title.subjectPageTitle
	--success=執行成功與失敗, result=執行結果
	local success, result = false, ''
	if mw.text.trim(class_default or '') == '' then --沒有預輸入評級
		local page_is_disambiguation = false
		if page_name_inputed then --目前正在讀取其他頁面
			page_is_disambiguation = p.is_disambiguation(page_name)
		else --如果是讀取本頁,用讀取一次的方案 : mw.loadData("Module:PJBSClass/page")
			page_is_disambiguation = mw.loadData("Module:PJBSClass/page").is_disambiguation
		end
		if page_is_disambiguation then --如果偵測到是消歧義
			require('Module:TrackingCategory').append(mw.getCurrentFrame(),cat_auto_class)
			return 'disambig'
		end
	end
	local class_default_lower = mw.ustring.lower(class_default)
	if current_page.isRedirect or current_page:inNamespaces(
		mw.title.new("Template:Ex").namespace, 
		mw.title.new("Module:Ex").namespace, 
		mw.title.new("Category:Ex").namespace, 
		mw.title.new("File:Ex").namespace, 
		mw.title.new("Draft:Ex").namespace, 
		mw.title.new("Portal:Ex").namespace, 
		mw.title.new("PJ:Ex").namespace) 
	then
		if current_page:inNamespace(mw.title.new("File:Ex").namespace) and 
			(class_default_lower == "fm" or class_default_lower == "fi" or
			 mw.ustring.match(class_default_lower, "特[圖图]") or
			 mw.ustring.match(class_default_lower, "特色[圖图媒][片體体]") ) 
		then
			return class_default
		end
		success, result = pcall(require("Module:PJBSClass").getAutoClass, input_data)
		if success and mw.text.trim(result or '') ~= '' then --如果成功讀取,並有讀到評級
			require('Module:TrackingCategory').append(mw.getCurrentFrame(),cat_auto_class)
		end
	end
	--讀取不成功,回傳預輸入評級
	if not success then return class_default end
	return result
end

--偵錯用 : 只要[[Cat:無法正常讀取評級的條目]]是空的,代表本模組沒問題。
function p._checker(input_data)
	local success, result = pcall(p.getClass, input_data)
	if not success then return "[[Cat:無法正常讀取評級的條目]]" end
	local result_show = (mw.text.trim(result or '') ~= '') and result or ' '
	if mw.text.trim(result or '') ~= ''then 
		return "[[Cat:可以正常讀取評級的條目|".. result_show .."]]" 
	end
	return ''
end

return p