Module:Songtable:修订间差异

来自Arcaea中文维基
(撤销Star0讨论)的版本27538)
标签撤销
无编辑摘要
 
(未显示10个用户的110个中间版本)
第1行: 第1行:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local getData = require("Module:data")
local link = require('Module:Link')._link
local getData = require("Module:Arcaea Data")
local CL = require('Module:ConvertLink')
 
local aLink= CL.artistLink
local pLink= CL.packLink
local dLink= CL.designerLink
local fullVer= CL.fullVersionNum
 
local songLength = mw.loadJsonData 'Template:Song Length.json'
 
local p = {}
local p = {}


function timeCov(t)
function timeCov(t)
return os.date("(%Y/%m/%d)", t)
   return os.date("%Y/%m/%d", t)
end
 
function dateCov(v, d, t, type)
   if not(v and d) then return nil end
   local box, a, b, c = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
   box:addClass("date-box")
   a:wikitext(t)
   if type == "arg"
     then
     b:wikitext(v..'<br />' .. '('..tostring(d) .. ')')
   else
   local vv, dd = fullVer(v,d)
     b:wikitext('v'..vv..'<br />' .. '('..dd .. ')')
   end
   box:wikitext(tostring(a))
   :wikitext(tostring(b))
   :wikitext(tostring(c))
   return tostring(box)
end
 
function bgCov(bg)
   if bg == nil
     then
     return nil
   else
     return '[[:分类:采用'..bg..'背景的曲目|'..bg..']]'
   end
end
end


function dateArg(v,d,t)
function choice(a, aKey, b, bKey)
if not(v and d) then return nil end
   if aKey then return a end
local box,a,b,c = mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' )
   if bKey then return b end
box:addClass( "date-box" )
   return nil
a:wikitext(t)
b:wikitext(v..'<br>'..'('..tostring(d)..')')
box:wikitext(tostring(a))
  :wikitext(tostring(b))
  :wikitext(tostring(c))
return tostring(box)
end
end
 
function dateData(v,d,t)
function diffMark(diffText, byd, name, inNs, nsByd)
if not(v and d) then return nil end
   local diff, mark = mw.html.create('div'), mw.html.create('div')
local box,a,b,c = mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' )
   diff:wikitext(diffText)
box:addClass( "date-box" )
   mark:wikitext(' 仅移动版')
a:wikitext(t)
   if byd and inNs and not(nsByd)
b:wikitext('v'..v..'<br>'..tostring(timeCov(d)))
     then
box:wikitext(tostring(a))
     return tostring(tostring(diff)..tostring(mark))
  :wikitext(tostring(b))
   else
  :wikitext(tostring(c))
     return tostring(diff)
return tostring(box)
   end
end
 
function labelText(text, class)
   local span = mw.html.create('span')
   span:addClass('label-text')
   span:wikitext(text)
   return tostring(span)
end
end


function merge(list)
function getImage(id, all, pst, prs, ftr, byd, second, normalJacketArgs, bydJacketArgs, normalJacketData, bydJacketData, bydyes, mold, imageConfig, tab1text, tab2text)
local merge
-- 谢邀,这写的什么东西我自己都看不懂了 ———Star0
if list[4] then merge={1,1,1,1} else merge={1,1,1} end
if not(id or all) then
local o
return nil
if list[4] then o=4 else o=3 end
 
else
local container, tab = mw.html.create('div'), mw.html.create('div')
local tab1, tab2, tab3, part1, part2, part3, jacket1, jacket2
container:addClass('container')
tab:attr('id', 'tab-'..mold) tab:addClass('img-tab')
local normalJacket, bydJacket
if normalJacketArgs then
if bydJacketArgs then
normalJacket, bydJacket = normalJacketArgs, bydJacketArgs
else
normalJacket, bydJacket = normalJacketArgs, normalJacketArgs
end
else
if normalJacketData == "" or normalJacketData == nil then
normalJacket, bydJacket = '未显示', '未显示'
else
normalJacket, bydJacket = link({'画师', tostring(normalJacketData)}), link({'画师', tostring(bydJacketData)})
end
end


if list[4] then
if bydyes and imageConfig~='nobyd' then
if list[4]==list[3] then merge[3]=merge[3]+merge[4] merge[4]=0 end
tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
end
tab1:wikitext('Normal') tab2:wikitext('Beyond')
tab1:addClass('active img-tab-part normal') tab2:addClass('img-tab-part byd')
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
container:wikitext(tostring(tab))


if list[3]==list[2] then merge[2]=merge[2]+merge[3] merge[3]=0 end
if all and byd then
part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]'..labelText('画师')..tostring(bydJacket))
elseif id then
part1:wikitext('[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[ 文件:Songs '..id..' byd.jpg|256px|none]]'..labelText('画师')..tostring(bydJacket))
end


if list[2]==list[1] then merge[1]=merge[1]+merge[2] merge[2]=0 end
part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
return tostring(container)


for i=1,o do
if merge[i]==0 then
merge[i]='display:none'
else
else
merge[i]='grid-column-start: span '..merge[i]..';'
if pst and prs and ftr then
tab1, tab2, tab3, part1, part2, part3 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
 
tab1:wikitext('Past') tab2:wikitext('Present') tab3:wikitext('Future')
tab1:addClass('img-tab-part pst') tab2:addClass('img-tab-part prs') tab3:addClass('active img-tab-part ftr')
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2)) tab:wikitext(tostring(tab3))
container:wikitext(tostring(tab))
 
part1:wikitext('[[文件:'..pst..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..prs..'|256px|none]]'..labelText('画师')..normalJacket) part3:wikitext('[[文件:'..ftr..'|256px|none]]'..labelText('画师')..normalJacket)
part1:addClass('tab-text-'..mold) part2:addClass('tab-text-'..mold) part3:addClass('active tab-text-'..mold)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))
return tostring(container)
 
elseif second then
tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
tab1:wikitext(tab1text or '第一曲绘') tab2:wikitext(tab2text or '第二曲绘')
tab1:addClass('active img-tab-part normal') tab2:addClass('img-tab-part normal')
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
container:wikitext(tostring(tab))
 
if all then
part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..normalJacket)
else
part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..normalJacket)
end
 
part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
return tostring(container)
 
else
if all then
return '<div>[[ 文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket..'</div>'
else
return '<div>[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket..'</div>'
end
end
end
end
end
end
return merge
end
end


function re0()
-- Last判断(未启用)(需要修改)
return nil
-- if id == 'last' then
-- tab1, tab2, tab3, part1, part2, part3 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
-- tab1:wikitext('Normal') tab2:wikitext('Moment') tab3:wikitext('Eternity')
-- tab1:addClass('active img-tab-part ftr') tab2:addClass('img-tab-part byd') tab3:addClass('img-tab-part byd')
-- tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2)) tab:wikitext(tostring(tab3))
-- container:wikitext(tostring(tab))
-- part1:wikitext('[[文件:Songs last.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs last byd.jpg|256px|none]]'..labelText('画师')..normalJacket) part3:wikitext('[[文件:Songs last byd2.jpg|256px|none]]'..labelText('画师')..normalJacket)
-- part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold) part3:addClass('tab-text-'..mold)
-- container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))
-- return tostring(container)
-- end
 
function merge(list)
   local span = {}
 
   local lastUniqueIndex = nil
   local currentIndex = 1
 
   while currentIndex<=#list do
     if lastUniqueIndex and list[lastUniqueIndex] == list[currentIndex] then
       span[lastUniqueIndex] = span[lastUniqueIndex] + 1
       span[currentIndex] = 0
     else
       lastUniqueIndex = currentIndex
       span[currentIndex] = 1
     end
     currentIndex = currentIndex + 1
   end
 
   local merge = {}
 
   for i = 1, #list do
     if span[i] == 0 then
       merge[i] = 'display:none'
     else
       merge[i] = 'grid-column-start: span '..span[i] .. ';'
     end
   end
 
   return merge
