Модуль:FetchData3: відмінності між версіями
Admin (обговорення | внесок) Немає опису редагування Мітка: Ручний відкіт |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 32: | Рядок 32: | ||
-- Отримуємо заголовки (перший рядок після {|) | -- Отримуємо заголовки (перший рядок після {|) | ||
local headers = {} | local headers = {} | ||
local first_row = mw.ustring. | local first_row = nil | ||
-- Шукаємо рядок з заголовками | |||
for line in mw.ustring.gmatch(table_content, "([^\n]+)") do | |||
if mw.ustring.match(line, "^!") then | |||
first_row = line | |||
break | |||
end | |||
end | |||
if first_row then | if first_row then | ||
-- Розбиваємо | -- Замінюємо на пробіли | ||
for header in mw.ustring.gmatch(first_row, "([^ | first_row = mw.ustring.gsub(first_row, " ", " ") | ||
-- Розбиваємо по ! або !! | |||
for header in mw.ustring.gmatch(first_row, "!+%s*([^!]+)") do | |||
local trimmed = mw.text.trim(header) | local trimmed = mw.text.trim(header) | ||
if trimmed ~= "" then | if trimmed ~= "" then | ||
| Рядок 85: | Рядок 96: | ||
--- Генерує іконку медалі | --- Генерує іконку медалі | ||
local function get_medal_icon(value) | local function get_medal_icon(value) | ||
if not value or value == "" or value == " " then | if not value or value == "" or value == " " then | ||
return nil | return nil | ||
end | end | ||
value = mw.text.trim(value) | value = mw.text.trim(value) | ||
| Рядок 130: | Рядок 139: | ||
--- Генерує посилання на турнір | --- Генерує посилання на турнір | ||
local function get_tournament_link(header_name) | local function get_tournament_link(header_name) | ||
local season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(фінал%)") | local season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(фінал%)") | ||
if not season_num then | if not season_num then | ||
| Рядок 137: | Рядок 145: | ||
if season_num then | if season_num then | ||
local season_map = { | local season_map = { | ||
["Перший"] = 1, ["Другий"] = 2, ["Третій"] = 3, | ["Перший"] = 1, ["Другий"] = 2, ["Третій"] = 3, | ||
| Рядок 148: | Рядок 155: | ||
local roman = to_roman(season_number) | local roman = to_roman(season_number) | ||
local type_text = "" | local type_text = "" | ||
if mw.ustring.find(header_name, "фінал") then | if mw.ustring.find(header_name, "фінал") then | ||
| Рядок 156: | Рядок 162: | ||
end | end | ||
local clean_name = mw.ustring.gsub(header_name, "%s*%(фінал%)%s*", "") | local clean_name = mw.ustring.gsub(header_name, "%s*%(фінал%)%s*", "") | ||
clean_name = mw.ustring.gsub(clean_name, "%s*%(рейтинг%)%s*", "") | clean_name = mw.ustring.gsub(clean_name, "%s*%(рейтинг%)%s*", "") | ||
| Рядок 165: | Рядок 170: | ||
end | end | ||
return string.format("[[%s]]", header_name) | return string.format("[[%s]]", header_name) | ||
end | end | ||
| Рядок 186: | Рядок 190: | ||
-- Отримуємо дані з таблиці "Призовий_фонд" | -- Отримуємо дані з таблиці "Призовий_фонд" | ||
local prize_data | local prize_data = get_player_row("Призовий_фонд", name) | ||
-- Створюємо мапу призових | |||
local prize_map = {} | |||
if prize_data then | |||
for j = 1, #prize_data.headers do | |||
local header = prize_data.headers[j] | |||
local value = prize_data.cells[j] or "" | |||
prize_map[header] = value | |||
end | |||
end | |||
-- Мапа дат турнірів | -- Мапа дат турнірів | ||
local tournament_dates = { | local tournament_dates = { | ||
["Перший сезон"] = " | ["Перший сезон"] = "09.09.2023", | ||
["Другий сезон"] = " | ["Другий сезон"] = "28.10.2023", | ||
["Третій сезон"] = " | ["Третій сезон"] = "23.12.2023", | ||
["Четвертий сезон"] = " | ["Четвертий сезон"] = "10.02.2024", | ||
["П'ятий сезон"] = " | ["П'ятий сезон"] = "06.04.2024", | ||
["Шостий сезон"] = " | ["Шостий сезон"] = "11.05.2024", | ||
["Сьомий сезон"] = " | ["Сьомий сезон"] = "06.07.2024", | ||
["Восьмий сезон"] = " | ["Восьмий сезон"] = "10.08.2024", | ||
["Дев'ятий сезон"] = "28. | ["Дев'ятий сезон"] = "28.09.2024", | ||
["Mafia Closed Cup I"] = " | ["Mafia Closed Cup I"] = "12.11.2023", | ||
["Mafia Closed Cup I Online"] = "01 | ["Mafia Closed Cup I Online"] = "28.01.2024", | ||
["Фінал Року"] = " | ["Фінал Року"] = "13.10.2024" | ||
} | } | ||
| Рядок 215: | Рядок 229: | ||
if medal then | if medal then | ||
-- | -- Прибираємо (фінал)/(рейтинг) для пошуку призових | ||
local clean_header = mw.ustring.gsub(header, "%s*%(фінал%)%s*", "") | local clean_header = mw.ustring.gsub(header, "%s*%(фінал%)%s*", "") | ||
clean_header = mw.ustring.gsub(clean_header, "%s*%(рейтинг%)%s*", "") | clean_header = mw.ustring.gsub(clean_header, "%s*%(рейтинг%)%s*", "") | ||
clean_header = mw.text.trim(clean_header) | clean_header = mw.text.trim(clean_header) | ||
-- | -- Нормалізуємо апостроф | ||
clean_header = mw.ustring.gsub(clean_header, "'", "'") | |||
-- Шукаємо призові | |||
local prize_value = prize_map[clean_header] | |||
if not prize_value then | |||
clean_header = mw.ustring.gsub(clean_header, "'", "'") | |||
prize_value = prize_map[clean_header] | |||
end | |||
local prize_amount = "0 ₴" | local prize_amount = "0 ₴" | ||
if | if prize_value and prize_value ~= "" and prize_value ~= "-" and prize_value ~= "0" then | ||
prize_amount = prize_value .. " ₴" | |||
end | end | ||
-- | -- Дата турніру | ||
local date = tournament_dates[clean_header] or "01.01.2023" | local date = tournament_dates[clean_header] or "01.01.2023" | ||
-- | -- Посилання на турнір | ||
local tournament_link = get_tournament_link(header) | local tournament_link = get_tournament_link(header) | ||
| Рядок 244: | Рядок 258: | ||
local place_text = "" | local place_text = "" | ||
if cell_value == "1" then | if cell_value == "1" then | ||
place_text = "1-е | place_text = "1-е" | ||
elseif cell_value == "2" then | elseif cell_value == "2" then | ||
place_text = "2-е | place_text = "2-е" | ||
elseif cell_value == "3" then | elseif cell_value == "3" then | ||
place_text = "3-є | place_text = "3-є" | ||
elseif cell_value == "4" then | elseif cell_value == "4" then | ||
place_text = " | place_text = "Участь" | ||
elseif cell_value == "S" or mw.ustring.match(cell_value, "^S%d") then | elseif cell_value == "S" or mw.ustring.match(cell_value, "^S%d") then | ||
place_text = " | place_text = "Кращий" | ||
end | end | ||
Версія за 17:49, 26 листопада 2025
Документацію для цього модуля можна створити у Модуль:FetchData3/документація
local p = {}
--- Функція для виведення помилки
local function error_output(context, error_details)
local safe_details = error_details or "N/A"
return string.format("<span style='color:red; font-weight:bold;'>[FD3 Error: %s. Details: %s]</span>",
context or "Unknown Context", safe_details)
end
--- Отримує заголовки та рядок гравця з таблиці
local function get_player_row(page_title, player_name)
local title = mw.title.new(page_title)
if not title or not title.exists then
return nil, error_output("Page Missing", page_title)
end
local content = title:getContent()
if not content then
return nil, error_output("Content Read Fail", page_title)
end
-- Знаходимо таблицю
local table_start = mw.ustring.find(content, "{|")
local table_end = mw.ustring.find(content, "|}", table_start)
if not table_start or not table_end then
return nil, error_output("Table Missing", page_title)
end
local table_content = mw.ustring.sub(content, table_start, table_end + 1)
-- Отримуємо заголовки (перший рядок після {|)
local headers = {}
local first_row = nil
-- Шукаємо рядок з заголовками
for line in mw.ustring.gmatch(table_content, "([^\n]+)") do
if mw.ustring.match(line, "^!") then
first_row = line
break
end
end
if first_row then
-- Замінюємо на пробіли
first_row = mw.ustring.gsub(first_row, " ", " ")
-- Розбиваємо по ! або !!
for header in mw.ustring.gmatch(first_row, "!+%s*([^!]+)") do
local trimmed = mw.text.trim(header)
if trimmed ~= "" then
table.insert(headers, trimmed)
end
end
end
if #headers == 0 then
return nil, error_output("No Headers Found", page_title)
end
-- Шукаємо рядок з гравцем
local escaped = mw.ustring.gsub(player_name, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1")
local player_pattern = "%[%[" .. escaped .. "%]%]"
-- Збираємо всі рядки
local rows = {}
for row in mw.ustring.gmatch(table_content, "|-\n(.-)\n|-") do
table.insert(rows, row)
end
local last_row = mw.ustring.match(table_content, "|-\n(.-)%s*|}")
if last_row then
table.insert(rows, last_row)
end
-- Обробляємо кожен рядок
for _, row in ipairs(rows) do
if mw.ustring.find(row, player_pattern) then
local cells = {}
row = mw.ustring.gsub(row, "^%s*|%s*", "")
for cell in mw.ustring.gmatch(row, "([^|]+)") do
local trimmed = mw.text.trim(cell)
if trimmed ~= "" then
table.insert(cells, trimmed)
end
end
return {headers = headers, cells = cells}
end
end
return nil, error_output("Player Not Found", player_name)
end
--- Генерує іконку медалі
local function get_medal_icon(value)
if not value or value == "" or value == " " then
return nil
end
value = mw.text.trim(value)
if value == "" then
return nil
elseif value == "1" then
return "[[Файл:Gold.png|1-е Місце]]"
elseif value == "2" then
return "[[Файл:Silver.png|2-е Місце]]"
elseif value == "3" then
return "[[Файл:Bronze.png|3-е Місце]]"
elseif value == "4" then
return "[[Файл:Finalist.png|Фіналіст]]"
elseif value == "S" or mw.ustring.match(value, "^S%d") then
return "[[Файл:Star.png|Найкращий]]"
else
return nil
end
end
--- Конвертує число в римські цифри
local function to_roman(num)
local romans = {
{1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
{100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},
{10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
}
local result = ""
for _, pair in ipairs(romans) do
local value, letter = pair[1], pair[2]
while num >= value do
result = result .. letter
num = num - value
end
end
return result
end
--- Генерує посилання на турнір
local function get_tournament_link(header_name)
local season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(фінал%)")
if not season_num then
season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(рейтинг%)")
end
if season_num then
local season_map = {
["Перший"] = 1, ["Другий"] = 2, ["Третій"] = 3,
["Четвертий"] = 4, ["П'ятий"] = 5, ["Шостий"] = 6,
["Сьомий"] = 7, ["Восьмий"] = 8, ["Дев'ятий"] = 9
}
local season_number = season_map[season_num]
if season_number then
local roman = to_roman(season_number)
local type_text = ""
if mw.ustring.find(header_name, "фінал") then
type_text = "Фінал."
elseif mw.ustring.find(header_name, "рейтинг") then
type_text = "Рейтинг."
end
local clean_name = mw.ustring.gsub(header_name, "%s*%(фінал%)%s*", "")
clean_name = mw.ustring.gsub(clean_name, "%s*%(рейтинг%)%s*", "")
clean_name = mw.text.trim(clean_name)
return string.format("[[%s|%s сезон. %s]]", clean_name, roman, type_text)
end
end
return string.format("[[%s]]", header_name)
end
----------------------------------------------------------------------
-- ГОЛОВНА ФУНКЦІЯ ДЛЯ ОТРИМАННЯ ТИТУЛІВ У ВИГЛЯДІ ТАБЛИЦІ
----------------------------------------------------------------------
function p.titles(frame)
local name = frame.args.player
if not name or name == "" then
return error_output("No Player Name", "")
end
-- Отримуємо дані з таблиці "Титули"
local titles_data, err1 = get_player_row("Титули", name)
if not titles_data then
return err1 or "''Відсутні''"
end
-- Отримуємо дані з таблиці "Призовий_фонд"
local prize_data = get_player_row("Призовий_фонд", name)
-- Створюємо мапу призових
local prize_map = {}
if prize_data then
for j = 1, #prize_data.headers do
local header = prize_data.headers[j]
local value = prize_data.cells[j] or ""
prize_map[header] = value
end
end
-- Мапа дат турнірів
local tournament_dates = {
["Перший сезон"] = "09.09.2023",
["Другий сезон"] = "28.10.2023",
["Третій сезон"] = "23.12.2023",
["Четвертий сезон"] = "10.02.2024",
["П'ятий сезон"] = "06.04.2024",
["Шостий сезон"] = "11.05.2024",
["Сьомий сезон"] = "06.07.2024",
["Восьмий сезон"] = "10.08.2024",
["Дев'ятий сезон"] = "28.09.2024",
["Mafia Closed Cup I"] = "12.11.2023",
["Mafia Closed Cup I Online"] = "28.01.2024",
["Фінал Року"] = "13.10.2024"
}
local results = {}
-- Пропускаємо першу колонку (ім'я гравця)
for i = 2, #titles_data.cells do
local cell_value = titles_data.cells[i]
local header = titles_data.headers[i]
if cell_value and cell_value ~= "" and cell_value ~= "-" and header then
local medal = get_medal_icon(cell_value)
if medal then
-- Прибираємо (фінал)/(рейтинг) для пошуку призових
local clean_header = mw.ustring.gsub(header, "%s*%(фінал%)%s*", "")
clean_header = mw.ustring.gsub(clean_header, "%s*%(рейтинг%)%s*", "")
clean_header = mw.text.trim(clean_header)
-- Нормалізуємо апостроф
clean_header = mw.ustring.gsub(clean_header, "'", "'")
-- Шукаємо призові
local prize_value = prize_map[clean_header]
if not prize_value then
clean_header = mw.ustring.gsub(clean_header, "'", "'")
prize_value = prize_map[clean_header]
end
local prize_amount = "0 ₴"
if prize_value and prize_value ~= "" and prize_value ~= "-" and prize_value ~= "0" then
prize_amount = prize_value .. " ₴"
end
-- Дата турніру
local date = tournament_dates[clean_header] or "01.01.2023"
-- Посилання на турнір
local tournament_link = get_tournament_link(header)
-- Текст місця
local place_text = ""
if cell_value == "1" then
place_text = "1-е"
elseif cell_value == "2" then
place_text = "2-е"
elseif cell_value == "3" then
place_text = "3-є"
elseif cell_value == "4" then
place_text = "Участь"
elseif cell_value == "S" or mw.ustring.match(cell_value, "^S%d") then
place_text = "Кращий"
end
table.insert(results, {
date = date,
place = place_text,
medal = medal,
tournament = tournament_link,
prize = prize_amount
})
end
end
end
if #results == 0 then
return "''Відсутні''"
end
-- Генеруємо таблицю
local table_html = {
'{| class="wikitable sortable" style="width: calc(100% - 470px);"',
'! Дата !! Місце !! Турнір !! Призові',
'|-'
}
for _, result in ipairs(results) do
table.insert(table_html, string.format(
'| style="text-align:left;" | %s || style="text-align:left;" | %s || style="text-align:left; padding-left:10px;" | %s %s || style="text-align:right;" | %s',
result.date,
result.place,
result.medal,
result.tournament,
result.prize
))
table.insert(table_html, '|-')
end
table.insert(table_html, '|}')
return table.concat(table_html, '\n')
end
return p