-- 模块: llsifeventinfo
-- 迁移自模板: llsifeventinfo
-- 未完成!!请不要让这个模块正式应用。
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- 映射 type => fulltype
local fulltypeMap = {
token = '收集活动', sm = 'SCORE MATCH', mf = 'Medley Festival', cf = 'Challenge Festival',
as = '散步拉力赛', cm = '友情大合战', la = '演唱会♪竞技场', sl = '歌单'
}
local function fulltype(t)
return fulltypeMap[t or ''] or ''
end
-- lktype: sm -> Score Match; la -> 演唱会 竞技场; default fulltype
local function lktype(t, ft)
if t == 'sm' then return 'Score Match' end
if t == 'la' then return '演唱会 竞技场' end
return ft
end
-- jatype: as / cm / la / sl 专用日文; 默认 fulltype
local function jatype(t, ft)
if t == 'as' then return 'おさんぽラリー' end
if t == 'cm' then return 'なかよしマッチ' end
if t == 'la' then return 'ライブ♪アリーナ' end
if t == 'sl' then return 'セットリスト' end
return ft
end
-- entype / wwtype: as / cm 特殊
local function entype(t, ft)
if t == 'as' then return 'Adventure Stroll' end
if t == 'cm' then return 'COMPANION MATCH' end
return ft
end
local function wwtype(t, ft)
return entype(t, ft) -- 同逻辑
end
-- 轮次英文单词(sm, cm => ROUND; as => Episode; default Round)
local function roundWord(t)
if t == 'sm' or t == 'cm' then return 'ROUND' end
if t == 'as' then return 'Episode' end
return 'Round'
end
-- 用于安全取值
local function nz(v, fallback) if v and v ~= '' then return v else return fallback end end
-- Helpers to build tables with mw.html
-- helper wrappers for template / parser function expansion
local function lang(frame, code, text)
if not text or text == '' then return '' end
return frame:expandTemplate{ title = 'lang', args = { code, text } }
end
local function refTag(frame, text)
if not text or text == '' then return '' end
return frame:callParserFunction{ name = '#tag', args = { 'ref', text } }
end
local function lj(frame, text)
if not text or text == '' then return '' end
return frame:expandTemplate{ title = 'lj', args = { text } }
end
local function tpl(frame, name, args)
return frame:expandTemplate{ title = name, args = args or {} }
end
local function buildMainServerTable(frame, args, meta)
local t = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center')
local header = t:tag('tr')
header:tag('th'):wikitext('服务器')
header:tag('th'):wikitext('活动名称')
header:tag('th'):wikitext('活动时间')
local function addRows(label, mainName, time1, name2, time2, rowspan)
local tr = t:tag('tr')
if rowspan > 1 then
tr:tag('td'):attr('rowspan', rowspan):wikitext(label)
tr:tag('td'):wikitext(mainName)
tr:tag('td'):attr('rowspan', rowspan):wikitext(time1)
if name2 then
local tr2 = t:tag('tr')
tr2:tag('td'):wikitext(name2)
tr2:tag('td'):wikitext(time2 or '')
end
else
tr:tag('td'):wikitext(label)
tr:tag('td'):wikitext(mainName)
tr:tag('td'):wikitext(time1)
end
end
-- 日/英文版组合
local hasEN = (args['en-nm'] and args['en-nm']~='') or (args['en-idot'] and args['en-idot']~='')
local jaNm = nz(args['ja-nm'], '第' .. nz(args['ja-idot'], '') .. '回 ' .. meta.jaType)
local jaNm2 = args['ja-nm2']
local jaNm2Row = jaNm2 and jaNm2~=''
local jaTime = args['ja-tm'] or ''
local jaTime2 = args['ja-tm2'] or ''
addRows(hasEN and '日文版' or '日服', lang(frame, 'ja', jaNm), jaTime, jaNm2 and lang(frame, 'ja', jaNm2) or nil, jaTime2, jaNm2Row and 2 or 1)
if hasEN then
local enIdot = nz(args['en-idot'], args['ja-idot'] or '')
local enName = table.concat({ meta.roundW, enIdot, meta.enType }, ' ')
local enTime = args['en-tm'] or ''
addRows('英文版', enName, enTime, nil, nil, 1)
end
-- 国服
local cnNm = args['cn-nm']
if (cnNm and cnNm~='') or (args['cn-idot'] and args['cn-idot']~='') then
local cnNm2 = args['cn-nm2']
local cnNm2Row = cnNm2 and cnNm2~=''
local cnIdot = nz(args['cn-idot'], args['ja-idot'] or '')
local cnMainNm = cnNm ~= '' and cnNm or ('第' .. tpl(frame, 'zhnum4', cnIdot) .. '次 '.. meta.ft)
addRows('国服', cnMainNm, args['cn-tm'] or '', cnNm2, args['cn-tm2'] or '', cnNm2Row and 2 or 1)
end
-- 台服
local twNm = args['tw-nm']
if (twNm and twNm~='') or (args['tw-idot'] and args['tw-idot']~='') then
local twNm2 = args['tw-nm2']
local twNm2Row = twNm2 and twNm2~=''
local twIdot = nz(args['tw-idot'], args['ja-idot'] or '')
local twMainNm = twNm and twNm~='' and lang(frame, 'zh-hant', twNm) or lang(frame, 'zh-hant', '第'.. twIdot ..'回 '.. meta.ft)
addRows('台服', twMainNm, args['tw-tm'] or '', twNm2 and lang(frame, 'zh-hant', twNm2) or nil, args['tw-tm2'] or '', twNm2Row and 2 or 1)
end
-- 国际/美服
local wwNm = args['ww-nm']
if (wwNm and wwNm~='') or (args['ww-idot'] and args['ww-idot']~='') then
local wwNm2 = args['ww-nm2']
local wwIdot = nz(args['ww-idot'], args['ja-idot'] or '')
local label = (args['ko-nm'] and args['ko-nm']~='') and '美服' or '国际服'
local main = table.concat({ meta.roundW, wwIdot, meta.wwType }, ' ')
local wwNm2Row = wwNm2 and wwNm2~=''
local main2 = wwNm2Row and table.concat({ meta.roundW, nz(args['ww-idot2'], wwIdot), meta.wwType }, ' ') or nil
addRows(label, main, args['ww-tm'] or '', main2, args['ww-tm2'] or '', wwNm2Row and 2 or 1)
end
-- 韩服
local koNm = args['ko-nm']
if (koNm and koNm~='') or (args['ko-idot'] and args['ko-idot']~='') then
local koIdot = nz(args['ko-idot'], args['ja-idot'] or '')
local koMain = lang(frame, 'ko', mw.ustring.format('제%s회 %s', koIdot, meta.ft))
addRows('韩服', koMain, args['ko-tm'] or '', nil, nil, 1)
end
return tostring(t)
end
local function buildRewardTable1(frame, args)
if not ((args['ur'] and args['ur']~='') or (args['sr1'] and args['sr1']~='') or (args['ssr'] and args['ssr']~='')) then return '' end
local t = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center')
local trh = t:tag('tr'); trh:tag('th'):attr('colspan', 2):wikitext('活动奖励')
local function row(label, content)
local tr = t:tag('tr')
tr:tag('td'):wikitext(label)
tr:tag('td'):wikitext(content)
end
if args['ur'] and args['ur']~='' then
local list = {}
for part in mw.ustring.gmatch(mw.ustring.gsub(args['ur'], '、', ','), '([^,]+)') do
part = mw.text.trim(part)
if part~='' then table.insert(list, '[['..part..']]') end
end
row('UR', table.concat(list, '<br />'))
end
if args['ssr'] and args['ssr']~='' then
row('SSR', '[['..args['ssr']..'|秘密]]')
end
if args['sr1'] and args['sr1']~='' then
local sr1 = args['sr1'] or ''
local sr2 = args['sr2'] or ''
local e1 = args['sr-event1'] or ''
local e2 = args['sr-event2'] or ''
local content = mw.ustring.format('[[%s]]%s<br>[[%s]]%s', sr1, refTag(frame, '复刻自过往活动[[LoveLive!学园偶像祭/'.. e1 ..'|'.. e1 ..']]。'), sr2, refTag(frame, '复刻自过往活动[[LoveLive!学园偶像祭/'.. e2 ..'|'.. e2 ..']]。'))
row('复刻SR', content)
end
return tostring(t)
end
local function buildRewardTable2(frame, args)
local hasSR1 = args['sr1'] and args['sr1']~=''
local hasSSR1 = args['ssr1'] and args['ssr1']~=''
if not (hasSR1 or hasSSR1) then return '' end
local hasSSR2 = args['ssr2'] and args['ssr2']~=''
local t = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center')
local colSpanHeader = hasSSR1 and 4 or 2
local note = ''
if args['sr-event1'] and args['sr-event1']~='' then
note = refTag(frame, '此次活动的奖励SR在日后活动[[LoveLive!学园偶像祭/'.. args['sr-event1'] ..'|'.. args['sr-event1'] ..']]中复刻。')
end
local trh = t:tag('tr'); trh:tag('th'):attr('colspan', colSpanHeader):wikitext('活动先行配信SR' .. note .. (hasSSR1 and '/ 转校生SSR' or ''))
local tr2 = t:tag('tr')
tr2:tag('td'):attr('colspan', hasSSR1 and 2 or 1):wikitext('活动pt达成')
tr2:tag('td'):attr('colspan', hasSSR2 and 2 or 1):wikitext('活动pt排名')
local tr3 = t:tag('tr')
if args['sr2'] and args['sr2']~='' and hasSSR1 then
tr3:tag('td'):wikitext("'''SR'''<br />[[".. (args['sr1'] or '') ..']]' )
tr3:tag('td'):wikitext("'''SSR'''<br />[[".. (args['ssr1'] or '') ..']]')
tr3:tag('td'):wikitext("'''SR'''<br />[[".. (args['sr2'] or '') ..']]')
tr3:tag('td'):wikitext("'''SSR'''<br />[[".. (args['ssr2'] or '') ..']]')
else
tr3:tag('td'):attr('colspan', 2):wikitext('[['.. (args['sr1'] or '') ..']]')
end
return tostring(t)
end
local function buildNavTable3(frame, args, meta)
local t = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center'):css('margin', '0'):attr('width', '100%')
local th = t:tag('tr'); th:tag('th'):attr('colspan', 3):wikitext('[[LoveLive!学园偶像祭]] 活动导航')
local jaId = args['ja-id'] or ''
local jaNum = tonumber(jaId)
local prevCalc = jaNum and tostring(jaNum - 1) or ''
local nextCalc = jaNum and tostring(jaNum + 1) or ''
if args['ja-nm-prev'] and args['ja-nm-prev']~='' then
local tr = t:tag('tr')
tr:tag('td'):wikitext("'''上次活动'''")
tr:tag('td'):wikitext(prevCalc)
tr:tag('td'):wikitext("'''" .. lj(frame, '[[LoveLive!学园偶像祭/'.. (args['ja-lk-prev'] or '') ..'|'.. (args['ja-nm-prev'] or '') ..']]') .. "'''")
end
do
local tr = t:tag('tr')
tr:tag('td'):wikitext("'''本次活动'''")
tr:tag('td'):wikitext(jaId)
tr:tag('td'):wikitext("'''" .. lj(frame, (args['ja-nm'] or ('第'.. jaId ..'回 '.. meta.jaType))) .. "'''")
end
if args['ja-nm-next'] and args['ja-nm-next']~='' then
local tr = t:tag('tr')
tr:tag('td'):wikitext("'''下次活动'''")
tr:tag('td'):wikitext(nextCalc)
tr:tag('td'):wikitext("'''" .. lj(frame, '[[LoveLive!学园偶像祭/'.. (args['ja-lk-next'] or '') ..'|'.. (args['ja-nm-next'] or '') ..']]') .. "'''")
end
return tostring(t)
end
function p.main(frame)
local args = getArgs(frame, { parentFirst = true })
local t = args.type or ''
local meta = {
ft = fulltype(t),
lk = lktype(t, fulltype(t)),
jaType = jatype(t, fulltype(t)),
enType = entype(t, fulltype(t)),
wwType = wwtype(t, fulltype(t)),
roundW = roundWord(t)
}
local wrapper = mw.html.create('div')
:css('display', 'flex')
:css('justify-content', 'space-between')
:css('flex-wrap', 'wrap')
local content = ''
content = content .. tpl(frame, 'multicol') .. buildMainServerTable(frame, args, meta)
local reward1 = buildRewardTable1(frame, args)
local reward2 = buildRewardTable2(frame, args)
if (reward1 ~= '' or reward2 ~= '') then
content = content .. tpl(frame, 'multicol-break')
if reward1 ~= '' then content = content .. reward1 end
if reward2 ~= '' then content = content .. reward2 end
content = content .. tpl(frame, 'multicol-end')
else
content = content .. tpl(frame, 'multicol-end')
end
if t ~= 'la' and t ~= 'sl' then
content = content .. tpl(frame, 'multicol')
local tabsArgs = {
TextBackgroundColor='transparent',
TextBorderColor='transparent',
LabelPadding='0.5em',
LabelColor='blue',
TextPadding=0
}
tabsArgs.label1 = '日服'
tabsArgs.text1 = buildNavTable3(frame, args, meta)
if (args['cn-nm'] and args['cn-nm']~='') or (args['cn-idot'] and args['cn-idot']~='') then
local cnTbl = mw.html.create('table'):addClass('wikitable'):css('text-align', 'center'):css('margin', '0'):attr('width', '100%')
local th = cnTbl:tag('tr'); th:tag('th'):attr('colspan', 3):wikitext('[[LoveLive!学园偶像祭]] 活动导航')
local cnId = args['cn-id'] or (args['ja-id'] or '')
local trc = cnTbl:tag('tr')
trc:tag('td'):wikitext("'''本次活动'''")
trc:tag('td'):wikitext(cnId)
trc:tag('td'):wikitext("'''".. (args['cn-nm'] or '') .."'''")
tabsArgs.label2 = '国服'
tabsArgs.text2 = tostring(cnTbl)
end
content = content .. frame:expandTemplate{ title='tabs/core', args = tabsArgs } .. tpl(frame, 'multicol-end')
end
wrapper:wikitext(content)
return tostring(wrapper)
end
return p