end
 
function title(name,nameSecond,online)
   local result=name
   if nameSecond then result = result .. "<br />" .. nameSecond end
   if not(online) then result = result .. "<br />" .. '此曲目暂未上线' end
   return result
end
end


function p.main(frame)
function p.main(frame)
local args = getArgs(frame)
   local args = getArgs(frame)
return p._main(args)
   return p._main(args)
end
 
function getCategoryText(category)
   if category=="poprec" then return "流行/推荐" end
   if category=="partner" then return "搭档" end
   if category=="original" then return "原创" end
   if category=="variety" then return "综合" end
   if category=="musicgames" then return "音乐游戏" end
   return nil
end
end


function p._main(args)
function p._main(args)
local data,dataNs
   frame=mw.getCurrentFrame()
local argsLength = 0
 
for _,_ in pairs(args) do argsLength=argsLength+1 end
   -- 获取数据查找函数
   local data, dataNs
   if args["id"] and args["id"] ~= ""
   then
     data, dataNs = getData.singleSongInformation(args['id'], "id", "mobile"), getData.singleSongInformation(args['id'], "id", "ns")
   elseif args["曲名"]
   then
     data, dataNs = getData.singleSongInformation(args['曲名'], "name", "mobile"), getData.singleSongInformation(args['曲名'], "name", "ns")
   end
 
   -- 判断曲目在哪个平台存在。
   local inMobile,inNs = false, false
   if data("id") or args["更新时间"] then
     inMobile = true
   end
 
   if dataNs("id") or args["更新时间NS"] then
     inNs = true
   end
  
   -- 判断byd谱面是否存在。
   local byd, nsByd
   if args['Beyond等级'] or data('bydRating') then byd = true else byd = false end
   if args['Beyond等级NS'] or dataNs('bydRating') then nsByd = true else nsByd = false end
   -- 判断etr谱面是否存在;先假定NS不会有eternal等级。
   local etr
   if args['Eternal等级'] or data('etrRating') then etr = true else etr = false end
   -- 处理谱师参数,未填写的等级谱师向前级复制(向下兼容)
   local getChartDesigner = {
     {'PastNote编写', 'note编写', 'pstChartDesigner'},
     {'PresentNote编写', 'note编写', 'prsChartDesigner'},
     {'FutureNote编写', 'note编写', 'ftrChartDesigner'},
     {'BeyondNote编写', 'note编写', 'bydChartDesigner'}
   }
   -- 假定 etr 与 byd 不会同时出现
   if etr then
     getChartDesigner[4]={'EternalNote编写', 'note编写', 'etrChartDesigner'}
   end
 
   local chartDesigner = {}
   for i, k in ipairs(getChartDesigner)
     do
       if args[k[1]] then
         chartDesigner[i] = args[k[1]]
       elseif args[k[2]] then
         chartDesigner[i] = args[k[2]]
       else
         chartDesigner[i] = choice(dLink(tostring(data(k[3])), data('id')), data(k[3]), '', true)
       end
   end
 
   -- 依据byd是否存在处理单元格合并参数。
   local span
   if byd or etr then
     span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3], chartDesigner[4]})
   else
     span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3]})
   end
 
   local pstBg = args['Past背景'] or args['背景'] or data('pstBg')
   local prsBg = args['Present背景'] or args['背景'] or data('prsBg')
   local ftrBg = args['Future背景'] or args['背景'] or data('ftrBg')
   local appendBg
   -- 依据byd是否存在处理背景合并参数
   -- 写的硬了点,没和上面一样展开
   if byd then
     appendBg = args['Beyond背景'] or args['背景'] or data('bydBg')
   elseif etr then
   appendBg = args['Eternal背景'] or args['背景'] or data('etrBg')
   end
   local bgSpan = merge({pstBg, prsBg, ftrBg, appendBg})
 
 
   -- if args['曲名'] == 'Tempestissimo' then spanNs = {'grid-column-start: span 1', 'grid-column-start: span 1', 'grid-column-start: span 1', 'grid-column-start: span 1'} end
 
   local imageA = getImage(data('id'), args['图片'], args['Past曲绘'], args['Present曲绘'], args['Future曲绘'], args['Beyond曲绘'],
   args['第二曲绘图片'], args['画师'], args['Beyond画师'], data('ftrJacketDesigner'), data('bydJacketDesigner'), byd, 'a', args['图片显示控制'], args['第一曲绘说明'], args['第二曲绘说明'])
   local imageB = getImage(data('id'), args['图片'], args['Past曲绘'], args['Present曲绘'], args['Future曲绘'], args['Beyond曲绘'],
   args['第二曲绘图片'], args['画师'], args['Beyond画师'], data('ftrJacketDesigner'), data('bydJacketDesigner'), byd, 'b', args['图片显示控制'], args['第一曲绘说明'], args['第二曲绘说明'])
 
   local pstRating = args['Past等级'] or data('pstRating')
   local prsRating = args['Present等级'] or data('prsRating')
   local ftrRating = args['Future等级'] or data('ftrRating')
   local bydRating = args['Beyond等级'] or data('bydRating')
   local etrRating = args['Eternal等级'] or data('etrRating')
 
   local additionalDiffMark
   local additionalDiffMarkClass='byd-label'
   if byd then
     additionalDiffMark = diffMark('[Beyond]', byd, args['曲名'], inNs, nsByd)
     additionalDiffMarkClass='byd-label'
   elseif etr then
     additionalDiffMark = diffMark('[Eternal]', etr, args['曲名'], inNs, false)
     additionalDiffMarkClass='etr-label'
   end
 
   local setText=args['曲包MO'] or choice(pLink(tostring(getData.packName(data('set')))),data('set'),nil)
   local nsSetText=args['曲包NS'] or choice(pLink(tostring(getData.packName(dataNs('set'))),nil,1),dataNs('set'),nil)
   local categoryText=args['类别'] or getCategoryText(data('category'))
 
   local setDisplayText=tostring(setText)
   if setText then
     if categoryText then
       setDisplayText=setDisplayText.." - "..categoryText
     end
     if nsSetText and setText~=nsSetText then
       setDisplayText=setDisplayText..frame:expandTemplate{ title = "仅", args = {"移动版","","图片角标"} }.."<br />"..tostring(nsSetText)..frame:expandTemplate{ title = "仅", args = {"NS版","","图片角标"} }
     end
   else
     setDisplayText=nsSetText
   end
