模块:PJBSClass/sandbox
外观
这是Module:PJBSClass(差异)的沙盒。 |
本模块为互助客栈提议设立通用评级的配套模块。为了实现“新的模版可以单独给条目一个总体的品质评级,各个WikiProject可以直接继承这个quality assessment,也可以搞自己的评级
”中的“继承评级”项目,因此设计了用于读取{{PJBS}}所输入之评级的模块。
为了避免重复运算,使用时请使用Module:PJBSClass/main来读取评级。Module:PJBSClass/main会通过使用mw.loadData("Module:PJBSClass/page")
来调用本模块,让评级的计算在每个页面只会计算一次。也因此,本模块只能读取第一个{{PJBS}}所输入之评级,如放置了多个{{PJBS}}模板,后面的{{PJBS}}评级内容将会被忽略。
用法
[编辑]不建议直接调用本模块,应通过Module:PJBSClass/main中的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}}
直接调用。
- 用法
{{Module:PJBSClass/page}}
:回传模板所在条目输入于{{PJBS}}中的评级原始值或自动判断的评级值。- 例如在本页放置
{{Module:PJBSClass/page}}
→“模块”
- 例如在本页放置
- 用法
{{Module:PJBSClass/page|頁面名稱}}
:回传输入于指定页面名称{{PJBS}}中的评级原始值或自动判断的评级值。- 例如
{{Module:PJBSClass/page|溫尼爾多面體模型列表}}
→“list”
- 例如
- 用法
{{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":true,"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": true
- 例如
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:inNamespace(mw.title.new("PJ: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,2300,2302)
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