Module:Songtable:修订间差异

来自Arcaea中文维基
无编辑摘要
(修复Tempestissimo byd标记bug;修复ID设置为空报错的bug)
(未显示4个用户的31个中间版本)
第1行: 第1行:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local link = require('Module:Link')._link
local link = require('Module:Link')._link
local getData = require("Module:data")
local getData = require("Module:Arcaea Data")
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
end


function dateArg(v,d,t)
function dateCov(v, d, t, type)
if not(v and d) then return nil end
   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' )
   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" )
   box:addClass("date-box")
a:wikitext(t)
   a:wikitext(t)
b:wikitext(v..'<br>'..'('..tostring(d)..')')
   if type == "arg"
box:wikitext(tostring(a))
     then
  :wikitext(tostring(b))
     b:wikitext(v..'<br>' .. '('..tostring(d) .. ')')
  :wikitext(tostring(c))
   else
return tostring(box)
     b:wikitext('v'..v..'<br>'..tostring(timeCov(d)))
   end
   box:wikitext(tostring(a))
   :wikitext(tostring(b))
   :wikitext(tostring(c))
   return tostring(box)
end
end
 
function dateData(v,d,t)
function bgCov(bg)
if not(v and d) then return nil end
   if bg == nil
local box,a,b,c = mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' ),mw.html.create( 'div' )
     then
box:addClass( "date-box" )
     return nil
a:wikitext(t)
   else
b:wikitext('v'..v..'<br>'..tostring(timeCov(d)))
     return '[[:分类:采用'..bg..' 背景的曲目|'..bg..']]'
box:wikitext(tostring(a))
   end
  :wikitext(tostring(b))
end
  :wikitext(tostring(c))
 
return tostring(box)
function choice(a, aKey, b, bKey)
   if aKey then return a end
   if bKey then return b end
   return nil
end
 
function bydMark(byd, name, inNs)
   local diff, mark = mw.html.create('div'), mw.html.create('div')
   diff:wikitext('[Beyond]')
   mark:wikitext(' 仅移动版')
   if byd and inNs and name ~= "Tempestissimo"
     then
     return tostring(tostring(diff)..tostring(mark))
   else
     return tostring(diff)
   end
end
end


function bgCov(bg)
function labelText(text, class)
if bg==nil
   local span = mw.html.create('span')
then
   span:addClass('label-text')
return nil
   span:wikitext(text)
else
   return tostring(span)
return '[[:分类:采用'..bg..' 背景的曲目|'..bg..']]'
end
end
end


function getImage(id,all,pst,prs,ftr,byd,second,normalJacketArgs,bydJacketArgs,normalJacketData,bydJacketData,bydyes,type)
function getImage(id, all, pst, prs, ftr, byd, second, normalJacketArgs, bydJacketArgs, normalJacketData, bydJacketData, bydyes, mold, imageConfig)
local container,tab=mw.html.create('div'),mw.html.create('div')
   --谢邀,这写的什么东西我自己都看不懂了 ———Star0
local tab1,tab2,tab3,part1,part2,part3,jacket1,jacket2
   if not(id or all) then return nil end
container:addClass( 'container' )
 
tab:attr( 'id','tab-'..type ) tab:addClass( 'img-tab' )
   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
local normalJacket,bydJacket
--Last判断
if normalJacketArgs
then
if id == 'last'
if bydJacketArgs
then
then
normalJacket,bydJacket=normalJacketArgs,bydJacketArgs
     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')
else
 
normalJacket,bydJacket=normalJacketArgs,normalJacketArgs
     tab1:wikitext('Normal') tab2:wikitext('Moment') tab3:wikitext('Eternity')
end
     tab1:addClass('img-tab-part ftr') tab2:addClass('img-tab-part byd') tab3:addClass('img-tab-part byd')
else
     tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2)) tab:wikitext(tostring(tab3))
if normalJacketData=="" or normalJacketData==nil
     container:wikitext(tostring(tab))
then
normalJacket,bydJacket=' 未知',' 未知'
else
normalJacket,bydJacket=link({' 画师',tostring(normalJacketData)}),link({' 画师',tostring(bydJacketData)})
end
end


if pst and prs and ftr
     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)
then
     part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold) part3:addClass('tab-text-'..mold)
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')
     container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))


tab1:wikitext('Past') tab2:wikitext('Present') tab3:wikitext('Future')
     return tostring(container)
tab1:addClass('img-tab-part pst') tab2:addClass('img-tab-part prs') tab3:addClass('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]]画师:'..normalJacket) part2:wikitext('[[文件:'..prs..'|256px|none]]画师:'..normalJacket)  part3:wikitext('[[文件:'..ftr..'|256px|none]]画师:'..normalJacket)
part1:addClass('tab-text-'..type) part2:addClass('tab-text-'..type)  part3:addClass('active tab-text-'..type)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2)) container:wikitext(tostring(part3))
return tostring(container)
end
end
if byd
   if pst and prs and ftr
then
     then