if argsLength>=16
local _v, _d = fullVer(data('version'), tonumber(data('date')))
then
local ver = args['更新版本'] or 'v'.._v
data,dataNs=re0,re0
local verDate = args['更新时间'] or _d
   local length = args['时长'] or songLength.normal[data("id") or dataNs("id")]
 
   -- 生成Grid表格的信息表;在后文中依据格式进行生成。
   local infoList = {
     { title(args['曲名'] or data('title') or dataNs('title'), args['第二曲名'], data('id') or dataNs('id') or #args > 1), { id = 'title'}},
 
     { imageA or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'top-image'}},
     { imageB or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'right-image'}},
 
     { '曲目信息', {class = 'header'} },
 
     { '曲师', { class = 'label'}},
     { args['曲师'] or args['编曲'] or choice(aLink(tostring(data('artist'))) or aLink(tostring(dataNs('artist'))), data('artist') or dataNs('artist'), '', true), { class = 'data'}},
 
     { '曲包', { class = 'label'}},
     { args['曲包'] or setDisplayText, { class = 'data'}},
 
     { '时长', { class = 'label'}},
     { length or '-:--', { class = 'data'}},
 
     { 'BPM', { class = 'label'}},
     { args['BPM'] or data('bpm') or dataNs('bpm'), { class = 'data'}},
 
     { '谱面信息', { class = 'header'}},
 
     { '难度', { class = 'label'}},
     { '[Past]', { class = 'pst-label'}},
     { '[Present]', { class = 'prs-label'}},
     { '[Future]', { class = 'ftr-label'}},
     { additionalDiffMark, { class = additionalDiffMarkClass}},
 
     { '等级', { class = 'label'}},
     { pstRating, { class = 'pst-data'}},
     { prsRating, { class = 'prs-data'}},
     { ftrRating, { class = 'ftr-data'}},
     { bydRating or etrRating, { class = 'byd-data'}},
 
     { 'note数量', { class = 'label'}},
     { args['PastNote'] or '空', { class = 'pst-data'}},
     { args['PresentNote'] or '空', { class = 'prs-data'}},
     { args['FutureNote'] or '空', {class = 'ftr-data'}},
     { args['BeyondNote'] or args['EternalNote'] or '空', { class = 'byd-data'}},
 
     { '谱面设计', { class = 'label'}},
     { chartDesigner[1] or '空', { class = 'pst-data'}, span[1]},
     { chartDesigner[2] or '空', { class = 'prs-data'}, span[2]},
     { chartDesigner[3] or '空', { class = 'ftr-data'}, span[3]},
     { chartDesigner[4] or '空', { class = 'byd-data'}, span[4]},
 
     { '谱面信息(Joy-Con)', { class = 'header ns', id = 'ns-play-header'}},
     { '难度', { class = 'label ns'}},
     { '[Past]', { class = 'pst-label ns'}},
     { '[Present]', { class = 'prs-label ns'}},
     { '[Future]', { class = 'ftr-label ns'}},
     { additionalDiffMark, { class = additionalDiffMarkClass..' ns'}},
 
     { 'note数量', { class = 'label ns'}},
     { args['PastNoteNS'] or args['PastNote'], { class = 'pst-data ns'}},
     { args['PresentNoteNS'] or args['PresentNote'], { class = 'prs-data ns'}},
     { args['FutureNoteNS'] or args['FutureNote'], { class = 'ftr-data ns'}},
     { args['BeyondNoteNS'] or '空', { class = 'byd-data ns'}},
 
     { '背景', { class = 'label'}},
     { bgCov(pstBg), { class = 'pst-data'}, bgSpan[1]},
     { bgCov(prsBg), { class = 'prs-data'}, bgSpan[2]},
     { bgCov(ftrBg), { class = 'ftr-data'}, bgSpan[3]},
     { bgCov(appendBg), { class = 'byd-data'}, bgSpan[4]},
     -- { bgCov(args['背景']) or bgCov(data('bg')) or bgCov(dataNs('bg')), { class = 'data' , id = 'bg-normal' }},
     -- { bgCov(args['Future背景']) , { class = 'data' , id = 'bg-ftr' }},
 
     { '更新时间', { id = 'update-data-label', class = 'label'}},
     { dateCov(ver, verDate, labelText('移动版'), 'arg'), { id = 'mobile-date-normal', class = 'data'}},
     { dateCov(args['Beyond更新版本'], args['Beyond更新时间'], labelText('移动版'), 'arg')
     or dateCov(args['Eternal更新版本'], args['Eternal更新时间'], labelText('移动版'), 'arg')
     or (data('bydVersion') and dateCov(data('bydVersion'), tonumber(data('bydDate')), labelText('移动版'), 'data'))
     or (data('etrVersion') and dateCov(data('etrVersion'), tonumber(data('etrDate')), labelText('移动版'), 'data'))
     or '空', { id = 'mobile-date-byd', class = 'data'}},
     { dateCov(args['更新版本NS'], args['更新时间NS'], labelText('NS版'), 'arg') or dateCov(dataNs('version'), tonumber(dataNs('date')), labelText('NS版'), 'data'), { id = 'ns-date-normal', class = 'data ns'}},
     { '空', { id = 'ns-date-byd', class = 'data ns'}}
   }
 
   local box = mw.html.create('div')
 
   -- 样式控制
   box:addClass("arcaeabox")
   -- 假定 etr 与 byd 不会同时出现,etr 暂时复用 byd 的逻辑
   if byd or etr then box:addClass("byd") end
if args['侧'] == '0' or data('side') == 0 or dataNs('side') == 0 then
box:addClass("light")
elseif data('side') == 1 or dataNs('side') == 1 or args['侧'] == '1' then
box:addClass("conflict")
elseif data('side') == 2 or dataNs('side') == 2 or args['侧'] == '2' then
box:addClass("colorless")
else
else
data,dataNs=getData.getMobile(args['曲名']),getData.getNS(args['曲名'])
box:addClass("lephon")
end
end
 
local byd
   if args['更新版本NS'] or dataNs('id')
if args['Beyond 等级'] or data('bydRating') then byd=true else byd=false end
     then
     box:addClass("ns-box")
