跳转到内容

模組:PJBSClass

本页使用了标题或全文手工转换
被永久保护的模块
维基百科,自由的百科全书

这是本页的一个历史版本,由A2569875留言 | 贡献2023年12月24日 (日) 06:37编辑。这可能和当前版本存在着巨大的差异。

local p={}

function p.getAutoClass(input_data, class_input)
	local page_name = input_data
	local class_default = class_input or ''
	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_input = input_data.args.class or input_data.args.CLASS or ''
	end
	local page = (type(page_name) ~= type(nil)) and ({pcall(mw.title.new, page_name)})[2] or mw.title.getCurrentTitle()
	local talk_orig = (page or {}).subjectPageTitle
	if talk_orig then
		if talk_orig.isRedirect then
			return 'redirect'
		end
		if talk_orig:inNamespace(mw.title.new("Template:Ex").namespace) then
			return 'template'
		end
		if talk_orig:inNamespace(mw.title.new("Module:Ex").namespace) then
			return 'module'
		end
		if talk_orig:inNamespace(mw.title.new("Category:Ex").namespace) then
			return 'category'
		end
		if talk_orig:inNamespace(mw.title.new("File:Ex").namespace) then
			return 'file'
		end
	end
	return class_default
end

function p.getClassByPage(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
	return p.getClassByWikitext(talk_page:getContent() or "")
end

local function processWPBSRedirect(input_text)
	local text = input_text
	local norm_name = "WPBS"
	local match_list = { --Template:WikiProject banner shell的重定向匹配表
		"wiki%s*project%s*banner%s*shell", 
		"w?pj?%s*banner%s*shell", 
		"wiki%s*project%s*banners", 
		"multiple%s*wikiprojects?", 
		"wiki%s*project%s*shell",
		"[維维]基[专專][题題][橫横]幅", 
		"多?[個个]?[維维]?基?[专專][题題][橫横]幅",
		"[維维]基[专專][题題]", 
		"多?[個个]?[維维]?基?[专專][题題]",
		"[专專][题題][橫横]幅", 
	}
	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])
		while j ~= nil do 
			normtext = mw.ustring.sub(normtext, 1, j-1)..norm_name..mw.ustring.sub(normtext, k+1, -1) 
			lotext = mw.ustring.lower(normtext)
			j, k = mw.ustring.find(lotext, match_list[i])
		end
	end
	normtext = mw.ustring.gsub(normtext, "[Ww][Pp][Bb][Ss]", "WikiProject banner shell")
	text=normtext

	mw.log("get-text=", text)
	return text
end

local function getTemplateSection(input_text)
	local text = (input_text or '')..'\n'
	local i,j = mw.ustring.find(text, "%=+[^\n]*%=+%s*\n")
	if i == nil then
		i,j = mw.ustring.find(text, "%{%{%s*[Dd][Yy][Kk][Ee]ntry/archive")
	end
	text = mw.ustring.sub(text, 1, (i or 0)-1)
	return text
end

local function getWPBSTemplateContent(input_text)
	local text = input_text
	local re_WPBS_header = "%{%{%s*[Ww]iki[Pp]roject [Bb]anner [Ss]hell"
	local it = text
	local old_it = text.."-"
	while it ~= old_it do
		if not mw.ustring.match(it, re_WPBS_header) then break end
		old_it = it
		it = mw.ustring.gsub(it, "%{[^%{%}]*%}", "")
	end
	local WPBS = mw.ustring.match(old_it, re_WPBS_header.."[^%{%}]*%}%}") or ''
	mw.log("WPBS=", WPBS)
	return WPBS
end

function p.getClassByWikitext(input_data)
	local wikitext = input_data
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		wikitext = input_data.args['1'] or input_data.args[1] or ''
	end
	local text=wikitext or ''
	text = getTemplateSection(text) --取得掛模板的段落
	text = processWPBSRedirect(text) --處理WPBS的重定向頁
	local WPBS = getWPBSTemplateContent(text) --讀取WPBS模板內容
	--匹配 | class = XX
	local select_class = mw.ustring.gsub(mw.ustring.match(WPBS, "%|%s*[Cc][Ll][Aa][Ss][Ss]%s*%=%s*([^%|%}]+)") or '', '\n', '')
	return select_class
end

return p