全站通知:

模块:DateNormalize

来自高达WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:DateNormalize/doc创建

local p = {}

function p.normalize(frame)
    local dateStr = mw.text.trim(frame.args[1] or "")
    -- 空值或未知情况直接返回空
    if dateStr == "" 
        or dateStr == "不明" 
        or dateStr == "未知" 
        or dateStr == "不详" 
        or dateStr == "—" 
        or dateStr == "-" 
        or dateStr == "N/A" then
        return "-"
    end

    -- 清理
    dateStr = dateStr:gsub("年", "-")
               :gsub("月", "-")
               :gsub("日", "")
               :gsub("[%s ]", "")        -- 去掉空格
               :gsub("[/–—]", "-")        -- 统一分隔符
               :gsub("%-+$", "")          --  关键:去掉末尾多余的 -
               :gsub("^%-+", "")          -- 去掉开头的 -

    -- 匹配各种模式
    local y, m, d

    -- yyyy-mm-dd 或 yyyy-m-d
    y, m, d = dateStr:match("^(%d%d%d%d)%-(%d%d?)%-(%d%d?)$")
    if not y then
        -- yyyy-mm
        y, m = dateStr:match("^(%d%d%d%d)%-(%d%d?)$")
    end
    if not y then
        -- yyyy
        y = dateStr:match("^(%d%d%d%d)$")
    end
    if not y then
        -- mm-dd-yyyy 或 m-d-yyyy(美式)
        m, d, y = dateStr:match("^(%d%d?)%-(%d%d?)%-(%d%d%d%d)$")
    end

    -- 如果还没匹配到,尝试其他顺序
    if not y then
        y, m, d = dateStr:match("^(%d%d%d%d)%-(%d%d?)$")  -- 再次检查
    end

    if y then
        y = string.format("%04d", tonumber(y))
        if m then
            m = string.format("%02d", tonumber(m))
            if d then
                d = string.format("%02d", tonumber(d))
                return y .. "-" .. m .. "-" .. d
            else
                return y .. "-" .. m
            end
        else
            return y
        end
    end

    -- 兜底:返回原始输入
    return dateStr
end

return p