模組:Hatnote only
外观
require("strict")
local getArgs = require("Module:Arguments").getArgs
local lc = require("Module:WikitextLC")
local BLANK = mw.getCurrentFrame():callParserFunction("#tag:nowiki")
local HANS_VARIANTS = {"cn", "sg", "my", "hans"}
local HANT_VARIANTS = {"tw", "hk", "mo", "hant"}
local function is_in(item, list)
for _, v in ipairs(list) do
if v == item then
return true
end
end
return false
end
local function is_subset(list1, list2)
for _, item in ipairs(list1) do
if not is_in(item, list2) then
return false
end
end
return true
end
local function code_to_variant(code)
if string.find(code, "^zh") then
return code
end
if is_in(code, HANS_VARIANTS) or is_in(code, HANT_VARIANTS) then
return "zh-" .. code
end
return code
end
local function __normalize_args(args)
for k, _ in pairs(args) do
if not is_in(k, {1, 2, "show", "hide"}) then
return args
end
end
local _args = {
args[1],
show1 = args.show or args[2],
hide1 = args.hide
}
return _args
end
local function parse_rule(args)
local variant_dict = {
["zh"] = args[1] -- 為維護便利,不轉換用字預設會顯示所有頂註
}
local shown_variants = mw.text.split(args.show, "%s*,%s*")
for _, v in ipairs(shown_variants) do
local variant = code_to_variant(v)
variant_dict[variant] = lc.converted(args[1], variant)
end
local hidden_variants = args.hide and mw.text.split(args.hide, "%s*,%s*") or {}
if is_subset(shown_variants, HANS_VARIANTS) then
table.insert(hidden_variants, HANT_VARIANTS[1])
elseif is_subset(shown_variants, HANT_VARIANTS) then
table.insert(hidden_variants, HANS_VARIANTS[1])
end
for _, v in ipairs(hidden_variants) do
local variant = code_to_variant(v)
variant_dict[variant] = lc.converted(BLANK, variant)
end
return lc.selective(variant_dict)
end
local function main(args)
local args = __normalize_args(args)
local items = {}
for i, v in ipairs(args) do
local _args = {v, show = args["show" .. i], hide = args["hide" .. i]}
local item = parse_rule(_args)
table.insert(items, item)
end
return table.concat(items, "")
end
local p = {}
local function makeInvokeFunc(funcName)
return function(frame)
local args = getArgs(frame)
return p[funcName](args)
end
end
p.main = makeInvokeFunc("_main")
function p._main(args)
local result = main(args)
return result
end
return p