这个模块用于在不同角色条目里生成对应的称呼表。
由于该模块不可用#invoke调用,因此你需要按照以下步骤创建一个数据模块来调用它。
创建一个模块(例如Module:BanG Dream! 称呼表),然后用以下方式调用该模块:
local getArgs = require('Module:Arguments').getArgs local from = require('Module:称呼表').from local to = require('Module:称呼表').to local total = require('Module:称呼表').total local p = {} -- 这里待会儿用于填写数据和调用函数 return p
这样,会调用该模块中的三个函数:from、to和total,对应“xxx对其他角色的称呼”“其他角色对xxx的称呼”“所有角色称呼总表”。
首先,我们需要填写角色数据,包括角色名字已经你所期待的组别。以《BanG Dream!》系列中前两个乐队为例:
local member = { "户山香澄","花园多惠","牛込里美","山吹沙绫","市谷有咲", "美竹兰","青叶摩卡","上原绯玛丽","宇田川巴","羽泽鸫" } local group = { "{{BanG Dream!/Icon|ppp}}Poppin'Party", "{{BanG Dream!/Icon|ag}}Afterglow" } local groupmem = { [group[1]]={member[1],member[2],member[3],member[4],member[5]}, [group[2]]={member[6],member[7],member[8],member[9],member[10]} }
这样输入后,member[1]
对应的就是户山香澄,member[7]
对应的就是青叶摩卡,group[2]
对应的是Afterglow,
groupmem[group[1]]
则存储了group[1]
里含有哪些角色。
很显然,这样需要你记住每一个角色对应的位置,因此建议你在填写数据的时候按组别来换行,避免混淆。
称呼数据的格式为call[member[x]][member[y]]
,对应的是member[x]
对member[y]
的称呼,因此你可以用以下方式存储称呼:
local call = { [member[1]] = { [member[1]]="私",[member[2]]="おたえ",[member[3]]="りみりん",[member[4]]="さーや",[member[5]]="有咲", [member[6]]="蘭ちゃん",[member[7]]="モカちゃん",[member[8]]="ひまりちゃん",[member[9]]="巴ちゃん",[member[10]]="つぐ" }, -- 其他角色略去 }
请注意:如果某角色对另一角色没有称呼,也应当赋值[member[1]]=""
而不是不赋值,否则会出现难以预料的错误。
最终,我们需要获取框架传入的变量以及调用函数。from和to都有五个参数,其中需要查询的角色名需要从外部传入,group、groupmem、call都是刚刚我们定义好的变量,最后一个参数是语言标记,如果你需要将全部称呼标记为日文,可将语言标识以字符串形式传入,否则请直接略去。total不需要外部传入,它直接依据member、call和语言标识输出总表。
function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) if(args.from)then return from(args.from,group,groupmem,call,[[ja]]) elseif(args.to)then return to(args.to,group,groupmem,call,[[ja]]) else return total(member,call,[[ja]]) end end
创建Template:BanG Dream! 称呼表,以#invoke方式调用模块,大功告成:
{{#invoke:BanG Dream!称呼表|main}}
local p = {}
-- 预处理wikitext的辅助函数
local function wikitext(text)
return mw.getCurrentFrame():preprocess(text)
end
-- 生成角色对其他角色称呼的表格
function p.from(from, group, groupmem, call, lang)
local parts = {";" .. from .. "对其他角色的称呼\n", '<div style="display:flex;flex-wrap:wrap;gap:0;align-items:flex-start;width:100%">', "\n"}
for i, groupName in ipairs(group) do
if groupmem[groupName] then
table.insert(parts, string.format('{| class="wikitable" style="font-size:95%%; width:300px; text-align:center; margin:0"\n!colspan=2|%s\n', groupName))
for j, member in ipairs(groupmem[groupName]) do
table.insert(parts, "|-\n")
table.insert(parts, string.format('|style="width:50%%"|%s\n', member))
if call[from] and call[from][member] then
if lang then
table.insert(parts, string.format('|style="width:50%%"|{{lang|%s|%s}}\n', lang, call[from][member]))
else
table.insert(parts, string.format('|style="width:50%%"|%s\n', call[from][member]))
end
else
table.insert(parts, '|style="width:50%"|-\n') -- 空单元格
end
end
table.insert(parts, "|}\n")
end
end
table.insert(parts, "</div>")
return wikitext(table.concat(parts))
end
-- 生成其他角色对指定角色称呼的表格
function p.to(to, group, groupmem, call, lang)
local parts = {";其他角色对" .. to .. "的称呼\n", '<div style="display:flex;flex-wrap:wrap;gap:0;align-items:flex-start;width:100%">', "\n"}
for i, groupName in ipairs(group) do
if groupmem[groupName] then
table.insert(parts, string.format('{| class="wikitable" style="font-size:95%%; width:300px; text-align:center; margin:0"\n!colspan=2|%s\n', groupName))
for j, member in ipairs(groupmem[groupName]) do
table.insert(parts, "|-\n")
table.insert(parts, string.format('|style="width:50%%"|%s\n', member))
if call[member] and call[member][to] then
if lang then
table.insert(parts, string.format('|style="width:50%%"|{{lang|%s|%s}}\n', lang, call[member][to]))
else
table.insert(parts, string.format('|style="width:50%%"|%s\n', call[member][to]))
end
else
table.insert(parts, '|style="width:50%"|-\n') -- 空单元格
end
end
table.insert(parts, "|}\n")
end
end
table.insert(parts, "</div>")
return wikitext(table.concat(parts))
end
-- 生成完整的称呼矩阵表格
function p.total(member, call, lang)
local parts = {'{|class="wikitable"\n! '}
-- 添加表头
for i, mem in ipairs(member) do
table.insert(parts, "!!到" .. mem)
end
table.insert(parts, "\n")
-- 添加表格内容
for j, fromMem in ipairs(member) do
table.insert(parts, "|-\n!scope=\"row\"|从" .. fromMem)
for i, toMem in ipairs(member) do
if call[fromMem] and call[fromMem][toMem] then
if lang then
table.insert(parts, string.format("\n|{{lang|%s|%s}}", lang, call[fromMem][toMem]))
else
table.insert(parts, "\n|" .. call[fromMem][toMem])
end
else
table.insert(parts, "\n|-") -- 空单元格
end
end
table.insert(parts, "\n")
end
table.insert(parts, "|}")
return wikitext(table.concat(parts))
end
return p