模組:Vital articles
外观
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:基礎條目'
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.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
mw.log(article, p.getDataPage(article))
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