Module:Setlistbox

From TwentyOneWiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Setlistbox/doc

local p = {}

-- Подключаем модуль-помощник для выбора альбома
local albumSelector = require('Module:Setlist/AlbumSelector')
local data = mw.loadData('Module:Setlist/Songs')

-- Вспомогательная функция для проверки наличия элемента в таблице
local function table_contains(table, element)
    for _, value in ipairs(table) do
        if value == element then
            return true
        end
    end
    return false
end

function p.fromArgs(frame)
    local args = frame:getParent().args
    local complete = args['complete'] and args['complete']:lower() or "yes"

    -- Если complete="unknown", возвращаем только надпись и пустую таблицу
    if complete == "unknown" then
        local wikitext = '{| class="setlist-table setlist-anim" style="margin-top:1.6em;"\n|-\n| style="padding:0.7em 1.2em;" |\n'
        wikitext = wikitext .. '<div style="font-style:italic; margin-bottom:0.8em;">Setlist is unknown.</div>\n'
        wikitext = wikitext .. '|}'
        return wikitext
    end

    -- Собираем список песен из аргументов
    local list = {}
    for i = 1, 50 do
        local song = args['song'..i]
        if song and song ~= '' then
            local label = args['label'..i] or ""
            table.insert(list, { title = mw.text.trim(song), label = label })
        end
    end

    -- Группируем песни по альбомам
    local albumSongs = {}
    local albumOrder = {}
    local preferredAlbum = albumSelector.getAlbumForSong(frame) -- Получаем предпочтительный альбом на основе года

    for idx, songobj in ipairs(list) do
        local title = songobj.title
        local label = songobj.label
        local albumSelector = require('Module:Setlist/AlbumSelector')
        local albums = albumSelector.getAlbumForSong(title) or data.songs[title]


        if albums then
            local selectedAlbum
            -- Проверяем, есть ли песня в обоих альбомах Regional At Best и Vessel
            if #albums > 1 and table_contains(albums, "Regional At Best") and table_contains(albums, "Vessel") then
                selectedAlbum = preferredAlbum
                -- Отладочный комментарий для проверки
                wikitext = wikitext or ''
                wikitext = wikitext .. '<!-- Debug: Song ' .. title .. ' assigned to ' .. selectedAlbum .. ' -->'
            else
                selectedAlbum = albums[1] -- Берем первый альбом, если песня не в обоих
            end
            if not albumSongs[selectedAlbum] then
                albumSongs[selectedAlbum] = {}
                table.insert(albumOrder, selectedAlbum)
            end
            table.insert(albumSongs[selectedAlbum], {title = title, label = label, num = idx})
        else
            if not albumSongs["Non-Album"] then
                albumSongs["Non-Album"] = {}
                table.insert(albumOrder, "Non-Album")
            end
            table.insert(albumSongs["Non-Album"], {title = title, label = label, num = idx})
        end
    end

    -- 1. Основной сетлист
    local wikitext = wikitext or '{| class="setlist-table setlist-anim" style="margin-top:1.6em;"\n|-\n| style="padding:0.7em 1.2em;" |\n'

    -- Добавляем надпись для неполного сетлиста
    if complete == "uncomplete" then
        wikitext = wikitext .. '<div style="font-style:italic; margin-bottom:0.8em;">The complete setlist is unknown,<br>and the order of the songs may be incorrect.</div>\n'
    end

    -- Выводим список песен
    for idx, songobj in ipairs(list) do
        local numtxt = (complete == "yes") and (idx..".") or "*"
        local label = (songobj.label and songobj.label ~= '') and ('<span class="setlist-label">'..songobj.label..'</span>') or ''
        wikitext = wikitext .. '<div class="setlist-row"><span class="setlist-song">'..numtxt..' [['..songobj.title..']]</span>'..label..'</div>\n'
    end

    -- 2. Кольцевая диаграмма
    local total = 0
    for _, album in ipairs(albumOrder) do
        total = total + #albumSongs[album]
    end
    local start = 0
    local gradientParts = {}
    for _, album in ipairs(albumOrder) do
        local count = #albumSongs[album]
        local percent = total > 0 and (count / total * 100) or 0 -- Предотвращаем деление на ноль
        local finish = start + percent
        local color = data.albumColors and data.albumColors[album] or "#ccc"
        table.insert(gradientParts, string.format("%s %.2f%% %.2f%%", color, start, finish))
        start = finish
    end
    local gradient = "background: conic-gradient(" .. table.concat(gradientParts, ", ") .. ");"

    -- Вставляем кольцевую диаграмму
    wikitext = wikitext .. '<div class="ring-container7" style="margin:1.2em auto 1.1em auto;">'
    wikitext = wikitext .. '<div class="ring2" style="'..gradient..'"></div>'
    wikitext = wikitext .. '<div class="center2"></div>'
    wikitext = wikitext .. '<div class="imagemap-content2">'
    wikitext = wikitext .. '</div></div>\n'

    -- 3. Блоки по альбомам
    for albumIdx, album in ipairs(albumOrder) do
        local arr = albumSongs[album]
        local color = data.albumColors and data.albumColors[album] or "#eee"
        -- Убираем ссылку для Non-Album
        local link = (album == "Non-Album") and album or (data.albumLinks and data.albumLinks[album] or album)
        local displayText = (album == "Non-Album") and album or (data.albumLinks and data.albumLinks[album] and '[['..link..'|'..album..']]' or album)
        local uniqid = "myDivision"..albumIdx
        wikitext = wikitext .. '\n{| class="wikitable" style="margin-top:1em; border-collapse:separate; border-spacing:4px; border:hidden;"'
        wikitext = wikitext .. '\n| style="background:'..color..'; border:hidden;" |'
        wikitext = wikitext .. '\n| style="border:hidden;" | '..displayText
        wikitext = wikitext .. '\n| style="border:hidden;" | <span class="mw-customtoggle-'..uniqid..'">('..tostring(#arr)..')</span>'
        wikitext = wikitext .. '\n| style="border:hidden;" |\n<div class="mw-collapsible mw-collapsed" id="mw-customcollapsible-'..uniqid..'">'
        for _, entry in ipairs(arr) do
            wikitext = wikitext .. '<span class="collapsible-setlist-row"><span class="collapsible-setlist-symbol">○</span><small>'..entry.title..'</small></span>\n'
        end
        wikitext = wikitext .. '</div>\n|}\n'
    end

    wikitext = wikitext .. '|}'
    return wikitext
end

return p