更多操作
此模块的文档可以在模块:TDN/doc创建
local p = {}
local kind_tdn_table = mw.loadData('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 paris(tdn_table) do
if string.sub(tdn, 1, 2) ~= '$!' then --< 若键以 '$!' 为前缀, 则忽略
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['类别']
_ = 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]
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 可选, 缺省为 ','. 用于分割多个结果
function p.detdnize()
local frame = mw.getCurrentFrame()
local tdn_notation = frame.args[1]
local kind = frame.args['kind'] or frame.args['类别']
local all = require('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