Module:Setlistbox
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