Модуль:FetchData3: відмінності між версіями
Admin (обговорення | внесок) Немає опису редагування |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 8: | Рядок 8: | ||
end | end | ||
--- Отримує рядок гравця з таблиці | --- Отримує заголовки та рядок гравця з таблиці | ||
local function get_player_row(page_title, player_name) | local function get_player_row(page_title, player_name) | ||
local title = mw.title.new(page_title) | local title = mw.title.new(page_title) | ||
| Рядок 20: | Рядок 20: | ||
end | end | ||
-- Знаходимо таблицю | |||
local table_start = mw.ustring.find(content, "{|") | local table_start = mw.ustring.find(content, "{|") | ||
local table_end = mw.ustring.find(content, "|}", table_start) | local table_end = mw.ustring.find(content, "|}", table_start) | ||
| Рядок 29: | Рядок 30: | ||
local table_content = mw.ustring.sub(content, table_start, table_end + 1) | local table_content = mw.ustring.sub(content, table_start, table_end + 1) | ||
-- | -- Отримуємо заголовки (перший рядок після {|) | ||
local | local headers = {} | ||
local first_row = mw.ustring.match(table_content, "{|[^\n]*\n!(.-)[\n]") | |||
if | if first_row then | ||
-- Розбиваємо заголовки по || | |||
for header in mw.ustring.gmatch(first_row, "([^|]+)") do | |||
local trimmed = mw.text.trim(header) | |||
if trimmed ~= "" then | |||
table.insert(headers, trimmed) | |||
end | |||
end | end | ||
end | end | ||
| Рядок 55: | Рядок 48: | ||
end | end | ||
-- Шукаємо рядок | -- Шукаємо рядок з гравцем | ||
local escaped = mw.ustring.gsub(player_name, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1") | local escaped = mw.ustring.gsub(player_name, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1") | ||
local player_pattern = "%[%[" .. escaped .. "%]%]" | local player_pattern = "%[%[" .. escaped .. "%]%]" | ||
-- Збираємо всі рядки | |||
local rows = {} | local rows = {} | ||
for row in mw.ustring.gmatch(table_content, "|-\n(.-)\n|-") do | for row in mw.ustring.gmatch(table_content, "|-\n(.-)\n|-") do | ||
| Рядок 69: | Рядок 63: | ||
end | end | ||
-- Обробляємо кожен рядок | |||
for _, row in ipairs(rows) do | for _, row in ipairs(rows) do | ||
if mw.ustring.find(row, player_pattern) then | if mw.ustring.find(row, player_pattern) then | ||
| Рядок 98: | Рядок 93: | ||
elseif value == "4" then | elseif value == "4" then | ||
return "[[Файл:Finalist.png|Фіналіст]]" | return "[[Файл:Finalist.png|Фіналіст]]" | ||
elseif value == "S" then | elseif value == "S" or mw.ustring.match(value, "^S%d") then | ||
return "[[Файл:Star.png|Найкращий]]" | return "[[Файл:Star.png|Найкращий]]" | ||
else | else | ||
| Рядок 107: | Рядок 102: | ||
--- Генерує посилання на турнір | --- Генерує посилання на турнір | ||
local function get_tournament_link(header_name) | local function get_tournament_link(header_name) | ||
-- Видаляємо ( | -- Видаляємо (Ф) та (Р) для відображення, але залишаємо для посилання | ||
local | local display_name = header_name | ||
local link_name = mw.ustring.gsub(header_name, "%s*%(Ф%)%s*", "") | |||
link_name = mw.ustring.gsub(link_name, "%s*%(Р%)%s*", "") | |||
link_name = mw.text.trim(link_name) | |||
return string.format("[[%s|%s]]", | -- Якщо назви однакові, просто посилання | ||
if link_name == display_name then | |||
return string.format("[[%s]]", link_name) | |||
else | |||
return string.format("[[%s|%s]]", link_name, display_name) | |||
end | |||
end | end | ||
Версія за 01:38, 24 листопада 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 = mw.ustring.match(table_content, "{|[^\n]*\n!(.-)[\n]")
if first_row then
-- Розбиваємо заголовки по ||
for header in mw.ustring.gmatch(first_row, "([^|]+)") 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 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 ""
end
end
--- Генерує посилання на турнір
local function get_tournament_link(header_name)
-- Видаляємо (Ф) та (Р) для відображення, але залишаємо для посилання
local display_name = header_name
local link_name = mw.ustring.gsub(header_name, "%s*%(Ф%)%s*", "")
link_name = mw.ustring.gsub(link_name, "%s*%(Р%)%s*", "")
link_name = mw.text.trim(link_name)
-- Якщо назви однакові, просто посилання
if link_name == display_name then
return string.format("[[%s]]", link_name)
else
return string.format("[[%s|%s]]", link_name, display_name)
end
end
----------------------------------------------------------------------
-- ГОЛОВНА ФУНКЦІЯ ДЛЯ ОТРИМАННЯ ТИТУЛІВ
----------------------------------------------------------------------
function p.titles(frame)
local name = frame.args.player
if not name or name == "" then
return error_output("No Player Name", "")
end
local data, err = get_player_row("Титули", name)
if not data then
return err or "Немає титулів"
end
local titles = {}
-- Пропускаємо першу колонку (ім'я гравця)
for i = 2, #data.cells do
local cell_value = data.cells[i]
if cell_value and cell_value ~= "" then
local medal = get_medal_icon(cell_value)
local tournament = get_tournament_link(data.headers[i])
if medal ~= "" then
table.insert(titles, string.format("* %s '''%s'''", medal, tournament))
end
end
end
if #titles == 0 then
return "''Відсутні''"
end
return table.concat(titles, "\n")
end
return p