tab1,tab2,part1,part2=mw.html.create('div'),mw.html.create('div'),mw.html.create('div'),mw.html.create('div')
     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('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)
   end
 
   if byd 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('img-tab-part normal') tab2:addClass('img-tab-part byd')
     tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
     container:wikitext(tostring(tab))
 
     part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]'..labelText('画师')..tostring(bydJacket))
     part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
     container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
 
     return tostring(container)
   end
 
   if second
     then
     tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')
 
     tab1:wikitext('第一曲绘') tab2:wikitext('第二曲绘')
     tab1:addClass('img-tab-part normal') tab2:addClass('img-tab-part normal')
     tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
     container:wikitext(tostring(tab))
 
     part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..normalJacket)
     part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
     container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
 
     return tostring(container)
   end
 
   if id and 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('img-tab-part normal') tab2:addClass('img-tab-part byd')
     tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
     container:wikitext(tostring(tab))
 
     part1:wikitext('[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs '..id..' byd.jpg|256px|none]]'..labelText('画师')..tostring(bydJacket))
     part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
     container:wikitext(tostring(part1)) container:wikitext(tostring(part2))


tab1:wikitext('Normal') tab2:wikitext('Beyond')
     return tostring(container)
tab1:addClass('img-tab-part normal') tab2:addClass('img-tab-part byd')
   end
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
container:wikitext(tostring(tab))
part1:wikitext('[[文件:'..all..'|256px|none]]画师:'..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]画师:'..tostring(bydJacket))
part1:addClass('active tab-text-'..type) part2:addClass('tab-text-'..type)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
return tostring(container)
end
if second
then
tab1,tab2,part1,part2=mw.html.create('div'),mw.html.create('div'),mw.html.create('div'),mw.html.create('div')


tab1:wikitext('第一曲绘') tab2:wikitext('第二曲绘')
   if id
tab1:addClass('img-tab-part normal') tab2:addClass('img-tab-part normal')
     then
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
     return '<div>[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket..'</div>'
container:wikitext(tostring(tab))
   end
part1:wikitext('[[文件:'..all..'|256px|none]] 画师:'..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]] 画师 '..normalJacket)
part1:addClass('active tab-text-'..type) part2:addClass('tab-text-'..type)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
return tostring(container)
end
if id and bydyes
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')
   return '<div>[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket..'</div>'
tab1:addClass('img-tab-part normal') tab2:addClass('img-tab-part byd')
tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
container:wikitext(tostring(tab))
part1:wikitext('[[文件:Songs '..id..'.jpg|256px|none]]画师:'..normalJacket) part2:wikitext('[[文件:Songs '..id..' byd.jpg|256px|none]]画师:'..tostring(bydJacket))
part1:addClass('active tab-text-'..type) part2:addClass('tab-text-'..type)
container:wikitext(tostring(part1)) container:wikitext(tostring(part2))
return tostring(container)
end
if id
then
return '<div>[[文件:Songs '..id..'.jpg|256px|none]] 画师:'..normalJacket..'</div>'
end
return '<div>[[文件:'..all..'|256px|none]] 画师 '..normalJacket..'</div>'
end
end


function merge(list)
function merge(list)
local merge
   local merge
if list[4] then merge={1,1,1,1} else merge={1,1,1} end
   if list[4] then merge = {1, 1, 1, 1} else merge = {1, 1, 1} end
local o
   local o
if list[4] then o=4 else o=3 end
   if list[4] then o = 4 else o = 3 end
 
   if list[4] then
     if list[4] == list[3] then merge[3] = merge[3] + merge[4] merge[4] = 0 end
   end


if list[4] then
   if list[3] == list[2] then merge[2] = merge[2] + merge[3] merge[3] = 0 end
if list[4]==list[3] then merge[3]=merge[3]+merge[4] merge[4]=0 end
end


if list[3]==list[2] then merge[2]=merge[2]+merge[3] merge[3]=0 end
   if list[2] == list[1] then merge[1] = merge[1] + merge[2] merge[2] = 0 end


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


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


function re0()
function title(name,nameSecond,online)
return nil
   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
end


