跳转到内容

模組:DYK status/sandbox

维基百科,自由的百科全书
-- 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