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