function p._main(args)
function p._main(args)
local category=''
local data,dataNs
local argsLength = 0
for _,_ in pairs(args) do  argsLength=argsLength+1 end
if argsLength>=16
then
data,dataNs=re0,getData.getNS(args['曲名'])
else
data,dataNs=getData.getMobile(args['曲名']),getData.getNS(args['曲名'])
end
local byd
if args['Beyond等级'] or data('bydRating') then byd=true else byd=false end
local getChartDesigner={
[1]={ 'mobile' , 'PastNote编写' , 'note编写' , 'pstChartDesigner' },
[2]={ 'mobile' , 'PresentNote编写' , 'note编写' , 'prsChartDesigner' },
[3]={ 'mobile' , 'FutureNote编写' , 'note编写' , 'ftrChartDesigner' },
[4]={ 'mobile' , 'BeyondNote编写' , 'note编写' , 'bydChartDesigner' },
[5]={ 'ns' , 'PastNote编写NS' , 'note编写NS' , 'pstChartDesigner' },
[6]={ 'ns' , 'PresentNote编写NS' , 'note编写NS' , 'prsChartDesigner' },
[7]={ 'ns' , 'FutureNote编写NS' , 'note编写NS' , 'ftrChartDesigner' }
}
local chartDesigner={}
for i,k in ipairs(getChartDesigner)
do
if args[k[2]]
then
chartDesigner[i]=args[k[2]]
else
if args[k[3]]
then
chartDesigner[i]=args[k[3]]
else
if chartDesigner[i-1] and argsLength>=16 and i~=5 and i~=6 and i~=7
then
chartDesigner[i]=chartDesigner[i-1]
else
if k[1]=='mobile'
then
chartDesigner[i]=link({ '谱师',tostring(data(k[4])) })
else
chartDesigner[i]=link({ '谱师',tostring(dataNs(k[4])) })
end
end
end
end
end
local span,spanNs
if byd then
span=merge({ chartDesigner[1],chartDesigner[2],chartDesigner[3],chartDesigner[4] })
else
span=merge({ chartDesigner[1],chartDesigner[2],chartDesigner[3] })
end
spanNs=merge({ chartDesigner[1],chartDesigner[2],chartDesigner[3] })


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 data, dataNs
local imageA=getImage(data('id'),args[' 图片'],args['Past曲绘'],args['Present '],args['Future曲绘'],args['Beyond 绘'],args['第二曲绘图片'],args['画师'],args['Beyond画师'],data('ftrJacketDesigner'),data('bydJacketDesigner'),byd,'a')
   if args["id"] and args["id"] ~= ""
local imageB=getImage(data('id'),args[' 图片'],args['Past曲绘'],args['Present曲绘'],args['Future曲绘'],args['Beyond曲绘'],args[' 第二曲绘图片'],args[' 画师'],args['Beyond画师'],data('ftrJacketDesigner'),data('bydJacketDesigner'),byd,'b')
   then
local infoList={
     data, dataNs = getData.singleSongInformation(args['id'], "id", "mobile"), getData.singleSongInformation(args['id'], "id", "ns")
[1]={
   elseif args["曲名"]
args[' 曲名'],data('title'),{ ['id']='title' }
   then
},
     data, dataNs = getData.singleSongInformation(args[' 曲名'], "name", "mobile"), getData.singleSongInformation(args['曲 '], "name", "ns")
[2]={
   end
imageA,'image',{ ['id']='top-image' }
 
},
   -- 判断 目在哪个平台存在。
[3]={
   local inMobile,inNs = false, false
imageB,'image',{ ['id']='right-image' }
   if data("id") or args["更新时间"] then
},
     inMobile = true
[4]={
   end
'曲目信息','',{ ['class']='header' }
 
},
   if dataNs("id") or args["更新时间NS"] then
[5]={
     inNs = true
' 师','',{ ['class']='label' }
   end
},
 
[6]={
   -- 判断byd谱面是否存在;先假定NS不会有beyond等级。
args['编曲'],link({ ' 曲师',tostring(data('artist')) }),{ ['class']='data' }
   local byd
},
   if args['Beyond等级'] or data('bydRating') then byd = true else byd = false end
[7]={
 
'曲包','',{ ['class']='label' }
   -- 处理谱师参数,未填写的等级谱师向前级复制(向下兼容)
},
   local getChartDesigner = {
[8]={
     [1] =
args['曲 '],getData.pack({data('set')}),{ ['class']='data' }
     {'mobile', 'PastNote编写', 'note编写', 'pstChartDesigner'},
},
     [2] =
[9]={
     {'mobile', 'PresentNote编写', 'note编写', 'prsChartDesigner'},
'时长','',{ ['class']='label' }
     [3] =
},
     {'mobile', 'FutureNote编写', 'note编写', 'ftrChartDesigner'},
[10]={
   [4] = 
args[' 时长'],' ',{ ['class']='data' }
     {'mobile', 'BeyondNote编写', 'note编写', 'bydChartDesigner'}}
},
 
[11]={
   local chartDesigner = {}
'BPM','',{ ['class']='label' }
   for i, k in ipairs(getChartDesigner)
},
     do
[12]={
       if args[k[2]]
args['BPM'],data('bpm'),{ ['class']='data' }
         then
},
         chartDesigner[i] = args[k[2]]
[13]={
       else
'谱面信息( 双模式)','',{ ['id']='all-play-header' , ['class']='header' }
         if args[k[3]]
},
           then
[14]={
           chartDesigner[i] = args[k[3]]
'谱面信息(触控)','',{ ['id']='mobile-play-header' , ['class']='header' }
         else
},
           chartDesigner[i] = choice(link({' 师', tostring(data(k[4]))}), data(k[4]), '', true)
[15]={
         end
' 难度','',{ ['class']='label' }
       end
},
   end
[16]={
 
'[Past]','',{ ['class']='pst-label' }
   -- 依据byd是否存在处理单元格合并参数。
},
   local span
[17]={
   if byd then
'[Present]','',{ ['class']='prs-label' }
     span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3], chartDesigner[4]})
},
   else