local pstCd,prsCd,ftrCd,bydCd
     if not(dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') or dataNs('bydChange')) -- byd单独分栏禁用(但Infinite Strife,需要)
if args['note编写'] then
       then
pstCd,prsCd,ftrCd,bydCd=args['note编写'],args['note编写'],args['note编写'],args['note编写']
       box:addClass("ns-same")
else
     end
if args['FutureNote编写'] then
   end
pstCd,prsCd,ftrCd,bydCd=args['PastNote编写'],args['PresentNote编写'],args['FutureNote编写'],args['BeyondNote编写']
   -- 假定 etr 与 byd 不会同时出现,etr 暂时复用 byd 的逻辑
   if (args['Beyond更新版本'] and args['Beyond 更新时间']) or (args['Eternal更新版本'] and args['Eternal更新时间'])
   or data('bydVersion') or data('etrVersion') then box:addClass('mobile-byd-date') end
   if nsByd then box:addClass('ns-byd-date') box:addClass('ns-date-span') end
   if not(args['更新版本'] or args['更新时间'] or data('id')) then box:addClass('no-mobile') end
   -- 弃用这种class控制: if args['Future背景'] then box:addClass('bg-ftr') end
 
   -- 分类添加
   local category = ''
 
   if args[' 更新版本NS'] or dataNs('id')
     then
     if args[' 更新版本'] or args[' 更新时间'] or data('id')
       then
       category = category..'[[ 分类:双平台曲目]]'
     else
       category = category..'[[分类:NS版曲目]]'
     end
   else
     category = category..'[[分类:移动版曲目]]'
   end
 
   if dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') or dataNs('bydChange') then category = category..'[[分类:多模式谱面有差异的曲目]]' end
 
   if not(data('id') or dataNs('id') or #args > 1) then category = category..'[[分类:未登陆的曲目]]' end
 
   if (data('id') or dataNs('id')) and not(args['unset'])
     then
    
     -- 如果没有更新packlist,不自动进行分类。
     if choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set'))
       then
       category = category..'[[分类:'..tostring(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set'))) .. '曲包曲目]]'
     end
 
if args[' 侧'] == '0' or data('side') == 0 or dataNs('side') == 0
then
category = category..'[[分类:光芒侧曲目]]'
elseif args[' 侧'] == '1' or data('side') == 1 or dataNs('side') == 1
then
category = category..'[[分类:纷争侧曲目]]'
elseif args[' '] == '2' or data('side') == 2 or dataNs('side') == 2
then
category = category..'[[分类:消色侧曲目]]'
elseif args[' '] == '3' or data('side') == 3 or dataNs('side') == 3
then
category = category..'[[分类:Lephon侧曲目]]'
else
else
pstCd,prsCd,ftrCd,bydCd=data('pstChartDesigner'),data('prsChartDesigner'),data('ftrChartDesigner'),data('bydChartDesigner')
category = category..'[[分类:未知侧曲目]]'
end
end
end
 
if pstRating then
local span
     category = category..'[[ 分类:PST'..pstRating .. ' 级曲目]]'
if byd then
span=merge({ pstCd,prsCd,ftrCd,bydCd })
else
span=merge({ pstCd,prsCd,ftrCd })
end
local pstCdNs,prsCdNs,ftrCdNs,bydCdNs
if args['note编写NS'] then
pstCdNs,prsCdNs,ftrCdNs=args['note编写'],args['note编写'],args['note编写']
else
if args['PastNote编写NS'] and args['PresentNote编写NS'] and args['FutureNote编写NS'] then
pstCdNs,prsCdNs,ftrCdNs=args['PastNote编写NS'],args['PresentNote编写NS'],args['FutureNote编写NS']
else
pstCdNs,prsCdNs,ftrCdNs=dataNs('pstChartDesigner'),dataNs('prsChartDesigner'),dataNs('ftrChartDesigner')
end
end
end
   if prsRating then
local spanNs=merge({ pstCdNs,prsCdNs,ftrCdNs })
     category = category..'[[ 分类:PRS'..prsRating .. '级 目]]'
   end
local infoList={
   if ftrRating then
[1]={
     category = category..'[[分类:FTR'..ftrRating .. ' 级曲目]]'
args['曲 名'],data('title'),{ ['id']='title' }
     end
},
     if byd and bydRating then category = category..'[[ 分类:BYD'..bydRating .. ' 级曲目]]' end
[2]={
     if etr and etrRating then category = category..'[[分类:ETR'..etrRating .. ' 级曲目]]' end
'[[ 文件:'..args['图片']..'|256px]]','image',{ ['id']='top-image' }
 
},
     local bgCatDefault = args[' 背景'] or data('bg') or dataNs('bg')
[3]={
 
'[[文件:'..args[' 图片']..'|256px]]','image',{ ['id']='right-image' }
     category = category..'[[ 分类:采用'..bgCatDefault .. ' 背景的曲目]]'
},
    
[4]={
     if((args['Past背景'] or data('pstBg')) ~= bgCatDefault)
' 曲目信息','',{ ['class']='header' }
     then
},
       category = category..'[[分类:采用'..(args['Past背景'] or data('pstBg')) .. ' 背景的曲目]]'
[5]={
     end
' 曲师','',{ ['class']='label' }
 
},
     if((args['Present背景'] or data('prsBg')) ~= bgCatDefault)
[6]={
     then
args[' 编曲'],data('artist'),{ ['class']='data' }
       category = category..'[[分类:采用'..(args['Present背景'] or data('prsBg')) .. ' 背景的曲目]]'
},
     end
[7]={
 
' 曲包','',{ ['class']='label' }
     if((args['Future背景'] or data('ftrBg')) ~= bgCatDefault)
},
     then
[8]={
       category = category..'[[分类:采用'..(args['Future背景'] or data('ftrBg')) .. ' 背景的曲目]]'
args[' 曲包'],data('set'),{ ['class']='data' }
     end
},
 
[9]={
     if((args['Beyond背景'] or data('bydBg')) ~= bgCatDefault)
'时长','',{ ['class']='label' }
     then
},
       category = category..'[[ 分类:采用'..(args['Beyond背景'] or data('bydBg')) .. ' 背景的曲目]]'
[10]={
     end
args[' 时长'],' ',{ ['class']='data' }
 
},
     if((args['Eternal背景'] or data('etrBg')) ~= bgCatDefault)
[11]={
     then
'BPM','',{ ['class']='label' }
       category = category..'[[分类:采用'..(args['Eternal背景'] or data('etrBg')) .. ' 背景的曲目]]'
},
     end
[12]={
    
args['BPM'],data('bpm'),{ ['class']='data' }
     if ver then category = category..'[[分类:'..string.gsub(ver,'v', 'V') .. '添加的曲目]]' end
},
     if args[' 更新版本NS'] then category = category..'[[分类:NS '..string.gsub(args[' 更新版本NS'],'v', 'V') .. ' 添加的曲目]]' end
[13]={
   end
' 触控和手柄 谱面信息','',{ ['id']='all-play-header' , ['class']='header' }
 
},
   -- 表格生成
[14]={
   local boxList = {}
' 触控 谱面信息','',{ ['id']='mobile-play-header' , ['class']='header' }
 
},
   for _, v  in ipairs(infoList) do
[15]={
     box:tag('div'):attr(v[2]):cssText(v[3]):wikitext(v[1]):done()
'难度','',{ ['class']='label' }
   end
},
 
[16]={
   -- 提示信息
'[Past]','',{ ['class']='pst-label' }
   local noticeText = ''
},
 
[17]={
   if not(data('id') or dataNs('id'))
'[Present]','',{ ['class']='prs-label' }
     then
},
     noticeText = noticeText..'<li>在Songlist中无法检查到此曲目。请尝试更新[[ 模板:Songlist]] ,检查页面名或填写正确的<code>曲名</code>参数。</li>'
[18]={
   end
'[Future]','',{ ['class']='ftr-label' }
 
},
   if not(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set')))
[19]={
     then
'[Beyond]','',{ ['class']='byd-label' }
     noticeText = noticeText..'<li>未更新Packlist。曲目信息模板无法进行曲包分类。</li>'
},
   end
[20]={
 
' 等级','',{ ['class']='label' }
   local noticeTextNote = ''
},
 
[21]={
   if not(args['PastNote']) then noticeTextNote = noticeTextNote..'<code>PastNote</code>' end
args['Past等级'],data('pstRating'),{ ['class']='pst-data' }
   if not(args['PresentNote']) then noticeTextNote = noticeTextNote..'<code>PresentNote</code>' end
},
   if not(args['FutureNote']) then noticeTextNote = noticeTextNote..'<code>FutureNote</code>' end
[22]={
 
args['Present等级'],data('prsRating'),{ ['class']='prs-data' }
   if noticeTextNote ~= ''
},
     then
[23]={
     noticeText = noticeText..'<li>此模板缺少'..noticeTextNote..' 参数,此参数无法自动读取。</li>'
args['Future等级'],data('ftrRating'),{ ['class']='ftr-data' }
   end
},
 
[24]={
   if not(length)
args['Beyond等级'],data('bydRating'),{ ['class']='byd-data' }
     then
},
     noticeText = noticeText..'<li>此模板缺少<code>时长</code>参数,请在[[Template:Song Length.json]] 补充。</li>'
[25]={
   end
'note数量','',{ ['class']='label' }
 
},
   -- if not(args[' 更新版本']) and data('id')
[26]={
     -- then
args['PastNote'],' ',{ ['class']='pst-data' }
     -- noticeText = noticeText..'<li>此模板的移动版更新版本是未完整状态。请添加<code>更新版本</code>与<code>更新时间</code>参数。</li>'
},
   -- end
[27]={
 
args['PresentNote'],' ',{ ['class']='prs-data' }
   if not(args[' 更新版本NS']) and dataNs('id')
},
     then
[28]={
     noticeText = noticeText..'<li>此模板的NS版更新版本是未完整状态。请添加<code>更新版本NS</code>与<code>更新时间NS</code>参数。</li>'
args['FutureNote'],' ',{ ['class']='ftr-data' }
   end
},
 
[29]={
   -- noticeText = noticeText..'<li>调试信息:'..mw.dumpObject(nil)..'</li>'
args['BeyondNote'],' ',{ ['class']='byd-data' }
 
},
   local notice
[30]={
   if noticeText ~= ''
' 谱面设计','',{ ['class']='label' }
     then
},
     notice = frame:expandTemplate {title = 'Collapse', args = { [' 标题'] = ' 曲目信息模板提示信息', ['状态'] = '折叠',
[31]={
       [' 标题文字方向'] = 'center', [' 标题颜色'] = '#dddddd',
pstCd,data('pstChartDesigner'),{ ['class']='pst-data' },span[1]
       [' 内容颜色'] = '#eeeeee', [' 内容样式'] = 'width:800px',
},
     ['style'] = 'display:table;width:200px', ['class'] = 'nomobile',
[32]={
     ['内容'] = noticeText}}
prsCd,data('prsChartDesigner'),{ ['class']='prs-data' },span[2]
 
},
     category = category..'[[分类:缺少参数的曲目信息模板]]'
[33]={
   end
ftrCd,data('ftrChartDesigner'),{ ['class']='ftr-data' },span[3]
},
[34]={
bydCd,data('bydChartDesigner'),{ ['class']='byd-data' },span[4]
},
[35]={
'NS版手柄 谱面信息','',{ ['class']='header ns',['id']='ns-play-header' }
},
[36]={
'难度','',{ ['class']='label ns' }
},
[37]={
'[Past]','',{ ['class']='pst-label ns' }
},
[38]={
'[Present]','',{ ['class']='prs-label ns' }
},
[39]={
'[Future]','',{ ['class']='ftr-label ns' }
},
[40]={
'[Beyond]','',{ ['class']='byd-label ns' }
},
[41]={
'等级','',{ ['class']='label ns' }
},
[42]={
args['Past等级NS'],dataNs('pstRating'),{ ['class']='pst-data ns' }
},
[43]={
args['Present等级NS'],dataNs('prsRating'),{ ['class']='prs-data ns' }
},
[44]={
args['Future等级NS'],dataNs('ftrRating'),{ ['class']='ftr-data ns' }
},
[45]={
args['Beyond等级NS'],dataNs('bydRating'),{ ['class']='byd-data ns' }
},
[46]={
'note数量','',{ ['class']='label ns' }
},
[47]={
args['PastNoteNS'],args['PastNote'],{ ['class']='pst-data ns' }
},
[48]={
args['PresentNoteNS'],args['PresentNote'],{ ['class']='prs-data ns' }
},
[49]={
args['FutureNoteNS'],args['FutureNote'],{ ['class']='ftr-data ns' }
},
[50]={
'无','空',{ ['class']='byd-data ns' }
},
[51]={
'谱面设计','',{ ['class']='label ns' }
},
[52]={
pstCdNs,dataNs('pstChartDesigner'),{ ['class']='pst-data ns' },spanNs[1]
},
[53]={
prsCdNs,dataNs('prsChartDesigner'),{ ['class']='prs-data ns' },spanNs[2]
},
[54]={
frtCdNs,dataNs('ftrChartDesigner'),{ ['class']='ftr-data ns' },spanNs[3]
},
[55]={
'无','',{ ['class']='byd-data ns' },spanNs[4]
},
[56]={
'背景','',{ ['class']='label' }
},
[57]={
args['背景'],data('bg'),{ ['class']='data' }
},
[58]={
'更新时间','',{ ['id']='update-data-label',['class']='label' }
},
[59]={
dateArg(args['更新版本'] , args['更新时间'] , '移动版:' ) , dateData( data('version') , tonumber(data('date')) , '移动版:' ) ,{ ['id']='mobile-date-normal',['class']='data'}
},
[60]={
dateArg(args['Beyond更新版本'] , args['Beyond更新时间'] ,''  ) ,'空',{ ['id']='mobile-date-byd',['class']='data'}
},
[61]={
dateArg(args['更新版本NS'] , args['更新时间NS'] , 'NS版:' ),dateArg('1.0.0c' ,'2021/5/18' , 'NS版:' ),{ ['id']='ns-date-normal',['class']='data ns'}
},
[62]={
'无','',{ ['id']='ns-date-byd',['class']='data ns'}
}
}


local box = mw.html.create( 'div' )
   if args['nocat'] then category = '' end
box:addClass( "songbox" )
if byd then box:addClass( "byd" ) end
if data('side')==1 then box:addClass( "conflict" ) else box:addClass( "light" ) end
if args[' 更新版本NS'] or dataNs('version') then 
box:addClass( "ns-box" )
if
args['Past等级NS'] or args['Present等级NS'] or args['Future等级NS'] or args['PastNote编写NS'] or args['PresentNote编写NS'] or args['FutureNote编写NS'] or
args['PastNoteNS'] or args['PresentNoteNS'] or args['FutureNoteNS'] or
data('pstRating')~=dataNs('pstRating') or data('prsRating')~=dataNs('prsRating') or data('ftrRating')~=dataNs('ftrRating') or
data('pstChartDesigner')~=dataNs('pstChartDesigner') or data('prsChartDesigner')~=dataNs('prsChartDesigner') or data('ftrChartDesigner')~=dataNs('ftrChartDesigner')


then else box:addClass( "ns-same" ) end
   return tostring(box)..choice(notice, notice, '', true)..category
end
if args['Beyond更新版本'] and args['Beyond更新时间'] then box:addClass( 'mobile-byd-date' ) end
local boxList={}
for i,o in ipairs(infoList) do
boxList[i] = mw.html.create( 'div' )
boxList[i]
:attr( infoList[i][3] )
:cssText( infoList[i][4] )
if infoList[i][1]
then
boxList[i]:wikitext( infoList[i][1] )
else
boxList[i]:wikitext( infoList[i][2] )
end
box:wikitext(tostring(boxList[i]))
end
return box
end
end


return p
return p

2024年11月23日 (六) 22:37的最新版本

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

local getArgs = require('Module:Arguments').getArgs
local link = require('Module:Link')._link
local getData = require("Module:Arcaea Data")
local CL = require('Module:ConvertLink')

local aLink= CL.artistLink
local pLink= CL.packLink
local dLink= CL.designerLink
local fullVer= CL.fullVersionNum

local songLength = mw.loadJsonData 'Template:Song Length.json'

local p = {}

function timeCov(t)
    return os.date("%Y/%m/%d", t)
end

function dateCov(v, d, t, type)
    if not(v and d) then return nil end
    local box, a, b, c = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
    box:addClass("date-box")
    a:wikitext(t)
    if type == "arg"
        then
        b:wikitext(v..'<br />' .. '('..tostring(d) .. ')')
    else
    	local vv, dd = fullVer(v,d)
        b:wikitext('v'..vv..'<br />' .. '('..dd .. ')')
    end
    box:wikitext(tostring(a))
    :wikitext(tostring(b))
    :wikitext(tostring(c))
    return tostring(box)
end

function bgCov(bg)
    if bg == nil
        then
        return nil
    else
        return '[[:分类:采用'..bg..'背景的曲目|'..bg..']]'
    end
end

function choice(a, aKey, b, bKey)
    if aKey then return a end
    if bKey then return b end
    return nil
end

function diffMark(diffText, byd, name, inNs, nsByd)
    local diff, mark = mw.html.create('div'), mw.html.create('div')
    diff:wikitext(diffText)
    mark:wikitext('仅移动版')
    if byd and inNs and not(nsByd)
        then
        return tostring(tostring(diff)..tostring(mark))
    else
        return tostring(diff)
    end
end

function labelText(text, class)
    local span = mw.html.create('span')
    span:addClass('label-text')
    span:wikitext(text)
    return tostring(span)
end

function getImage(id, all, pst, prs, ftr, byd, second, normalJacketArgs, bydJacketArgs, normalJacketData, bydJacketData, bydyes, mold, imageConfig, tab1text, tab2text)
	-- 谢邀,这写的什么东西我自己都看不懂了 ———Star0
	if not(id or all) then
		return nil

	else
		local container, tab = mw.html.create('div'), mw.html.create('div')
		local tab1, tab2, tab3, part1, part2, part3, jacket1, jacket2
		container:addClass('container')
		tab:attr('id', 'tab-'..mold) tab:addClass('img-tab')
		local normalJacket, bydJacket
		if normalJacketArgs then
			if bydJacketArgs then
				normalJacket, bydJacket = normalJacketArgs, bydJacketArgs
			else
				normalJacket, bydJacket = normalJacketArgs, normalJacketArgs
			end
		else
			if normalJacketData == "" or normalJacketData == nil then
				normalJacket, bydJacket = '未显示', '未显示'
			else
				normalJacket, bydJacket = link({'画师', tostring(normalJacketData)}), link({'画师', tostring(bydJacketData)})
			end
		end

		if bydyes and imageConfig~='nobyd' then
			tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
			tab1:wikitext('Normal') tab2:wikitext('Beyond')
			tab1:addClass('active img-tab-part normal') tab2:addClass('img-tab-part byd')
			tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
			container:wikitext(tostring(tab))

			if all and byd then
				part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]'..labelText('画师')..tostring(bydJacket))
			elseif id then
				part1:wikitext('[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs '..id..' byd.jpg|256px|none]]'..labelText('画师')..tostring(bydJacket))
			end

			part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
			container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
			return tostring(container)

		else
			if pst and prs and ftr then
				tab1, tab2, tab3, part1, part2, part3 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')

				tab1:wikitext('Past') tab2:wikitext('Present') tab3:wikitext('Future')
				tab1:addClass('img-tab-part pst') tab2:addClass('img-tab-part prs') tab3:addClass('active img-tab-part ftr')
				tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2)) tab:wikitext(tostring(tab3))
				container:wikitext(tostring(tab))

				part1:wikitext('[[文件:'..pst..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..prs..'|256px|none]]'..labelText('画师')..normalJacket) part3:wikitext('[[文件:'..ftr..'|256px|none]]'..labelText('画师')..normalJacket)
				part1:addClass('tab-text-'..mold) part2:addClass('tab-text-'..mold) part3:addClass('active tab-text-'..mold)
				container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))
				return tostring(container)

			elseif second then
				tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
				tab1:wikitext(tab1text or '第一曲绘') tab2:wikitext(tab2text or '第二曲绘')
				tab1:addClass('active img-tab-part normal') tab2:addClass('img-tab-part normal')
				tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
				container:wikitext(tostring(tab))

				if all then
					part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..normalJacket)
				else
					part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..normalJacket)
				end

				part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
				container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
				return tostring(container)

			else
				if all then
					return '<div>[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket..'</div>'
				else
					return '<div>[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket..'</div>'
				end
			end
		end
	end
