模組:DYK status/sandbox
外观
![]() | 这是Module:DYK status(差异)的沙盒。 |
-- DYKstatusNew.lua
-- 新版本,使用正则表达式直接匹配,避免 Module:Template parameter value 的性能开销
local p = {}
-- 正则表达式模式定义
-- 1. 候选状态
local invite_pattern = '\{\{\s*(?:[Dd][Yy][Kk][_ ]?[Ii]nvite|[Dd][Yy][Kk][Ii]nvite|[Dd][Yy][Kk][Cc]|[Dd][Yy][Kk][Nn])\s*[\|\}]'
-- 2. DYKEntry/archive
local archive_pattern = '(\{\{\s*(?:[Nn]ew[Dd][Yy][Kk]nomination/archive|[Dd][Yy][Kk][Ee]ntry/archive)\s*(.-)\s*\}\})'
local archive_fail_param_pattern = '\|\s*result\s*=\s*[%-!]\s*[\|\}]'
-- 3. Article history
local history_pattern = '(\{\{\s*(?:[Aa]rticle[_ ]?[Hh]istory)\s*(.-)\s*\}\})'
local history_dyk_param_pattern = '\|\s*dyk(?:1?)(?:date|entry)\s*='
-- 主函数
function p.main(frame)
local pageTitleStr = frame.args[1]
if not pageTitleStr or pageTitleStr == '' then
return nil
end
-- 获取讨论页标题对象
local titleObj = mw.title.new(pageTitleStr)
if not titleObj then
-- 标题无效
return nil
end
local talkTitleObj = titleObj.talkPageTitle
if not talkTitleObj or not talkTitleObj.exists then
-- 讨论页不存在
return nil
end
-- 获取讨论页内容 (使用 pcall 保证安全)
local success, content = pcall(talkTitleObj.getContent, talkTitleObj)
if not success or not content then
-- 获取内容失败或内容为空
-- 可以考虑记录错误日志: mw.log('Failed to get content for: ' .. talkTitleObj.prefixedText)
return nil
end
-- 1. 检查候选
if string.find(content, invite_pattern) then
return "candidate"
end
-- 2. 检查DYKEntry/archive
local _, _, archive_call, archive_params = string.find(content, archive_pattern)
if archive_call then
if string.find(archive_params, archive_fail_param_pattern) then
-- 找到了 result = - 或 !,表示失败
return "no"
else
-- 找到了存档模板,但没有找到失败标记,表示通过
return "yes"
end
end
-- 3. 检查Article history)
local _, _, history_call, history_params = string.find(content, history_pattern)
if history_call then
if string.find(history_params, history_dyk_param_pattern) then
-- 找到了 dykdate, dyk1date, dykentry, 或 dyk1entry 参数,表示通过
return "yes"
end
end
-- 如果以上所有检查都没有匹配,则返回 nil
return nil
end
return p