跳转到内容

模組:Vital articles

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

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

local p = {}
local lib_PJBS = require("Module:PJBSClass/main")
local vital_subpages = mw.loadData("Module:Vital_articles/subpages")

local function _getItem(obj, _key)
	local key = mw.text.trim(mw.ustring.lower(_key))
	for _, item in pairs(obj) do
		if item.name == key then
			return item
		end
		if type(item.alias) == type({"array"}) then
			for __, alias_name in pairs(item.alias) do
				if alias_name == key then
					return item
				end
			end
		end
	end
	return nil
end

function p.hasTopic(input_data)
	local topic = input_data
	local is_lua = true
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		topic = input_data.args[1] or input_data.args['1'] or ''
		is_lua = false
	end
	local function _value(__value, _is_lua) if _is_lua then return __value else return __value and "1" or "" end end
	if mw.text.trim(topic or '') == '' then return _value(false, is_lua) end
	for _, level_data in pairs(vital_subpages) do
		local topic_item = _getItem(level_data, topic)
		if topic_item then
			if topic_item.name == "#default" then return _value(false, is_lua) end
			return _value(true, is_lua)
		end
	end
	return _value(false, is_lua)
end

function p.getSubpage(input_data, _level, _subpage)
	local topic = input_data
	local level = _level
	local subpage = _subpage
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		topic = input_data.args.topic
		level = input_data.args.level
		subpage = input_data.args.subpage
	end
	level = tonumber(level)
	local result = "Wikipedia:基礎條目"
	if vital_subpages[level] then
		local level_data = vital_subpages[level]
		local default_item = _getItem(level_data, "#default")
		if default_item then
			result = result .. (default_item.page or '')
		end
		local topic_item = _getItem(level_data, topic)
		if topic_item then
			result = result .. (topic_item.page or '')
			local subpage_item = _getItem(topic_item.subpages or {}, subpage)
			if subpage_item then
				result = result .. (subpage_item.page or '')
			end
		end
	end
	return result
end

function p.getDataPage(_input_data)
	local input_data = tostring(_input_data)
	--相依 : 進制模板
	local convertBase, convertBaseT = require("Module:BaseConvert").convert, mw.title.new("Template:進制"):getContent()
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return {exists=false} end
	local first_char = mw.ustring.upper(mw.ustring.sub(subject_page.fullText, 1, 1)) -- get first letter of article name
	local codepoint = mw.ustring.codepoint(first_char, 1, 1)
	local base36 = convertBase({n = codepoint, base = 36})
	local page = tostring(base36:sub(-1,-1))
	local data_page = mw.title.new('Wikipedia:基礎條目/資料/' .. page .. '.json')
	return data_page
end

function p.getVitalData(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return nil end
	local data_page = p.getDataPage(input_data)
	if data_page.exists then
		local index = tonumber(subject_page.fullText) or subject_page.fullText --convert to number if page is numerical, otherwise loadJsonData does not work
		local data = mw.loadJsonData(data_page.fullText)[index]
		return data
	end
	return nil
end

function p.getTopic(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return "" end
	local data = p.getVitalData(input_data)
	if type(data) ~= type(nil) then
		return data.topic or ""
	end
	return ""
end

function p.getLevel(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return "" end
	local data = p.getVitalData(input_data)
	if type(data) ~= type(nil) then
		return data.level or -1
	end
	return -1
end

function p.getSublist(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return "" end
	local data = p.getVitalData(input_data)
	if type(data) ~= type(nil) then
		return data.sublist or ''
	end
	return ''
end

function p.getSection(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return "" end
	local data = p.getVitalData(input_data)
	if type(data) ~= type(nil) then
		return data.section or ''
	end
	return ''
end

function p.getLink(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	subject_page = (type(subject_page.fullText) == type(nil)) and mw.title.new(subject_page) or subject_page
	if type(subject_page) == type(nil) then return "" end
	local data = p.getVitalData(input_data)
	if type(data) ~= type(nil) then
		local level = tostring(data.level)
		local level_name = ({'一','二','三','四','五','六','七','八','九','十',[0]='零'})[data.level]
		if level and level_name then
			local link = ('Wikipedia:%s條目'):format(data.va_type or "基礎")
			if level~='3' then
				if level=='4' then
					link = link .. '/擴展'
				else
					link = link .. '/第' .. level_name ..'級'
				end
			end
			if (level=='4' or level=='5') and data.topic then
				link = link .. '/' .. data.topic
			end
			if data.sublist then
				link = link .. '/' .. data.sublist
			end
			if data.section then
				link = link .. '#' .. data.section
			end
			if not mw.title.new(link).exists then -- add tracking category if link does not exist
				--addCategory('Wikipedia vital articles needing attention', 'L')
			end
			return link
		end
	end
	return ''
end

function p._dataCount(input_data)
	local page_id = input_data
	if type((input_data or {}).args) ~= type(nil) then --input_data is a frame
		page_id = input_data.args[1] or input_data.args['1'] or ''
	end
	local dataPage = mw.title.new('Wikipedia:基礎條目/資料/' .. (page_id or '') .. '.json')
	local success, data = pcall(mw.loadJsonData, dataPage.fullText)
	local count = 0
	if success and type(data) == type({"table"}) then
		for _, item in pairs(data) do
			if type(item) == type({"table"}) then count = count + 1 end
		end
	end
	return count
end

function p.checkJSON(input_data)
	local subject_page = lib_PJBS.subjectPageTitle(input_data)
	local error_count = 0
	local body = ""
	if type(subject_page.fullText) == type(nil) then
		subject_page = mw.title.new(subject_page)
	end
	if (subject_page.contentModel or ''):lower() == "json" then
		local data = mw.loadJsonData( subject_page.fullText )
		for article, _ in pairs(data) do
			local datapage = p.getDataPage(article)
			if datapage.fullText ~= subject_page.fullText then
				error_count = error_count + 1
				body = body .. '!' .. subject_page.fullText .. '\n||' .. 
					article .. '\n||' .. datapage.fullText ..'\n|-\n'
			end
		end
	end
	if error_count == 0 then
		body = body .. '!' .. subject_page.fullText .. '\n|colspan=2 align=center|無錯誤\n|-\n'
	end
	return body
end

return p