Module:Songtable

来自Arcaea中文维基
Star0讨论 | 贡献2021年7月20日 (二) 17:21的版本

可在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 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
end

function bydMark(byd, name)
    local diff, mark = mw.html.create('div'), mw.html.create('div')
    diff:wikitext('[Beyond]')
    mark:wikitext('仅移动版')
    if byd 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, 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]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..prs..'|256px|none]]'..labelText('画师')..normalJacket) part3:wikitext('[[文件:'..ftr..'|256px|none]]'..labelText('画师')..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]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..byd..'|256px|none]]'..labelText('画师')..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]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:'..second..'|256px|none]]'..labelText('画师')..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]]'..labelText('画师')..normalJacket) part2:wikitext('[[文件:Songs '..id..' byd.jpg|256px|none]]'..labelText('画师')..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]]'..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 re0()
    return nil
end

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

function p._main(args)

    local data, dataNs = getData.getMobile(args['曲名']), getData.getNS(args['曲名'])

    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
                    if chartDesigner[i - 1]
                        then
                        chartDesigner[i] = chartDesigner[i - 1]
                    else
                        chartDesigner[i] = link({'谱师', tostring(data(k[4]))})
                    end
                end
            end
        end

        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')
        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['曲名'] or data('title') or dataNs('title'),
            {id = 'title'}},
            [2] = {
                imageA or choice('[[文件:Songs '..data('id') .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..dataNs('id') .. '.jpg|点此上传图片]]', dataNs('id')),
            {id = 'top-image'}},
            [3] = {
                imageB or choice('[[文件:Songs '..data('id') .. '.jpg|点此上传图片]]', data('id'), '[[文件:Songs '..dataNs('id') .. '.jpg|点此上传图片]]', dataNs('id')),
            {id = 'right-image'}},
            [4] = {
                '曲目信息',
            {class = 'header'}},
            [5] = {
                '曲师',
            {class = 'label'}},
            [6] = {
                args['编曲'] or link({'曲师', tostring(data('artist'))}) or link({'曲师', tostring(dataNs('artist'))}),
            {class = 'data'}},
            [7] = {
                '曲包',
            {class = 'label'}},
            [8] = {
                args['曲包'] or getData.pack({data('set')}),
            {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['曲名']),
            {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['曲名']),
            {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'}},
            [47] = {
                '更新时间',
            {id = 'update-data-label', class = 'label'}},
            [48] = {
                dateCov(args['更新版本'], args['更新时间'], labelText('移动版'), 'arg') or dateCov(data('version'), tonumber(data('date')), labelText('移动版'), 'data'),
            {id = 'mobile-date-normal', class = 'data'}},
            [49] = {
                dateCov(args['Beyond更新版本'], args['Beyond更新时间'], labelText('移动版'), 'arg') or '无',
            {id = 'mobile-date-byd', class = 'data'}},
            [50] = {
                dateCov(args['更新版本NS'], args['更新时间NS'], labelText('NS版'), 'arg') or '无',
            {id = 'ns-date-normal', class = 'data ns'}},
            [51] = {
                '无',
            {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 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) -- 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

            --分类添加
            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 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][2])
                :cssText(infoList[i][3])
                :wikitext(infoList[i][1])
                box:wikitext(tostring(boxList[i]))
            end

            return tostring(box)..category
        end

        return p