跳转到内容

模組:Vgr

被永久保护的模块
维基百科,自由的百科全书

require("strict")

local chinese_date = require("Module:Date_Convert")._ChineseDate
local getArgs = require("Module:Arguments").getArgs
local list = require("Module:List").unbulleted
local yesno = require("Module:Yesno")

local region_data = mw.loadData("Module:Vgr/regions")

local ITEMS_LIMIT = 42
local DEFAULT_PLAIN_MODE = false

--- Get a label from its corresponding code.
--- If the label is found in the `code_mapping`, return the mapped value.
--- If not, return the input string as-is.
--- @param str string @The region code or name to be looked up.
--- @return string @The corresponding label or the input string if no match is found.
local function get_name(str)
    return region_data[str] or str
end

--- Split label by common delimiters (comma, semicolon, slash, etc.)
--- @param str string @The string to split.
--- @return string[] @A table of split strings.
local function split_codes(str)
    local ptn = "[,;/、,;/]%s-"
    local result = mw.text.split(str, ptn, false)
    return result
end

--- Build the label part from an argument.
--- @param val string @The given argument.
--- @return string @The casted label name.
local function build_label(val)
    local codes = split_codes(val)
    local names = {}
    for _, code in ipairs(codes) do
        local name = get_name(code)
        table.insert(names, name)
    end
    local result = table.concat(names, "、")
    return result
end

--- Build the data part from an argument.
--- @param val string @The given argument.
--- @param plain boolean @Whether to keep the direct input.
--- @return string @The handled data value.
local function build_data(val, plain)
    if yesno(plain) then
        return val
    end
    return chinese_date {val, error = "ignore", suf = "yes"}
end

--- Build an item.
--- @param val1 string @The label argument.
--- @param val2 string @The data argument.
--- @param plain boolean @Whether to keep the direct input.
--- @return string @The formatted item string.
local function build_item(val1, val2, plain)
    local result = build_label(val1) .. ":" .. build_data(val2, plain)
    return result
end

--- Parse the arguments to generate a list of items.
--- @param args table @The arguments table.
--- @return table @A list of item strings.
local function get_items(args)
    local plain = args.plain or DEFAULT_PLAIN_MODE
    -- E.g., {{vgr|2025年2月3日}} → 2025年2月3日 for implicit worldwide releases.
    if args[1] and (args[2] == nil) then
        local item = build_data(args[1], plain)
        return {item}
    end
    -- E.g., {{vgr||2025年2月3日}} → 2025年2月3日 for implicit worldwide releases.
    if args[2] and (args[1] == nil) then
        local item = build_data(args[2], plain)
        return {item}
    end
    -- Common usage.
    local result = {}
    for i = 1, ITEMS_LIMIT * 2, 2 do
        local label = args[i]
        if (label == "") or (label == nil) then
            break
        end
        local data = args[i + 1] or ""
        local item = build_item(label, data, plain)
        table.insert(result, item)
    end
    return result
end

--- Main logic to generate the list.
--- @param args table @The arguments table.
--- @return string @The resulting HTML string.
local function main(args)
    local result = list(get_items(args))
    return result
end

local p = {}

--- Module entry point for internal calls.
--- @param args table @The arguments table.
--- @return string @The resulting HTML string.
function p._main(args)
    return main(args)
end

--- Module entry point for template calls.
--- @param frame table @The frame object.
--- @return string @The resulting HTML string.
function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

return p