Module:Songtable

来自Arcaea中文维基
Star0讨论 | 贡献2021年5月31日 (一) 12:49的版本

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

local getArgs = require('Module:Arguments').getArgs
local link = require('Module:Link')._link
local getData = require("Module:data")
local p = {}

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

function dateArg(v,d,t)
	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)
	b:wikitext(v..'<br>'..'('..tostring(d)..')')
	box:wikitext(tostring(a))
	   :wikitext(tostring(b))
	   :wikitext(tostring(c))
	return tostring(box)
end
	
function dateData(v,d,t)
	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)
	b:wikitext('v'..v..'<br>'..tostring(timeCov(d)))
	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 getImage(id,all,pst,prs,ftr,byd,second,normalJacketArgs,bydJacketArgs,normalJacketData,bydJacketData,bydyes,type)
	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-'..type ) 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 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]]画师:'..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
	
	if byd
	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]]画师:'..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('第二曲绘')
		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]]画师:'..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')
		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
	

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 re0()
	return nil
end

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

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 imageA=getImage(data('id'),args['图片'],args['Past曲绘'],args['Present曲绘'],args['Future曲绘'],args['Beyond曲绘'],args['第二曲绘图片'],args['画师'],args['Beyond画师'],data('ftrJacketDesigner'),data('bydJacketDesigner'),byd,'a')
	local imageB=getImage(data('id'),args['图片'],args['Past曲绘'],args['Present曲绘'],args['Future曲绘'],args['Beyond曲绘'],args['第二曲绘图片'],args['画师'],args['Beyond画师'],data('ftrJacketDesigner'),data('bydJacketDesigner'),byd,'b')	
	local infoList={
		[1]={
			args['曲名'],data('title'),{ ['id']='title' }
		},
		[2]={
			imageA,'image',{ ['id']='top-image' }
		},
		[3]={
			imageB,'image',{ ['id']='right-image' }
		},
		[4]={
			'曲目信息','',{ ['class']='header' }
		},
		[5]={
			'曲师','',{ ['class']='label' }
		},
		[6]={
			args['编曲'],link({ '曲师',tostring(data('artist')) }),{ ['class']='data' }
		},
		[7]={
			'曲包','',{ ['class']='label' }
		},
		[8]={
			args['曲包'],getData.pack({data('set')}),{ ['class']='data' }
		},
		[9]={
			'时长','',{ ['class']='label' }
		},
		[10]={
			args['时长'],'空',{ ['class']='data' }
		},
		[11]={
			'BPM','',{ ['class']='label' }
		},
		[12]={
			args['BPM'],data('bpm'),{ ['class']='data' }
		},
		[13]={
			'谱面信息(双模式)','',{ ['id']='all-play-header' , ['class']='header' }
		},
		[14]={
			'谱面信息(触控)','',{ ['id']='mobile-play-header' , ['class']='header' }
		},
		[15]={
			'难度','',{ ['class']='label' }
		},
		[16]={
			'[Past]','',{ ['class']='pst-label' }
		},
		[17]={
			'[Present]','',{ ['class']='prs-label' }
		},
		[18]={
			'[Future]','',{ ['class']='ftr-label' }
		},
		[19]={
			'[Beyond]','',{ ['class']='byd-label' }
		},
		[20]={
			'等级','',{ ['class']='label' }
		},
		[21]={
			args['Past等级'],data('pstRating'),{ ['class']='pst-data' }
		},
		[22]={
			args['Present等级'],data('prsRating'),{ ['class']='prs-data' }
		},
		[23]={
			args['Future等级'],data('ftrRating'),{ ['class']='ftr-data' }
		},
		[24]={
			args['Beyond等级'],data('bydRating'),{ ['class']='byd-data' }
		},
		[25]={
			'note数量','',{ ['class']='label' }
		},
		[26]={
			args['PastNote'],'空',{ ['class']='pst-data' }
		},
		[27]={
			args['PresentNote'],'空',{ ['class']='prs-data' }
		},
		[28]={
			args['FutureNote'],'空',{ ['class']='ftr-data' }
		},
		[29]={
			args['BeyondNote'],'空',{ ['class']='byd-data' }
		},
		[30]={
			'谱面设计','',{ ['class']='label' }
		},
		[31]={
			chartDesigner[1],'无',{ ['class']='pst-data' },span[1]
		},
		[32]={
			chartDesigner[2],'无',{ ['class']='prs-data' },span[2]
		},
		[33]={
			chartDesigner[3],'无',{ ['class']='ftr-data' },span[3]
		},
		[34]={
			chartDesigner[4],'无',{ ['class']='byd-data' },span[4]
		},
		[35]={
			'谱面信息(Joy-Con)','',{ ['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]={
			'无','',{ ['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]={
			args['BeyondNoteNS'],'无',{ ['class']='byd-data ns' }
		},
		[51]={
			'谱面设计','',{ ['class']='label ns' }
		},
		[52]={
			chartDesigner[5],chartDesigner[1],{ ['class']='pst-data ns' },spanNs[1]
		},
		[53]={
			chartDesigner[6],chartDesigner[2],{ ['class']='prs-data ns' },spanNs[2]
		},
		[54]={
			chartDesigner[7],chartDesigner[3],{ ['class']='ftr-data ns' },spanNs[3]
		},
		[55]={
			args['BeyondNote编写NS'],'无',{ ['class']='byd-data ns' },spanNs[4]
		},
		[56]={
			'背景','',{ ['class']='label' }
		},
		[57]={
			bgCov(args['背景']),bgCov(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('v1.0.0c' ,'2021/05/18' , 'NS版:' ),{ ['id']='ns-date-normal',['class']='data ns'}
		},
		[62]={
			'无','',{ ['id']='ns-date-byd',['class']='data ns'}
		}
	}

	local box = mw.html.create( 'div' )
	box:addClass( "songbox" )
	if byd then box:addClass( "byd" ) end
	if dataNs('side')==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={}
	
	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

return p