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 |
if subject_page:inNamespaces(mw.title.new("Article").namespace) then --只有條目空間有消歧義 |
||
if re_disambiguation_title(subject_page.fullText or "") then --檢查是否有消歧義標題 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
return true |
return true |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
--頭尾限400字,以節省效能 |
|||
⚫ | |||
if mw.ustring.match(mw.getCurrentFrame():preprocess(check_body) |
|||
⚫ | |||
⚫ | |||
end |
|||
end |
end |
||
end |
end |
2023年12月26日 (二) 13:38的版本
本模組的功能:
- 透過調用Module:PJBSClass/page間接調用Module:PJBSClass
- 讀取{{PJBS}}中的評級值
- 自動透過命名空間盼判斷評級值
- 進階自動評級
- 透過解析頁面內容判斷頁面是否為軟重定向
- 透過解析頁面內容判斷頁面是否為消歧義
- 判斷專題橫幅是繼承{{PJBS}}中的評級值還是自定評級值並加入維護分類
- 輔助{{PJBS}}中的一些與專題評級值相關的功能
用法
本模組主要用於讀取頁面中定義於{{PJBS}}或專題橫幅中的評級值,或自動根據命名空間或維基代碼判斷評級。
判斷種類 | 判斷依據 | 對應的評級 |
---|---|---|
典范条目 | 典范条目模板(如{{Featured article}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
优良条目 | 优良条目模板(如{{Good article}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
特色列表 | 特色列表模板(如{{Featured list}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
特色图片 | 特色图片模板(如{{Featured picture}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
重定向 | 頁面物件的isRedirect 欄位。
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
軟重定向 | 軟重定向模板(如{{軟重定向}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
沙盒 | 沙盒模板(如{{Sandbox}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
消歧義 | 消歧義模板(如{{消歧義}}) 以及相關魔術字(如 __DISAMBIG__ )
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
列表 | 名稱以「列表」結尾的頁面
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
同類索引 | 同類索引模板(如{{同類索引}})
Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
小作品 | 條目的位元組數是否小於2000 (2000~3000間的過渡數值不自動評) Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) |
命名空間 | 前綴 | 對應的評級 |
---|---|---|
模板 | Template:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
模組 | Module:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
分類 | Category:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
文件 | File:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
草稿 | Draft:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
主題 | Portal:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
專題 | PJ:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
用戶 | User:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
說明 | Help:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
MediaWiki | MediaWiki:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
字幕 | TimedText:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
媒體 | Media:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) | |
特殊 | Special:Module:Class第226行Lua错误:attempt to call field 'getPageType' (a nil value) |
模組中的主要函數
- getClass
-
- 模組調用:
p.getClass(class_name)
- 模板調用:
{{#invoke:PJBSClass/main|getClass| class_name | auto=yes/no | inheritance=yes/no | demo=yes/no }}
- 模組調用:
- 間接調用Module:PJBSClass#getClassByPage。
- 取得所在頁面的評級,可以輸入一個評級值(class_name)作為覆蓋與否的判斷依據。auto為是否要以自動判斷的評級為優先;inheritance為是否要以繼承值為優先;demo為是否為模板演示。
- getClassAuto
-
- 模組調用:
p.getClassAuto(page_name, class_default, demo)
- 模板調用:
{{#invoke:PJBSClass/main|getClassAuto| class_name | class=class_default | demo=yes/no }}
- 模組調用:
- 間接調用Module:PJBSClass#getAutoClass,並額外加入了從維基代碼判斷評級的功能,見維基代碼可判斷的評級值。
- 自動判斷名為「page_name」頁面的評級,若「page_name」未輸入則判斷所在頁面的評級。若無法判斷則回傳「class_default」。
- class_json
-
- 模組調用:
p.class_json()
- 模板調用:
{{#invoke:PJBSClass/main|class_json}}
- 模組調用:
- 提供Module:PJBSClass#{{Module:PJBSClass/page}}轉換Lua到JSON的函數。此函數沒有參數,僅回傳所在條目
mw.loadData("Module:PJBSClass/page")
的JSON結果。模板調用應使用{{Module:PJBSClass/page|json=yes}}
。
- getPageType
- 判斷該級別的分類頁面種類。
模組中的元函數
- _getClass
-
- 模組調用:
p._getClass(class_name, auto, inheritance, demo)
- 模板調用:
{{#invoke:PJBSClass/main|_getClass| class_name | auto=yes/no | inheritance=yes/no | demo=yes/no }}
- 模組調用:
- 同#getClass。
- _getProjects
-
- 模組調用:
p._getProjects(html)
- 模板調用:(無法使用)
- 模組調用:
- 解析「html」中的評級模板,列出當中的所有專題名稱。
專題橫幅內部函數
- subjectPageTitle
-
- 模組調用:
p.subjectPageTitle(page_name)
- 模板調用:
{{#invoke:PJBSClass/main|subjectPageTitle| page_name }}
- 模組調用:
- 無論名為「page_name」頁面是否是討論頁都會回傳其所對應之主要頁面的名稱。如果「page_name」不是討論頁,則回傳原頁面名稱。如果「page_name」未輸入則輸出所在頁面(無論是否是討論頁)所對應之主要頁面的名稱。如果所在頁面不是討論頁,則回傳所在頁面名稱。
- listProjects
-
- 模組調用:
p.listProjects(html, code, comma, max_num)
- 模板調用:
{{#invoke:PJBSClass/main|listProjects| html | code=code | comma=comma | tail=tail | max_num=max_num }}
- 模組調用:
- 列舉「html」中所有專題橫幅的專題,主要由{{PJBS}}調用。「code」為輸出的格式,
$1
代表專題名稱、$2
代表分隔符號。「comma」為分隔符號。「tail」為自動加在尾端的文字,預設為專題
。「max_num」為最大列舉數量。
- checkClassInput
- 檢查是否評級繼承與否
- wrongClass
- 檢查是否誤將橫幅與評級輸入在一起
- hasCustomClassName
- 檢查專題橫幅有無自訂評級級別
- customClassName
- 處理專題橫幅的自訂評級級別
- processNotice
- 將輸入到{{PJBS}}的專題橫幅處理成符合{{PJBS}}的樣式,並移除專題橫幅內自帶的提示模板,{{PJBS}}會使用#getNotice將之統一加入。同時解析內容添加適當的維護分類。
- getNotice
- 解析輸入到{{PJBS}}的專題橫幅有無橫幅內自帶的提示模板,移除重複的提示模板後,加以顯示。
判斷頁面屬性函數
- is_softredirect
- 判斷頁面是否為軟重定向。
- is_disambiguation
- 判斷頁面是否為消歧義頁。
- is_sandbox
- 判斷頁面是否為沙盒。
可供其他模組調用的私有函數
- _re_softredirect_template
- 匹配軟重定向模板的正則函數。
- _re_disambiguation_title
- 匹配消歧義標題的正則函數。
- _re_disambiguation_template
- 匹配消歧義模板的正則函數。
- _re_sandbox_template
- 匹配沙盒模板的正則函數。
- _remove_wikiproject_flag
- 用於避免消歧義判斷模板循環的跳脫函數,會破壞輸入的內容、移除魔術字,僅保留模板,以供展看測試有無消歧義魔術字。
除錯用函數
- _checker
- 檢查函數是否會出錯的函數。如無出錯,將頁面加入分類:可以正常讀取評級的條目;如出錯,將頁面加入分類:無法正常讀取評級的條目。
- check_disambig_process
- 列出#is_disambiguation的中間過程,以便除錯。
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