模块:Vgr

维基百科,自由的百科全书
跳转到导航 跳转到搜索

require("strict")

local split = mw.text.split
local trim = mw.text.trim
local concat = table.concat

local chinese_date = require("Module:Date_Convert")._ChineseDate
local getArgs = require("Module:Arguments").getArgs
local unbulleted = 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
local DELIM_PATTERN = "[,;/、,;/]%s*"

local p = {}

--- Return the mapped region name, or the original value if unmapped.
--- @param code string
--- @return string
local function get_name(code)
    return region_data[code] or code
end

--- Split and normalize region codes.
--- @param s string
--- @return string[]
local function split_codes(s)
    local codes = {}

    for _, part in ipairs(split(s or "", DELIM_PATTERN, false)) do
        part = trim(part)
        if part ~= "" then
            codes[#codes + 1] = part
        end
    end

    return codes
end

--- Convert a region-code string into display names.
--- @param s string
--- @return string[]
local function get_names(s)
    local names = {}

    for _, code in ipairs(split_codes(s)) do
        names[#names + 1] = get_name(code)
    end

    return names
end

--- Render the label portion.
--- @param value string
--- @return string
local function render_label(value)
    return concat(get_names(value), "、")
end

--- Render the data portion.
--- @param value string
--- @param plain boolean
--- @return string
local function render_data(value, plain)
    if plain then
        return value
    end

    return chinese_date {value, error = "ignore", suf = "yes"}
end

--- Render one item.
--- @param label string
--- @param value string
--- @param plain boolean
--- @return string
local function render_item(label, value, plain)
    return ("%s:%s"):format(render_label(label), render_data(value, plain))
end

--- Handle shorthand single-value usage.
--- @param args table
--- @param plain boolean
--- @return table|nil
local function get_single_item(args, plain)
    local first, second = args[1], args[2]

    if first and second == nil then
        return {render_data(first, plain)}
    end

    if second and first == nil then
        return {render_data(second, plain)}
    end
end

--- Collect normal paired items.
--- @param args table
--- @param plain boolean
--- @return table
local function get_paired_items(args, plain)
    local items = {}

    for i = 1, ITEMS_LIMIT * 2, 2 do
        local label = args[i]
        if not label or label == "" then
            break
        end

        items[#items + 1] = render_item(label, args[i + 1] or "", plain)
    end

    return items
end

--- Parse arguments into rendered items.
--- @param args table
--- @return table
local function get_items(args)
    local plain = yesno(args.plain, DEFAULT_PLAIN_MODE)
    return get_single_item(args, plain) or get_paired_items(args, plain)
end

--- Internal entry point.
--- @param args table
--- @return string
function p._main(args)
    return unbulleted(get_items(args))
end

--- Template entry point.
--- @param frame table
--- @return string
function p.main(frame)
    return p._main(getArgs(frame))
end

return p