end

		-- Last判断(未启用)(需要修改)
		-- if id == 'last' then
			-- tab1, tab2, tab3, part1, part2, part3 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
			-- tab1:wikitext('Normal') tab2:wikitext('Moment') tab3:wikitext('Eternity')
			-- tab1:addClass('active img-tab-part ftr') tab2:addClass('img-tab-part byd') tab3:addClass('img-tab-part byd')
			-- tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2)) tab:wikitext(tostring(tab3))
			-- container:wikitext(tostring(tab))
			-- part1:wikitext('[[文件:Songs last.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs last byd.jpg|256px|none]]'..labelText('画师')..normalJacket) part3:wikitext('[[文件:Songs last byd2.jpg|256px|none]]'..labelText('画师')..normalJacket)
			-- part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold) part3:addClass('tab-text-'..mold)
			-- container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))
			-- return tostring(container)
		-- end

function merge(list)
    local span = {}

    local lastUniqueIndex = nil
    local currentIndex = 1

    while currentIndex<=#list do
        if lastUniqueIndex and list[lastUniqueIndex] == list[currentIndex] then
            span[lastUniqueIndex] = span[lastUniqueIndex] + 1
            span[currentIndex] = 0
        else
            lastUniqueIndex = currentIndex
            span[currentIndex] = 1
        end
        currentIndex = currentIndex + 1
    end

    local merge = {}

    for i = 1, #list do
        if span[i] == 0 then
            merge[i] = 'display:none'
        else
            merge[i] = 'grid-column-start: span '..span[i] .. ';'
        end
    end

    return merge
