Модуль:FetchData3: відмінності між версіями
Admin (обговорення | внесок) (Створена сторінка: 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)...) |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 30: | Рядок 30: | ||
-- Знаходимо заголовки | -- Знаходимо заголовки | ||
local header_row = mw.ustring.match(table_content, "!\n | local header_row = mw.ustring.match(table_content, "!%s*([^\n]+)\n|-") | ||
if not header_row then | if not header_row then | ||
return nil, error_output("Headers Missing", page_title) | return nil, error_output("Headers Missing", page_title) | ||
| Рядок 36: | Рядок 36: | ||
local headers = {} | local headers = {} | ||
for header in mw.ustring.gmatch(header_row, " | -- Видаляємо початковий пробіл та розділяємо по || | ||
header_row = mw.text.trim(header_row) | |||
for header in mw.ustring.gmatch(header_row, "([^!]+)") do | |||
local trimmed = mw.text.trim(header) | |||
if trimmed ~= "" then | |||
table.insert(headers, trimmed) | |||
end | |||
end | end | ||
Версія за 01:36, 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 header_row = mw.ustring.match(table_content, "!%s*([^\n]+)\n|-")
if not header_row then
return nil, error_output("Headers Missing", page_title)
end
local headers = {}
-- Видаляємо початковий пробіл та розділяємо по ||
header_row = mw.text.trim(header_row)
for header in mw.ustring.gmatch(header_row, "([^!]+)") do
local trimmed = mw.text.trim(header)
if trimmed ~= "" then
table.insert(headers, trimmed)
end
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" then
return "[[Файл:Star.png|Найкращий]]"
else
return ""
end
end
--- Генерує посилання на турнір
local function get_tournament_link(header_name)
-- Видаляємо (фінал) та (рейтинг) для посилання
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]]", clean_name, 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 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