跳转到内容

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