end

function title(name,nameSecond,online)
    local result=name
    if nameSecond then result = result .. "<br />" .. nameSecond end
    if not(online) then result = result .. "<br />" .. '此曲目暂未上线' end
    return result
end

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

function getCategoryText(category)
    if category=="poprec" then return "流行/推荐" end
    if category=="partner" then return "搭档" end
    if category=="original" then return "原创" end
    if category=="variety" then return "综合" end
    if category=="musicgames" then return "音乐游戏" end
    return nil
end

function p._main(args)
    frame=mw.getCurrentFrame()

    -- 获取数据查找函数
    local data, dataNs
    if args["id"] and args["id"] ~= ""
    then
        data, dataNs = getData.singleSongInformation(args['id'], "id", "mobile"), getData.singleSongInformation(args['id'], "id", "ns")
    elseif args["曲名"]
    then
        data, dataNs = getData.singleSongInformation(args['曲名'], "name", "mobile"), getData.singleSongInformation(args['曲名'], "name", "ns")
    end

    -- 判断曲目在哪个平台存在。
    local inMobile,inNs = false, false
    if data("id") or args["更新时间"] then
        inMobile = true
    end

    if dataNs("id") or args["更新时间NS"] then
        inNs = true
    end
    
    -- 判断byd谱面是否存在。
    local byd, nsByd
    if args['Beyond等级'] or data('bydRating') then byd = true else byd = false end
    if args['Beyond等级NS'] or dataNs('bydRating') then nsByd = true else nsByd = false end
    -- 判断etr谱面是否存在;先假定NS不会有eternal等级。
    local etr
    if args['Eternal等级'] or data('etrRating') then etr = true else etr = false end
    -- 处理谱师参数,未填写的等级谱师向前级复制(向下兼容)
    local getChartDesigner = {
        {'PastNote编写', 'note编写', 'pstChartDesigner'},
        {'PresentNote编写', 'note编写', 'prsChartDesigner'},
        {'FutureNote编写', 'note编写', 'ftrChartDesigner'},
        {'BeyondNote编写', 'note编写', 'bydChartDesigner'}
    }
    -- 假定 etr 与 byd 不会同时出现
    if etr then
        getChartDesigner[4]={'EternalNote编写', 'note编写', 'etrChartDesigner'}
    end

    local chartDesigner = {}
    for i, k in ipairs(getChartDesigner)
        do
            if args[k[1]] then
                chartDesigner[i] = args[k[1]]
            elseif args[k[2]] then
                chartDesigner[i] = args[k[2]]
            else
                chartDesigner[i] = choice(dLink(tostring(data(k[3])), data('id')), data(k[3]), '', true)
            end
    end

    -- 依据byd是否存在处理单元格合并参数。
    local span
    if byd or etr then
        span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3], chartDesigner[4]})
    else
        span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3]})
    end

    local pstBg = args['Past背景'] or args['背景'] or data('pstBg')
    local prsBg = args['Present背景'] or args['背景'] or data('prsBg')
    local ftrBg = args['Future背景'] or args['背景'] or data('ftrBg')
    local appendBg
    -- 依据byd是否存在处理背景合并参数
    -- 写的硬了点,没和上面一样展开
    if byd then
        appendBg = args['Beyond背景'] or args['背景'] or data('bydBg')
    elseif etr then
    	appendBg = args['Eternal背景'] or args['背景'] or data('etrBg')
    end
    local bgSpan = merge({pstBg, prsBg, ftrBg, appendBg})


    -- if args['曲名'] == 'Tempestissimo' then spanNs = {'grid-column-start: span 1', 'grid-column-start: span 1', 'grid-column-start: span 1', 'grid-column-start: span 1'} end

    local imageA = getImage(data('id'), args['图片'], args['Past曲绘'], args['Present曲绘'], args['Future曲绘'], args['Beyond曲绘'], 
    	args['第二曲绘图片'], args['画师'], args['Beyond画师'], data('ftrJacketDesigner'), data('bydJacketDesigner'), byd, 'a', args['图片显示控制'], args['第一曲绘说明'], args['第二曲绘说明'])
    local imageB = getImage(data('id'), args['图片'], args['Past曲绘'], args['Present曲绘'], args['Future曲绘'], args['Beyond曲绘'], 
    	args['第二曲绘图片'], args['画师'], args['Beyond画师'], data('ftrJacketDesigner'), data('bydJacketDesigner'), byd, 'b', args['图片显示控制'], args['第一曲绘说明'], args['第二曲绘说明'])

    local pstRating = args['Past等级'] or data('pstRating')
    local prsRating = args['Present等级'] or data('prsRating')
    local ftrRating = args['Future等级'] or data('ftrRating')
    local bydRating = args['Beyond等级'] or data('bydRating')
    local etrRating = args['Eternal等级'] or data('etrRating')

    local additionalDiffMark
    local additionalDiffMarkClass='byd-label'
    if byd then
        additionalDiffMark = diffMark('[Beyond]', byd, args['曲名'], inNs, nsByd)
        additionalDiffMarkClass='byd-label'
    elseif etr then
        additionalDiffMark = diffMark('[Eternal]', etr, args['曲名'], inNs, false)
        additionalDiffMarkClass='etr-label'
    end

    local setText=args['曲包MO'] or choice(pLink(tostring(getData.packName(data('set')))),data('set'),nil)
    local nsSetText=args['曲包NS'] or choice(pLink(tostring(getData.packName(dataNs('set'))),nil,1),dataNs('set'),nil)
    local categoryText=args['类别'] or getCategoryText(data('category'))

    local setDisplayText=tostring(setText)
    if setText then
        if categoryText then
            setDisplayText=setDisplayText.." - "..categoryText
        end
        if nsSetText and setText~=nsSetText then
            setDisplayText=setDisplayText..frame:expandTemplate{ title = "仅", args = {"移动版","","图片角标"} }.."<br />"..tostring(nsSetText)..frame:expandTemplate{ title = "仅", args = {"NS版","","图片角标"} }
        end
    else
        setDisplayText=nsSetText
    end
	
	local _v, _d = fullVer(data('version'), tonumber(data('date')))
	local ver = args['更新版本'] or 'v'.._v
	local verDate = args['更新时间'] or _d
	
    local length = args['时长'] or songLength.normal[data("id") or dataNs("id")]

    -- 生成Grid表格的信息表;在后文中依据格式进行生成。
    local infoList = {
        { title(args['曲名'] or data('title') or dataNs('title'), args['第二曲名'], data('id') or dataNs('id') or #args > 1), { id = 'title'}},

        { imageA or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'top-image'}},
        { imageB or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'right-image'}},

        { '曲目信息', {class = 'header'} },

        { '曲师', { class = 'label'}},
        { args['曲师'] or args['编曲'] or choice(aLink(tostring(data('artist'))) or aLink(tostring(dataNs('artist'))), data('artist') or dataNs('artist'), '', true), { class = 'data'}},

        { '曲包', { class = 'label'}},
        { args['曲包'] or setDisplayText, { class = 'data'}},

        { '时长', { class = 'label'}},
        { length or '-:--', { class = 'data'}},

        { 'BPM', { class = 'label'}},
        { args['BPM'] or data('bpm') or dataNs('bpm'), { class = 'data'}},

        { '谱面信息', { class = 'header'}},

        { '难度', { class = 'label'}},
        { '[Past]', { class = 'pst-label'}},
        { '[Present]', { class = 'prs-label'}},
        { '[Future]', { class = 'ftr-label'}},
        { additionalDiffMark, { class = additionalDiffMarkClass}},

        { '等级', { class = 'label'}},
        { pstRating, { class = 'pst-data'}},
        { prsRating, { class = 'prs-data'}},
        { ftrRating, { class = 'ftr-data'}},
        { bydRating or etrRating, { class = 'byd-data'}},

        { 'note数量', { class = 'label'}},
        { args['PastNote'] or '空', { class = 'pst-data'}},
        { args['PresentNote'] or '空', { class = 'prs-data'}},
        { args['FutureNote'] or '空', {class = 'ftr-data'}},
        { args['BeyondNote'] or args['EternalNote'] or '空', { class = 'byd-data'}},

        { '谱面设计', { class = 'label'}},
        { chartDesigner[1] or '空', { class = 'pst-data'}, span[1]},
        { chartDesigner[2] or '空', { class = 'prs-data'}, span[2]},
        { chartDesigner[3] or '空', { class = 'ftr-data'}, span[3]},
        { chartDesigner[4] or '空', { class = 'byd-data'}, span[4]},

        { '谱面信息(Joy-Con)', { class = 'header ns', id = 'ns-play-header'}},
        { '难度', { class = 'label ns'}},
        { '[Past]', { class = 'pst-label ns'}},
        { '[Present]', { class = 'prs-label ns'}},
        { '[Future]', { class = 'ftr-label ns'}},
        { additionalDiffMark, { class = additionalDiffMarkClass..' ns'}},

        { 'note数量', { class = 'label ns'}},
        { args['PastNoteNS'] or args['PastNote'], { class = 'pst-data ns'}},
        { args['PresentNoteNS'] or args['PresentNote'], { class = 'prs-data ns'}},
        { args['FutureNoteNS'] or args['FutureNote'], { class = 'ftr-data ns'}},
        { args['BeyondNoteNS'] or '空', { class = 'byd-data ns'}},

        { '背景', { class = 'label'}},
        { bgCov(pstBg), { class = 'pst-data'}, bgSpan[1]},
        { bgCov(prsBg), { class = 'prs-data'}, bgSpan[2]},
        { bgCov(ftrBg), { class = 'ftr-data'}, bgSpan[3]},
        { bgCov(appendBg), { class = 'byd-data'}, bgSpan[4]},
        -- { bgCov(args['背景']) or bgCov(data('bg')) or bgCov(dataNs('bg')), { class = 'data' , id = 'bg-normal' }},
        -- { bgCov(args['Future背景']) , { class = 'data' , id = 'bg-ftr' }},

        { '更新时间', { id = 'update-data-label', class = 'label'}},
        { dateCov(ver, verDate, labelText('移动版'), 'arg'), { id = 'mobile-date-normal', class = 'data'}},
        { dateCov(args['Beyond更新版本'], args['Beyond更新时间'], labelText('移动版'), 'arg') 
        	or dateCov(args['Eternal更新版本'], args['Eternal更新时间'], labelText('移动版'), 'arg') 
        	or (data('bydVersion') and dateCov(data('bydVersion'), tonumber(data('bydDate')), labelText('移动版'), 'data')) 
        	or (data('etrVersion') and dateCov(data('etrVersion'), tonumber(data('etrDate')), labelText('移动版'), 'data')) 
        	or '空', { id = 'mobile-date-byd', class = 'data'}},
        { dateCov(args['更新版本NS'], args['更新时间NS'], labelText('NS版'), 'arg') or dateCov(dataNs('version'), tonumber(dataNs('date')), labelText('NS版'), 'data'), { id = 'ns-date-normal', class = 'data ns'}},
        { '空', { id = 'ns-date-byd', class = 'data ns'}}
    }

    local box = mw.html.create('div')

    -- 样式控制
    box:addClass("arcaeabox")
    -- 假定 etr 与 byd 不会同时出现,etr 暂时复用 byd 的逻辑
    if byd or etr then box:addClass("byd") end
	if args['侧'] == '0' or data('side') == 0 or dataNs('side') == 0 then
		box:addClass("light")
	elseif data('side') == 1 or dataNs('side') == 1 or args['侧'] == '1' then
		box:addClass("conflict")
	elseif data('side') == 2 or dataNs('side') == 2 or args['侧'] == '2' then
		box:addClass("colorless")
	else
		box:addClass("lephon")
	end

    if args['更新版本NS'] or dataNs('id')
        then
        box:addClass("ns-box")
        if not(dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') or dataNs('bydChange')) -- byd单独分栏禁用(但Infinite Strife,需要)
            then
            box:addClass("ns-same")
        end
    end
    -- 假定 etr 与 byd 不会同时出现,etr 暂时复用 byd 的逻辑
    if (args['Beyond更新版本'] and args['Beyond更新时间']) or (args['Eternal更新版本'] and args['Eternal更新时间']) 
    	or data('bydVersion') or data('etrVersion') then box:addClass('mobile-byd-date') end
    if nsByd then box:addClass('ns-byd-date') box:addClass('ns-date-span') end
    if not(args['更新版本'] or args['更新时间'] or data('id')) then box:addClass('no-mobile') end
    -- 弃用这种class控制: if args['Future背景'] then box:addClass('bg-ftr') end

    -- 分类添加
    local category = ''

    if args['更新版本NS'] or dataNs('id')
        then
        if args['更新版本'] or args['更新时间'] or data('id')
            then
            category = category..'[[分类:双平台曲目]]'
        else
            category = category..'[[分类:NS版曲目]]'
        end
    else
        category = category..'[[分类:移动版曲目]]'
    end

    if dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') or dataNs('bydChange') then category = category..'[[分类:多模式谱面有差异的曲目]]' end

    if not(data('id') or dataNs('id') or #args > 1) then category = category..'[[分类:未登陆的曲目]]' end

    if (data('id') or dataNs('id')) and not(args['unset'])
        then
        
        -- 如果没有更新packlist,不自动进行分类。
        if choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set'))
            then
            category = category..'[[分类:'..tostring(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set'))) .. '曲包曲目]]'
        end

		if args['侧'] == '0' or data('side') == 0 or dataNs('side') == 0
			then
			category = category..'[[分类:光芒侧曲目]]'
		elseif args['侧'] == '1' or data('side') == 1 or dataNs('side') == 1
			then
			category = category..'[[分类:纷争侧曲目]]'
		elseif args['侧'] == '2' or data('side') == 2 or dataNs('side') == 2
			then
			category = category..'[[分类:消色侧曲目]]'
		elseif args['侧'] == '3' or data('side') == 3 or dataNs('side') == 3
			then
			category = category..'[[分类:Lephon侧曲目]]'	
		else
			category = category..'[[分类:未知侧曲目]]'
		end

		if pstRating then
        	category = category..'[[分类:PST'..pstRating .. '级曲目]]'
		end
    	if prsRating then
        	category = category..'[[分类:PRS'..prsRating .. '级曲目]]'
    	end
    	if ftrRating then
        	category = category..'[[分类:FTR'..ftrRating .. '级曲目]]'
        end
        if byd and bydRating then category = category..'[[分类:BYD'..bydRating .. '级曲目]]' end
        if etr and etrRating then category = category..'[[分类:ETR'..etrRating .. '级曲目]]' end

        local bgCatDefault = args['背景'] or data('bg') or dataNs('bg')

        category = category..'[[分类:采用'..bgCatDefault .. '背景的曲目]]'
        
        if((args['Past背景'] or data('pstBg')) ~= bgCatDefault)
        then
            category = category..'[[分类:采用'..(args['Past背景'] or data('pstBg')) .. '背景的曲目]]'
        end

        if((args['Present背景'] or data('prsBg')) ~= bgCatDefault)
        then
            category = category..'[[分类:采用'..(args['Present背景'] or data('prsBg')) .. '背景的曲目]]'
        end

        if((args['Future背景'] or data('ftrBg')) ~= bgCatDefault)
        then
            category = category..'[[分类:采用'..(args['Future背景'] or data('ftrBg')) .. '背景的曲目]]'
        end

        if((args['Beyond背景'] or data('bydBg')) ~= bgCatDefault)
        then
            category = category..'[[分类:采用'..(args['Beyond背景'] or data('bydBg')) .. '背景的曲目]]'
        end

        if((args['Eternal背景'] or data('etrBg')) ~= bgCatDefault)
        then
            category = category..'[[分类:采用'..(args['Eternal背景'] or data('etrBg')) .. '背景的曲目]]'
        end
        
        if ver then category = category..'[[分类:'..string.gsub(ver,'v', 'V') .. '添加的曲目]]' end
        if args['更新版本NS'] then category = category..'[[分类:NS '..string.gsub(args['更新版本NS'],'v', 'V') .. '添加的曲目]]' end
    end

    -- 表格生成
    local boxList = {}

    for _, v  in ipairs(infoList) do
        box:tag('div'):attr(v[2]):cssText(v[3]):wikitext(v[1]):done()
    end

    -- 提示信息
    local noticeText = ''

    if not(data('id') or dataNs('id'))
        then
        noticeText = noticeText..'<li>在Songlist中无法检查到此曲目。请尝试更新[[模板:Songlist]],检查页面名或填写正确的<code>曲名</code>参数。</li>'
    end

    if not(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set')))
        then
        noticeText = noticeText..'<li>未更新Packlist。曲目信息模板无法进行曲包分类。</li>'
    end

    local noticeTextNote = ''

    if not(args['PastNote']) then noticeTextNote = noticeTextNote..'<code>PastNote</code>' end
    if not(args['PresentNote']) then noticeTextNote = noticeTextNote..'<code>PresentNote</code>' end
    if not(args['FutureNote']) then noticeTextNote = noticeTextNote..'<code>FutureNote</code>' end

    if noticeTextNote ~= ''
        then
        noticeText = noticeText..'<li>此模板缺少'..noticeTextNote..'参数,此参数无法自动读取。</li>'
    end

    if not(length)
        then
        noticeText = noticeText..'<li>此模板缺少<code>时长</code>参数,请在[[Template:Song Length.json]]补充。</li>'
    end

    -- if not(args['更新版本']) and data('id')
        -- then
        -- noticeText = noticeText..'<li>此模板的移动版更新版本是未完整状态。请添加<code>更新版本</code>与<code>更新时间</code>参数。</li>'
    -- end

    if not(args['更新版本NS']) and dataNs('id')
        then
        noticeText = noticeText..'<li>此模板的NS版更新版本是未完整状态。请添加<code>更新版本NS</code>与<code>更新时间NS</code>参数。</li>'
    end

    -- noticeText = noticeText..'<li>调试信息:'..mw.dumpObject(nil)..'</li>'

    local notice
    if noticeText ~= ''
        then
        notice = frame:expandTemplate {title = 'Collapse', args = { ['标题'] = '曲目信息模板提示信息', ['状态'] = '折叠',
            ['标题文字方向'] = 'center', ['标题颜色'] = '#dddddd',
            ['内容颜色'] = '#eeeeee', ['内容样式'] = 'width:800px',
        ['style'] = 'display:table;width:200px', ['class'] = 'nomobile',
        ['内容'] = noticeText}}

        category = category..'[[分类:缺少参数的曲目信息模板]]'
    end

    if args['nocat'] then category = '' end

    return tostring(box)..choice(notice, notice, '', true)..category
end

return p