模块: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