Module:Songtable:修订间差异
小 (修改若干小问题) |
无编辑摘要 |
||
(未显示10个用户的80个中间版本) | |||
第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: | 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) | |||
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 | end | ||
function | 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 | end | ||
function | function labelText(text, class) | ||
local span = mw.html.create('span') | |||
span:addClass('label-text') | |||
span:wikitext(text) | |||
return tostring(span) | |||
end | end | ||
function | function getImage(id, all, pst, prs, ftr, byd, second, normalJacketArgs, bydJacketArgs, normalJacketData, bydJacketData, bydyes, mold, imageConfig, tab1text, tab2text) | ||
-- 谢邀,这写的什么东西我自己都看不懂了 ———Star0 | |||
then | if not(id or all) then | ||
return nil | return nil | ||
else | 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 | |||
normalJacket,bydJacket=normalJacketArgs, | |||
else | else | ||
normalJacket,bydJacket= | if normalJacketData == "" or normalJacketData == nil then | ||
normalJacket, bydJacket = '未显示', '未显示' | |||
else | |||
normalJacket, bydJacket = link({'画师', tostring(normalJacketData)}), link({'画师', tostring(bydJacketData)}) | |||
end | |||
end | end | ||
if | 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') | |||
normalJacket | 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 | 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 | ||
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) | 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 | end | ||
function | 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) | |||
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) | ||
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 | else | ||
box:addClass("lephon") | |||
end | 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 | end | ||
if pstRating then | |||
category = category..'[[ 分类:PST'..pstRating .. '级曲目]]' | |||
end | 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 | 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