Module:Songtable/sandbox

来自Arcaea中文维基
< Module:Songtable
Shift12讨论 | 贡献2024年10月15日 (二) 23:18的版本 (煞笔安卓)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

local getArgs = require('Module:Arguments').getArgs
local link = require('Module:Link')._link
local getData = require('Module:Arcaea_Data')

local aLink = require('Module:ConvertLink').artistLink
local pLink = require('Module:ConvertLink').packLink
local dLink = require('Module:ConvertLink').designerLink
local fullVer = require('Module:ConvertLink').fullVersionNum

local songLength = mw.loadJsonData 'Template:Song_Length.json'
local html = mw.html.create

local p = {}

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

local function dateCov(v, d, t, type)
	if not(v and d) then return nil end
	local box, a, b, c = html('div'), html('div'), html('div'), html('div')
	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:addClass('date-box'):wikitext(tostring(a)..tostring(b)..tostring(c))
	return tostring(box)
end

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

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

local function diffMark(diffText, byd, name, inNs, nsByd)
	local diff, mark = html('div'), html('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

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

local 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 = html('div'), html('div')
		local tab1, tab2, tab3, part1, part2, part3, jacket1, jacket2
		container:addClass('container')
		tab:attr('id', 'tab-'..mold):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 not(normalJacketData) then
				normalJacket, bydJacket = '未显示<sup>[[画师列表#未标明画师的曲绘名单|<kbd>?</kbd>]]</sup>', '未显示<sup>[[画师列表#未标明画师的曲绘名单|<kbd>?</kbd>]]</sup>'
			else
				normalJacket, bydJacket = link({'画师', tostring(normalJacketData)}), link({'画师', tostring(bydJacketData)})
			end
		end

		-- Last判断(未启用)
		-- if id == 'last' then
			-- tab1, tab2, tab3, part1, part2, part3 = html('div'), html('div'), html('div'), html('div'), html('div'), html('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)..tostring(tab2)..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_lasteternity.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)..tostring(part2)..tostring(part3))
			-- return tostring(container)
			-- 请在这里为接下来的判断补上else以完善逻辑

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

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

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

		elseif pst and prs and ftr then
			tab1, tab2, tab3, part1, part2, part3 = html('div'), html('div'), html('div'), html('div'), html('div'), html('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)..tostring(tab2)..tostring(tab3))

			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(tab)..tostring(part1)..tostring(part2)..tostring(part3))
			return tostring(container)

		elseif second then
			tab1, tab2, part1, part2 = html('div'), html('div'), html('div'), html('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)..tostring(tab2))

			if id then
				part1:wikitext('[[文件:Songs_'..id..'.jpg|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(tab)..tostring(part1)..tostring(part2))
			return tostring(container)

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

local 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 '流行/推荐'
	elseif category == 'partner' then return '搭档'
	elseif category == 'original' then return '原创'
	elseif category == 'variety' then return '综合'
	elseif 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'))

	if setText then
		local setDisplayText
		if categoryText then
			setDisplayText = tostring(setText)..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 = html('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 args['侧'] == '1' or data('side') == 1 or dataNs('side') == 1 then
		box:addClass('conflict')
	elseif args['侧'] == '2' or data('side') == 2 or dataNs('side') == 2 then
		box:addClass('colorless')
	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 not(args['nocat']) and (data('id') or dataNs('id')) then
	-- 如果没有更新packlist,不自动进行分类
		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 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..'[[分类:消色侧曲目]]'
		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

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

return p