模块:TDN

来自Cookie☆Wiki

可在模块:TDN/doc创建此模块的帮助文档

local p = {}

local kind_tdn_table = mw.loadData('Module:TDN/data') -- 例: { "人物" = { "TDN" = { "多田野", "多田野数人" }, "SZK兄贵" = "曲林静樹", … }, … }

--! 根据 `类别=>TDN表记=>正常名称` 表, 返回转换为 `类别=>正常名称=>TDN表记` 形式的表.
--! @param 1 可以为空, 字符串或值由字符串组成的表. 若非空, 则返回的表只包含此参数指定的类别.
--!
--! @feature 如果同一类别下同一名称有多个 TDN 表记, 则只会包含最靠后的那个 TDN 表记
function get_kind_rev_tdn_table(filtered_kinds) -- 返回值例: { "人物" = { "多田野" = "TDN", "多田野数人" = "TDN", "曲林静樹" = "SZK兄贵" } }
    if filtered_kinds == nil then
        filtered_kinds = kind_tdn_table
    elseif type(filtered_kinds) == 'string' then
        filtered_kinds = { [kind] = filtered_kinds }
    end
    
    local kind_rev_tdn_table = {}
    for kind, _ in pairs(filtered_kinds) do
        local tdn_table = kind_tdn_table[kind]
        local rev_table = {}
        for tdn, tadanos in pairs(tdn_table) do
            if string.sub(tdn, 1, 2) == '$!' then
                rev_table[tdn] = tadanos
            else
                if type(tadanos) == 'table' then
                    for _, tadano in pairs(tadanos) do
                        rev_table[tadano] = tdn
                    end
                else
                    rev_table[tadanos] = tdn
                end
            end
        end
        kind_rev_tdn_table[kind] = rev_table
    end
    return kind_rev_tdn_table
end

--! 将正常名称 TDN 化
--! @param 1    正常名称
--! @param kind 名称所属的类别
--!
--! @feautre 如果同一类别下同一名称有多个 TDN 表记, 则只会返回最靠后的那个 TDN 表记
function p.tdnize()
    local frame = mw.getCurrentFrame()
    local name = frame.args[1]
    local kind = frame.args['kind'] or frame.args['类别']
    local no_missing_prefix = require('Module:Yesno')(frame.args['no_missing_prefix'] or frame.args['无缺失前缀'])
    _ = name and kind or error('必须同时包含参数 "1" 与 "kind"')

    local kind_name_to_tdn_table = get_kind_rev_tdn_table()
    local name_to_tdn_table = kind_name_to_tdn_table[kind]

    local missing_prefix = name_to_tdn_table['$!缺失前缀'] or ""
    local tdn = name_to_tdn_table[name]
    if tdn ~= nil then
        return tdn
    elseif no_missing_prefix then
        return name
    else
        return mw.text.nowiki(missing_prefix .. name)
    end
    -- return name_to_tdn_table[name] or ((name_to_tdn_table['$!缺失前缀'] or "") .. name)
end

--! 将 TDN 表记正常化
--! @param 1                                TDN 表记
--! @param kind                             表记所属的类别
--! @param returns_all_result/返回全部结果  可选, 缺省为假. 如果为真, 则返回所有匹配的结果, 否则只返回查到的第一个结果
--! @param sep                              可选, 缺省为 ','. 用于分割多个结果
--!
--! @feature 大小写敏感
function p.detdnize()
    local frame = mw.getCurrentFrame()
    local tdn_notation = frame.args[1]
    local kind = frame.args['kind'] or frame.args['类别']
    local all = require('Module:Yesno')(frame.args['returns_all_result'] or frame.args['返回全部结果'] or false)
    local sep = frame.args['sep'] or frame.args['分隔符'] or ','
    _ = tdn_notation and kind or error('必须同时包含参数 "1" 与 "kind"')

    local result = kind_tdn_table[kind][tdn_notation] or error('未找到 TDN 表记对应的正常名称: ' .. tdn_notation)
    if type(result) == 'string' then
        return result
    elseif not all then
        return result[1]
    else
        return table.concat(result, sep)
    end
end

return p