[18]={
     span = merge({chartDesigner[1], chartDesigner[2], chartDesigner[3]})
'[Future]','',{ ['class']='ftr-label' }
   end
},
 
[19]={
   -- 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
'[Beyond]','',{ ['class']='byd-label' }
 
},
   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[' 图片显示控制'])
[20]={
   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[' 图片显示控制'])
' 等级','',{ ['class']='label' }
 
},
   -- 生成Grid表格的信息表;在后文中依据格式进行生成。
[21]={
   --
args['Past等级'],data('pstRating'),{ ['class']='pst-data' }
   local infoList = {
},
     [1] =
[22]={
     { title(args[' 曲名'] or data('title') or dataNs('title'), args[' 第二曲名'], data('id') or dataNs('id') or #args > 1), { id = 'title'}},
args['Present等级'],data('prsRating'),{ ['class']='prs-data' }
     [2] = 
},
     { imageA or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'top-image'}},
[23]={
     [3] = 
args['Future等级'],data('ftrRating'),{ ['class']='ftr-data' }
     { imageB or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[ 文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'right-image'}},
},
     [4] = 
[24]={
     { ' 曲目信息', {class = 'header'} },
args['Beyond等级'],data('bydRating'),{ ['class']='byd-data' }
     [5] = 
},
     { ' 曲师', { class = 'label'}},
[25]={
     [6] = 
'note数量','',{ ['class']='label' }
     { args[' 编曲'] or choice(link({'曲师', tostring(data('artist'))}) or link({' 曲师', tostring(dataNs('artist'))}), data('artist') or dataNs('artist'), '', true), { class = 'data'}},
},
     [7] = 
[26]={
     { ' 曲包', { class = 'label'}},
args['PastNote'],'空',{ ['class']='pst-data' }
     [8] = 
},
     { args[' 曲包'] or choice('[['..tostring(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set')))..']]',data('set') or dataNs('set'),'',true), { class = 'data'}},
[27]={
     [9] = 
args['PresentNote'],' 空',{ ['class']='prs-data' }
     { ' 时长', { class = 'label'}},
},
     [10] =
[28]={
     { args[' 时长'] or '空', { class = 'data'}},
args['FutureNote'],' ',{ ['class']='ftr-data' }
     [11] = 
},
     { 'BPM', { class = 'label'}},
[29]={
     [12] = 
args['BeyondNote'],'空',{ ['class']='byd-data' }
     { args['BPM'] or data('bpm') or dataNs('bpm'), { class = 'data'}},
},
     [13] =
[30]={
     { ' 谱面信息', { class = 'header'}},
' 谱面设计','',{ ['class']='label' }
     [14] = 
},
     { '难度', { class = 'label'}},
[31]={
     [15] =
chartDesigner[1],' ',{ ['class']='pst-data' },span[1]
     { '[Past]', { class = 'pst-label'}},
},
     [16] =
[32]={
     { '[Present]', { class = 'prs-label'}},
chartDesigner[2],' ',{ ['class']='prs-data' },span[2]
     [17] = 
},
     { '[Future]', { class = 'ftr-label'}},
[33]={
     [18] = 
chartDesigner[3],' ',{ ['class']='ftr-data' },span[3]
     { bydMark(byd, args[' 曲名'], inNs), { class = 'byd-label'}},
},
     [19] = 
[34]={
     { ' 等级', { class = 'label'}},
chartDesigner[4],' ',{ ['class']='byd-data' },span[4]
     [20] = 
},
     { args['Past 等级'] or data('pstRating'), { class = 'pst-data'}},
[35]={
     [21] = 
'谱面信息(Joy-Con)','',{ ['class']='header ns',['id']='ns-play-header' }
     { args['Present 等级'] or data('prsRating'), { class = 'prs-data'}},
},
     [22] = 
[36]={
     { args['Future 等级'] or data('ftrRating'), { class = 'ftr-data'}},
'难度','',{ ['class']='label ns' }
     [23] = 
},
     { args['Beyond 等级'] or data('bydRating'), { class = 'byd-data'}},
[37]={
     [24] = 
'[Past]','',{ ['class']='pst-label ns' }
     { 'note数量', { class = 'label'}},
},
     [25] = 
[38]={
     { args['PastNote'] or ' ', { class = 'pst-data'}},
'[Present]','',{ ['class']='prs-label ns' }
     [26] = 
},
     { args['PresentNote'] or ' ', { class = 'prs-data'}},
[39]={
     [27] = 
'[Future]','',{ ['class']='ftr-label ns' }
     { args['FutureNote'] or ' ', {class = 'ftr-data'}},
},
     [28] = 
[40]={
     { args['BeyondNote'] or ' ', { class = 'byd-data'}},
'[Beyond]','',{ ['class']='byd-label ns' }
     [29] = 
},
     { ' 谱面设计', { class = 'label'}},
[41]={
     [30] = 
'等级','',{ ['class']='label ns' }
     { chartDesigner[1] or ' ', { class = 'pst-data'}, span[1]},
},
     [31] = 
[42]={
     { chartDesigner[2] or ' ', { class = 'prs-data'}, span[2]},
args['Past等级NS'],dataNs('pstRating'),{ ['class']='pst-data ns' }
     [32] = 
},
     { chartDesigner[3] or ' ', { class = 'ftr-data'}, span[3]},
[43]={
     [33] = 
args['Present等级NS'],dataNs('prsRating'),{ ['class']='prs-data ns' }
     { chartDesigner[4] or ' ', { class = 'byd-data'}, span[4]},
},
     [34] = 
[44]={
     { '谱面 信息(Joy-Con)', { class = 'header ns', id = 'ns-play-header'}},
args['Future等级NS'],dataNs('ftrRating'),{ ['class']='ftr-data ns' }
     [35] =
},
     { ' 难度', { class = 'label ns'}},
[45]={
     [36] = 
args['Beyond等级NS'],' ',{ ['class']='byd-data ns' }
     { '[Past]', { class = 'pst-label ns'}},
},
     [37] = 
[46]={
     { '[Present]', { class = 'prs-label ns'}},
'note数量','',{ ['class']='label ns' }
     [38] = 
},
     { '[Future]', { class = 'ftr-label ns'}},
[47]={
     [39] =
args['PastNoteNS'],args['PastNote'],{ ['class']='pst-data ns' }
     { bydMark(byd, args[' 曲名'], inNs), { class = 'byd-label ns'}},
},
     [40] = 
[48]={
     { 'note数量', { class = 'label ns'}},
args['PresentNoteNS'],args['PresentNote'],{ ['class']='prs-data ns' }
     [41] = 
},
     { args['PastNoteNS'] or args['PastNote'], { class = 'pst-data ns'}},
[49]={
     [42] = 
args['FutureNoteNS'],args['FutureNote'],{ ['class']='ftr-data ns' }
     { args['PresentNoteNS'] or args['PresentNote'], { class = 'prs-data ns'}},
},
     [43] = 
[50]={
     { args['FutureNoteNS'] or args['FutureNote'], { class = 'ftr-data ns'}},
args['BeyondNoteNS'],' ',{ ['class']='byd-data ns' }
     [44] =
},
     { args['BeyondNoteNS'] or ' ', { class = 'byd-data ns'}},
[51]={
     [45] = 
'谱面 设计','',{ ['class']='label ns' }
     { '背景', { class = 'label'}},
},
     [46] =
[52]={
     { bgCov(args[' 背景']) or bgCov(data('bg')) or bgCov(dataNs('bg')), { class = 'data' , id = 'bg-normal' }},
chartDesigner[5],chartDesigner[1],{ ['class']='pst-data ns' },spanNs[1]
     [47] =
},
     { bgCov(args['Future背景']) , { class = 'data' , id = 'bg-ftr' }},
[53]={
     [48] = 
chartDesigner[6],chartDesigner[2],{ ['class']='prs-data ns' },spanNs[2]
     { '更新 时间', { id = 'update-data-label', class = 'label'}},
},
     [49] =
[54]={
     { dateCov(args['更新 版本'], args[' 更新时间'], labelText('移动版'), 'arg') or dateCov(data('version'), tonumber(data('date')), labelText(' 移动 版'), 'data'), { id = 'mobile-date-normal', class = 'data'}},
chartDesigner[7],chartDesigner[3],{ ['class']='ftr-data ns' },spanNs[3]
     [50] = 
},
     { dateCov(args['Beyond更新版本'], args['Beyond更新时间'], labelText('移动版'), 'arg') or '空', { id = 'mobile-date-byd', class = 'data'}},
[55]={
     [51] =
args['BeyondNote编写NS'],'无',{ ['class']='byd-data ns' },spanNs[4]
     { 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'}},
},
     [52] =
[56]={
     { '空', { id = 'ns-date-byd', class = 'data ns'}}
'背景','',{ ['class']='label' }
   }
},
 
[57]={
   local box = mw.html.create('div')
bgCov(args[' 背景']),bgCov(data('bg')),{ ['class']='data' }
 
},
   --样式控制
[58]={
   box:addClass("arcaeabox")
'更新时间','',{ ['id']='update-data-label',['class']='label' }
   if byd then box:addClass("byd") end
},
   if dataNs('side') == 1 or args['侧'] == '1'
[59]={
   then
dateArg(args[' 更新版本'] , args[' 更新时间'] , ' 移动版:' ) , dateData( data('version') , tonumber(data('date')) , '移动版:' ) ,{ ['id']='mobile-date-normal',['class']='data'}
   box:addClass("conflict")
},
   else if dataNs('side') == 2 or args['侧'] == '2' then box:addClass("colorless") else box:addClass("light") end
[60]={
   end
dateArg(args['Beyond更新版本'] , args['Beyond更新时间'] ,'' ) ,' ',{ ['id']='mobile-date-byd',['class']='data'}
   if args['更新版本NS'] or dataNs('id')
},
     then
[61]={
     box:addClass("ns-box")
dateArg(args['更新 版本NS'] , args['更新 时间NS'] , 'NS版:' ),dateArg('v1.0.0c' ,'2021/05/18' , 'NS ' ),{ ['id']='ns-date-normal',['class']='data ns'}
     if not(dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange')) --(or byd) -- bdy单独分栏禁用
},
       then
[62]={
       box:addClass("ns-same")
'无','',{ ['id']='ns-date-byd',['class']='data ns'}
     end
}
   end
}
   if args['Beyond更新版本'] and args['Beyond更新时间'] then box:addClass('mobile-byd-date') end
   if args['曲名'] == 'Tempestissimo' 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
   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') 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 data('side') == 1 or dataNs('side') == 1 or args['侧'] == '1'
       then
       category = category..'[[分类:纷争侧曲目]]'
     elseif data('side') == 0 or dataNs('side') == 0 or args['侧'] == '0'
     then
       category = category..'[[分类:光芒侧曲目]]'
     else
     category = category..'[[分类:消色侧曲目]]'
     end
 
     category = category..'[[分类:PST'..infoList[20][1] .. '级曲目]]'
     category = category..'[[分类:PRS'..infoList[21][1] .. '级曲目]]'
     category = category..'[[分类:FTR'..infoList[22][1] .. '级曲目]]'
     if byd then category = category..'[[分类:BYD'..infoList[23][1] .. '级曲目]]' end
 
     category = category..'[[分类:采用'..(args['背景'] or data('bg') or dataNs('bg')) .. '背景的曲目]]'
 
     if args['曲目版本'] then category = category..'[[分类:'..args['曲目版本']:gusb('v', 'V') .. '添加的曲目]]' end
     if args['曲目版本NS'] then category = category..'[[分类:NS '..args['曲目版本NS']:gusb('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(args['时长'])
     then
     noticeText = noticeText..'<li>此模板缺少<code>时长</code>参数,此参数无法自动读取。</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
 
   local notice
   if noticeText ~= ''
     then
     notice = mw.getCurrentFrame():expandTemplate {title = 'Collapse', args = { ['标题'] = '曲目信息模板提示信息', ['状态'] = '折叠',
       ['标题文字方向'] = 'center', ['标题颜色'] = '#dddddd',
       ['内容颜色'] = '#eeeeee', ['内容样式'] = 'width:800px',
     ['style'] = 'display:table;width:200px', ['class'] = 'nomobile',
     ['内容'] = noticeText}}
 
     category = category..'[[分类:缺少参数的曲目信息模板]]'
   end


local box = mw.html.create( 'div' )
   if args['nocat'] then category = '' end
box:addClass( "songbox" )
if byd then box:addClass( "byd" ) end
if dataNs('side')==1 or args['侧']=='1' then box:addClass( "conflict" ) else box:addClass( "light" ) end
if args['更新版本NS'] or dataNs('id')
then
box:addClass( "ns-box" )
if not( dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') or byd )
then
box:addClass( "ns-same" )
end
category=category..'[[分类:双模式曲目]]'
else
category=category..'[[分类:仅触摸模式曲目]]'
end
if args['Beyond更新版本'] and args['Beyond更新时间'] then box:addClass( 'mobile-byd-date' ) end
if args['曲名']=='Tempestissimo' then box:addClass( 'ns-byd-date' ) box:addClass( 'ns-date-span' )  end
if dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange') then category=category..'[[分类:多模式谱面有差异的曲目]]' end
if args['nocat'] then category='' end


local boxList={}
   return tostring(box)..choice(notice, notice, '', true)..category
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 tostring(box)..category
end
end


return p
return p

2022年10月25日 (二) 12:34的版本

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

local getArgs = require('Module:Arguments').getArgs
local link = require('Module:Link')._link
local getData = require("Module:Arcaea Data")
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
        b:wikitext('v'..v..'<br>'..tostring(timeCov(d)))
    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 bydMark(byd, name, inNs)
    local diff, mark = mw.html.create('div'), mw.html.create('div')
    diff:wikitext('[Beyond]')
    mark:wikitext('仅移动版')
    if byd and inNs and name ~= "Tempestissimo"
        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)
    --谢邀,这写的什么东西我自己都看不懂了 ———Star0
    if not(id or all) then return nil end

    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
	
	--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('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
	
    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('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)
    end

    if byd 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('img-tab-part normal') tab2:addClass('img-tab-part byd')
        tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
        container:wikitext(tostring(tab))

        part1:wikitext('[[文件:'..all..'|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]'..labelText('画师')..tostring(bydJacket))
        part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
        container:wikitext(tostring(part1)) container:wikitext(tostring(part2))

        return tostring(container)
    end

    if second
        then
        tab1, tab2, part1, part2 = mw.html.create('div'), mw.html.create('div'), mw.html.create('div'), mw.html.create('div')

        tab1:wikitext('第一曲绘') tab2:wikitext('第二曲绘')
        tab1:addClass('img-tab-part normal') tab2:addClass('img-tab-part normal')
        tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
        container:wikitext(tostring(tab))

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

        return tostring(container)
    end

    if id and 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('img-tab-part normal') tab2:addClass('img-tab-part byd')
        tab:wikitext(tostring(tab1)) tab:wikitext(tostring(tab2))
        container:wikitext(tostring(tab))

        part1:wikitext('[[文件:Songs '..id..'.jpg|256px|none]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs '..id..' byd.jpg|256px|none]]'..labelText('画师')..tostring(bydJacket))
        part1:addClass('active tab-text-'..mold) part2:addClass('tab-text-'..mold)
        container:wikitext(tostring(part1)) container:wikitext(tostring(part2))

        return tostring(container)
    end

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

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

function merge(list)
    local merge
    if list[4] then merge = {1, 1, 1, 1} else merge = {1, 1, 1} end
    local o
    if list[4] then o = 4 else o = 3 end

    if list[4] then
        if list[4] == list[3] then merge[3] = merge[3] + merge[4] merge[4] = 0 end
    end

    if list[3] == list[2] then merge[2] = merge[2] + merge[3] merge[3] = 0 end

    if list[2] == list[1] then merge[1] = merge[1] + merge[2] merge[2] = 0 end

    for i = 1, o do
        if merge[i] == 0 then
            merge[i] = 'display:none'
        else
            merge[i] = 'grid-column-start: span '..merge[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 p._main(args)

    -- 获取数据查找函数
    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谱面是否存在;先假定NS不会有beyond等级。
    local byd
    if args['Beyond等级'] or data('bydRating') then byd = true else byd = false end

    -- 处理谱师参数,未填写的等级谱师向前级复制(向下兼容)
    local getChartDesigner = {
        [1] = 
        {'mobile', 'PastNote编写', 'note编写', 'pstChartDesigner'},
        [2] = 
        {'mobile', 'PresentNote编写', 'note编写', 'prsChartDesigner'},
        [3] = 
        {'mobile', 'FutureNote编写', 'note编写', 'ftrChartDesigner'},
    [4] = 
        {'mobile', 'BeyondNote编写', 'note编写', 'bydChartDesigner'}}

    local chartDesigner = {}
    for i, k in ipairs(getChartDesigner)
        do
            if args[k[2]]
                then
                chartDesigner[i] = args[k[2]]
            else
                if args[k[3]]
                    then
                    chartDesigner[i] = args[k[3]]
                else
                    chartDesigner[i] = choice(link({'谱师', tostring(data(k[4]))}), data(k[4]), '', true)
                end
            end
    end

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

    -- 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['图片显示控制'])
    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['图片显示控制'])

    -- 生成Grid表格的信息表;在后文中依据格式进行生成。
    -- 
    local infoList = {
        [1] = 
        { title(args['曲名'] or data('title') or dataNs('title'), args['第二曲名'], data('id') or dataNs('id') or #args > 1), { id = 'title'}},
        [2] = 
        { imageA or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'top-image'}},
        [3] = 
        { imageB or choice('[[文件:Songs '..tostring(data('id')) .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..tostring(dataNs('id')) .. '.jpg|点此上传图片]]', dataNs('id')), { id = 'right-image'}},
        [4] = 
        { '曲目信息', {class = 'header'} },
        [5] = 
        { '曲师', { class = 'label'}},
        [6] = 
        { args['编曲'] or choice(link({'曲师', tostring(data('artist'))}) or link({'曲师', tostring(dataNs('artist'))}), data('artist') or dataNs('artist'), '', true), { class = 'data'}},
        [7] = 
        { '曲包', { class = 'label'}},
        [8] = 
        { args['曲包'] or choice('[['..tostring(choice(getData.packName(data('set')), data('set'), getData.packName(dataNs('set')), dataNs('set')))..']]',data('set') or dataNs('set'),'',true), { class = 'data'}},
        [9] = 
        { '时长', { class = 'label'}},
        [10] = 
        { args['时长'] or '空', { class = 'data'}},
        [11] = 
        { 'BPM', { class = 'label'}},
        [12] = 
        { args['BPM'] or data('bpm') or dataNs('bpm'), { class = 'data'}},
        [13] = 
        { '谱面信息', { class = 'header'}},
        [14] = 
        { '难度', { class = 'label'}},
        [15] = 
        { '[Past]', { class = 'pst-label'}},
        [16] = 
        { '[Present]', { class = 'prs-label'}},
        [17] = 
        { '[Future]', { class = 'ftr-label'}},
        [18] = 
        { bydMark(byd, args['曲名'], inNs), { class = 'byd-label'}},
        [19] = 
        { '等级', { class = 'label'}},
        [20] = 
        { args['Past等级'] or data('pstRating'), { class = 'pst-data'}},
        [21] = 
        { args['Present等级'] or data('prsRating'), { class = 'prs-data'}},
        [22] = 
        { args['Future等级'] or data('ftrRating'), { class = 'ftr-data'}},
        [23] = 
        { args['Beyond等级'] or data('bydRating'), { class = 'byd-data'}},
        [24] = 
        { 'note数量', { class = 'label'}},
        [25] = 
        { args['PastNote'] or '空', { class = 'pst-data'}},
        [26] = 
        { args['PresentNote'] or '空', { class = 'prs-data'}},
        [27] = 
        { args['FutureNote'] or '空', {class = 'ftr-data'}},
        [28] = 
        { args['BeyondNote'] or '空', { class = 'byd-data'}},
        [29] = 
        { '谱面设计', { class = 'label'}},
        [30] = 
        { chartDesigner[1] or '空', { class = 'pst-data'}, span[1]},
        [31] = 
        { chartDesigner[2] or '空', { class = 'prs-data'}, span[2]},
        [32] = 
        { chartDesigner[3] or '空', { class = 'ftr-data'}, span[3]},
        [33] = 
        { chartDesigner[4] or '空', { class = 'byd-data'}, span[4]},
        [34] = 
        { '谱面信息(Joy-Con)', { class = 'header ns', id = 'ns-play-header'}},
        [35] = 
        { '难度', { class = 'label ns'}},
        [36] = 
        { '[Past]', { class = 'pst-label ns'}},
        [37] = 
        { '[Present]', { class = 'prs-label ns'}},
        [38] = 
        { '[Future]', { class = 'ftr-label ns'}},
        [39] = 
        { bydMark(byd, args['曲名'], inNs), { class = 'byd-label ns'}},
        [40] = 
        { 'note数量', { class = 'label ns'}},
        [41] = 
        { args['PastNoteNS'] or args['PastNote'], { class = 'pst-data ns'}},
        [42] = 
        { args['PresentNoteNS'] or args['PresentNote'], { class = 'prs-data ns'}},
        [43] = 
        { args['FutureNoteNS'] or args['FutureNote'], { class = 'ftr-data ns'}},
        [44] = 
        { args['BeyondNoteNS'] or '空', { class = 'byd-data ns'}},
        [45] = 
        { '背景', { class = 'label'}},
        [46] = 
        { bgCov(args['背景']) or bgCov(data('bg')) or bgCov(dataNs('bg')), { class = 'data' , id = 'bg-normal' }},
        [47] = 
        { bgCov(args['Future背景']) , { class = 'data' , id = 'bg-ftr' }},
        [48] = 
        { '更新时间', { id = 'update-data-label', class = 'label'}},
        [49] = 
        { dateCov(args['更新版本'], args['更新时间'], labelText('移动版'), 'arg') or dateCov(data('version'), tonumber(data('date')), labelText('移动版'), 'data'), { id = 'mobile-date-normal', class = 'data'}},
        [50] = 
        { dateCov(args['Beyond更新版本'], args['Beyond更新时间'], labelText('移动版'), 'arg') or '空', { id = 'mobile-date-byd', class = 'data'}},
        [51] = 
        { 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'}},
        [52] = 
        { '空', { id = 'ns-date-byd', class = 'data ns'}}
    }

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

    --样式控制
    box:addClass("arcaeabox")
    if byd then box:addClass("byd") end
    if dataNs('side') == 1 or args['侧'] == '1'
    	then
    	box:addClass("conflict") 
    	else if dataNs('side') == 2 or args['侧'] == '2' then box:addClass("colorless") else box:addClass("light") end
    end
    if args['更新版本NS'] or dataNs('id')
        then
        box:addClass("ns-box")
        if not(dataNs('pstChange') or dataNs('prsChange') or dataNs('ftrChange')) --(or byd) -- bdy单独分栏禁用
            then
            box:addClass("ns-same")
        end
    end
    if args['Beyond更新版本'] and args['Beyond更新时间'] then box:addClass('mobile-byd-date') end
    if args['曲名'] == 'Tempestissimo' 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
    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') 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 data('side') == 1 or dataNs('side') == 1 or args['侧'] == '1'
            then
            category = category..'[[分类:纷争侧曲目]]'
        elseif data('side') == 0 or dataNs('side') == 0 or args['侧'] == '0'
        	then
            category = category..'[[分类:光芒侧曲目]]'
        else
        	category = category..'[[分类:消色侧曲目]]'
        end

        category = category..'[[分类:PST'..infoList[20][1] .. '级曲目]]'
        category = category..'[[分类:PRS'..infoList[21][1] .. '级曲目]]'
        category = category..'[[分类:FTR'..infoList[22][1] .. '级曲目]]'
        if byd then category = category..'[[分类:BYD'..infoList[23][1] .. '级曲目]]' end

        category = category..'[[分类:采用'..(args['背景'] or data('bg') or dataNs('bg')) .. '背景的曲目]]'

        if args['曲目版本'] then category = category..'[[分类:'..args['曲目版本']:gusb('v', 'V') .. '添加的曲目]]' end
        if args['曲目版本NS'] then category = category..'[[分类:NS '..args['曲目版本NS']:gusb('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(args['时长'])
        then
        noticeText = noticeText..'<li>此模板缺少<code>时长</code>参数,此参数无法自动读取。</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

    local notice
    if noticeText ~= ''
        then
        notice = mw.getCurrentFrame():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