Модуль:TournamentResults: различия между версиями
Перейти к навигации
Перейти к поиску
Burato (обсуждение | вклад) Новая страница: «-- ======================================= -- Модуль:TournamentResults -- Сборщик турнирных страниц из БД -- ====================...» |
Burato (обсуждение | вклад) Нет описания правки |
||
| Строка 130: | Строка 130: | ||
if id_home and id_away then | if id_home and id_away then | ||
local g1 = | local g1 = m[3] | ||
local g2 = | local g2 = m[4] | ||
-- Проверяем наличие ссылки | -- Защита от несыгранных матчей (nil) | ||
if g1 ~= nil and g2 ~= nil then | |||
local score_str = tostring(g1) .. ":" .. tostring(g2) | |||
-- Проверяем наличие ссылки | |||
local link_val = cleanParam(args['link' .. i .. '_' .. id_home .. '_' .. id_away]) | |||
if link_val then | |||
score_str = "[[" .. link_val .. "|" .. score_str .. "]]" | |||
end | |||
t_args['score' .. id_home .. '_' .. id_away] = score_str | |||
end | end | ||
end | end | ||
end | end | ||
-- Генерируем таблицу | -- Генерируем таблицу | ||
table.insert(output, matchTable._group(t_args)) | table.insert(output, matchTable._group(t_args)) | ||
-- ===================== | -- ===================== | ||
| Строка 161: | Строка 163: | ||
t_args['s' .. k .. '_team2'] = t2 | t_args['s' .. k .. '_team2'] = t2 | ||
-- Формируем счет | -- Формируем счет с защитой от nil (если матч не сыгран) | ||
local score_str = g1 .. ":" .. g2 | if g1 ~= nil and g2 ~= nil then | ||
local score_str = tostring(g1) .. ":" .. tostring(g2) | |||
if flag == "aet" then | |||
score_str = score_str .. "(ET)" | |||
elseif flag == "pen" then | |||
score_str = score_str .. "(пен." .. tostring(p1) .. ":" .. tostring(p2) .. ")" | |||
end | |||
-- Проверяем ссылку | |||
local link_val = cleanParam(args['link' .. i .. '_' .. k]) or (k == 1 and cleanParam(args['link' .. i])) | |||
if link_val then | |||
score_str = "[[" .. link_val .. "|" .. score_str .. "]]" | |||
end | |||
t_args['s' .. k .. '_score'] = score_str | |||
end | end | ||
-- Распаковываем цвета | -- Распаковываем цвета | ||
| Строка 190: | Строка 196: | ||
end | end | ||
-- Генерируем таблицу | -- Генерируем таблицу | ||
table.insert(output, matchTable._playoff(t_args)) | table.insert(output, matchTable._playoff(t_args)) | ||
end | end | ||
Версия от 12:34, 22 апреля 2026
[просмотр] [просмотр кода] [история] [обновить]
Модуль для вывода полных результатов турниров в нужном формате. За один проход по базе данных вытаскивает оттуда все требуемые результаты, подсчитывает нужные показатели и выдаёт сырую информацию модулю MatchTable, который рисует нужные таблицы.
Параметры
Общие
year— год турнира.tournament— название турнира, массив из базы данных, например, ["ЧТМ_2046_Qual"] (без [""]).
Строковые
С обязательной цифрой-номером строки.
Общие
title_type1— числовой параметр. Уровень заголовка, то есть количество знаков равенства в вики-разметке от2до6, если0, то выдаётся псевдо-заголовок Такого вида.title1— сам заголовок, то, что в нём будет написано.text1(опционально) — текст между заголовком и таблицей, поддерживает вики-разметку и переносы строк.table1— таблица, заполняется кодом массива из базы данных конкретного турнира, например, ["1R_GroupA"] (без [""]).ref1(опционально) — примечание мелким шрифтом под таблицей.
Частные
Эти параметры зависят от типа таблицы, которую вы хотите вывести в конкретной строке — таблицу группы или рейтинга. Для таблицы плей-офф особых параметров нет.
Группа
compact1— если заданоyes, то в таблице не показываются колонки «И», «В», «Н» и «П».tiebreaker1— в случае полного равенства команд необходимо расставить их вручную, указав через запятую трёхбуквенные коды.places1— если нужно расставить места не так, как подсчитано автоматически, то можно расставить вручную, указав через запятую трёхбуквенные коды.
Рейтинг
rating_title1— название сворачиваемой таблицы, как правило, «Рейтинг вторых мест» или «Рейтинг третьих мест».rating1— префикс раунда из базы данных, рейтинг мест в котором вы хотите подсчитать, как правило1R,2Rили3R.rating_place1— числовой параметр, номер мест, чей рейтинг вы хотите подсчитать, как правило2или3. Если заданоlast, то считается рейтинг последних мест.rating_colors1— цветовое оформление строк таблицы, указывайте количество строк и цвета. Например,2:G, 2:Y, 8:L, 2:R, читается как «2 зелёных, 2 жёлтых, 8 светло-жёлтых, 2 красных». Строка rating_colors полностью игнорирует пробелы, запятые и тире, она ищет только паттерныЧисло:Буква. Можно писать 2:G, 4:Y, 2:G 4:Y — всё поймёт без проблем. Буквы цветов те же, что и в базе:G— {{{3}}} (lightgreen)Y— {{{3}}} (palegoldenrod)L— {{{3}}} (lightyellow)R— {{{3}}} (lightsalmon)0— {{{3}}} (без раскраски)
rating_tiebreaker1— в случае полного равенства команд необходимо расставить их вручную, указав через запятую трёхбуквенные коды.places1— если нужно расставить места не так, как подсчитано автоматически, то можно расставить вручную, указав через запятую трёхбуквенные коды.
Заготовки для копирования
- Обёртка
{{#invoke:TournamentResults|build
|year =
|tournament =
}}
- Заголовки без таблиц
|title_type=|title=|text=
- Таблицы групп
|title_type=|title=|table=|compact=yes
- Таблицы плей-офф
|title_type=|title=|table=
- Таблицы рейтинга
|rating_title=|rating=|rating_place=|rating_colors=
Пожалуйста, добавляйте категории на страницу документации.
-- =======================================
-- Модуль:TournamentResults
-- Сборщик турнирных страниц из БД
-- =======================================
local p = {}
-- Подключаем наш отрисовщик таблиц
local matchTable = require('Модуль:MatchTable')
-- Словарь цветов и жирности
local COLORS = {
["G"] = { c = "lightgreen", b = true },
["Y"] = { c = "palegoldenrod", b = false },
["L"] = { c = "lightyellow", b = false },
["R"] = { c = "lightsalmon", b = false }
}
-- Функция для очистки параметров
local function cleanParam(param)
if type(param) == 'string' then
local trimmed = mw.text.trim(param)
if trimmed ~= '' then return trimmed end
end
return nil
end
-- =======================================
-- ОСНОВНАЯ ФУНКЦИЯ СБОРКИ (Для #invoke)
-- =======================================
function p.build(frame)
local args = frame:getParent().args
if next(args) == nil then args = frame.args end
local year = cleanParam(args.year)
local tournament = cleanParam(args.tournament)
if not year or not tournament then
return '<strong class="error">Ошибка: Не указаны обязательные параметры year и/или tournament.</strong>'
end
-- 1. ЗАГРУЗКА БАЗЫ ДАННЫХ (один раз!)
local success, full_db = pcall(mw.loadData, 'Модуль:Data/Tournaments/' .. year)
if not success then
return '<strong class="error">Ошибка: Не удалось загрузить базу данных за ' .. year .. ' год.</strong>'
end
local tour_data = full_db[tournament]
if not tour_data then
return '<strong class="error">Ошибка: Турнир "' .. tournament .. '" не найден в базе ' .. year .. ' года.</strong>'
end
-- Массив для сборки готового HTML/Викикода
local output = {}
-- 2. ЦИКЛ ПО БЛОКАМ СТРАНИЦЫ
-- Перебираем от 1 до 50 (лимит можно увеличить, если нужно больше 50 таблиц на страницу)
for i = 1, 50 do
-- Считываем параметры текущего блока
local title_type = cleanParam(args['title_type' .. i])
local title = cleanParam(args['title' .. i])
local text = cleanParam(args['text' .. i])
local table_id = cleanParam(args['table' .. i])
local ref = cleanParam(args['ref' .. i])
local compact = cleanParam(args['compact' .. i])
local rating = cleanParam(args['rating' .. i])
-- Условие выхода из цикла: если для данного индекса вообще ничего не задано
if not (title or text or table_id or rating) then
break
end
-- --- А. Формируем заголовок ---
if title then
if title_type == "0" or title_type == "7" then
table.insert(output, "; " .. title)
else
local level = tonumber(title_type) or 2
local eq = string.rep("=", level)
table.insert(output, eq .. " " .. title .. " " .. eq)
end
end
-- --- Б. Формируем текстовый блок ---
if text then
table.insert(output, text)
end
-- --- В. Отрисовка рейтинга (Задел на будущее) ---
if rating then
table.insert(output, "''Здесь будет таблица рейтинга: " .. rating .. "''")
end
-- --- Г. Формируем турнирную таблицу (Группа или Плей-офф) ---
if table_id then
local db_node = tour_data[table_id]
if not db_node then
table.insert(output, '<strong class="error">Ошибка: Массив ' .. table_id .. ' не найден в БД.</strong>')
else
local t_args = {} -- Таблица аргументов, которую мы передадим в MatchTable
-- =====================
-- ОБРАБОТКА ГРУППЫ
-- =====================
if db_node.type == "group" then
t_args.number_of_rounds = db_node.number_of_rounds or 1
t_args.compact = (compact == "yes" or compact == "true")
local team_map = {} -- Карта: Код команды -> Порядковый номер (ID)
-- 1. Сборка standings (команды и цвета)
for idx, st in ipairs(db_node.standings) do
local code = st[1]
local color_code = st[2]
team_map[code] = idx
t_args['team' .. idx] = code
local style = COLORS[color_code]
if style then
t_args['color' .. idx] = style.c
if style.b then t_args['bold' .. idx] = true end
end
end
-- 2. Сборка матчей
for _, m in ipairs(db_node.matches) do
local id_home = team_map[m[1]]
local id_away = team_map[m[2]]
if id_home and id_away then
local g1 = m[3]
local g2 = m[4]
-- Защита от несыгранных матчей (nil)
if g1 ~= nil and g2 ~= nil then
local score_str = tostring(g1) .. ":" .. tostring(g2)
-- Проверяем наличие ссылки
local link_val = cleanParam(args['link' .. i .. '_' .. id_home .. '_' .. id_away])
if link_val then
score_str = "[[" .. link_val .. "|" .. score_str .. "]]"
end
t_args['score' .. id_home .. '_' .. id_away] = score_str
end
end
end
-- Генерируем таблицу
table.insert(output, matchTable._group(t_args))
-- =====================
-- ОБРАБОТКА ПЛЕЙ-ОФФ
-- =====================
elseif db_node.type == "knockout" then
t_args.number_of_strings = #db_node.matches
for k, m in ipairs(db_node.matches) do
local t1, t2, g1, g2, flag, p1, p2, c_code1, c_code2 = unpack(m)
t_args['s' .. k .. '_team1'] = t1
t_args['s' .. k .. '_team2'] = t2
-- Формируем счет с защитой от nil (если матч не сыгран)
if g1 ~= nil and g2 ~= nil then
local score_str = tostring(g1) .. ":" .. tostring(g2)
if flag == "aet" then
score_str = score_str .. "(ET)"
elseif flag == "pen" then
score_str = score_str .. "(пен." .. tostring(p1) .. ":" .. tostring(p2) .. ")"
end
-- Проверяем ссылку
local link_val = cleanParam(args['link' .. i .. '_' .. k]) or (k == 1 and cleanParam(args['link' .. i]))
if link_val then
score_str = "[[" .. link_val .. "|" .. score_str .. "]]"
end
t_args['s' .. k .. '_score'] = score_str
end
-- Распаковываем цвета
local style1 = COLORS[c_code1]
if style1 then
t_args['s' .. k .. '_color1'] = style1.c
if style1.b then t_args['s' .. k .. '_bold1'] = true end
end
local style2 = COLORS[c_code2]
if style2 then
t_args['s' .. k .. '_color2'] = style2.c
if style2.b then t_args['s' .. k .. '_bold2'] = true end
end
end
-- Генерируем таблицу
table.insert(output, matchTable._playoff(t_args))
end
end
end
-- --- Д. Примечание ---
if ref then
table.insert(output, "<small>" .. ref .. "</small>")
end
-- Отбивка между блоками
table.insert(output, "")
end
-- Склеиваем массив в единый текст с переносами строк
return table.concat(output, "\n")
end
return p