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