Документацію для цього модуля можна створити у Модуль: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
----------------------------------------------------------------------
-- ГОЛОВНА ФУНКЦІЯ ДЛЯ ОТРИМАННЯ ТИТУЛІВ У ВИГЛЯДІ ТАБЛИЦІ
----------------------------------------------------------------------
function p.titles(frame)
local name = frame.args.player
if not name or name == "" then
return error_output("No Player Name", "")
end
-- Отримуємо дані з таблиці "Призові"
local prize_data, err = get_player_row("Призові", name)
if not prize_data then
return err or "''Відсутні''"
end
local results = {}
-- Пропускаємо першу колонку (ім'я гравця)
for i = 2, #prize_data.cells do
local prize_value = prize_data.cells[i]
local header = prize_data.headers[i]
if prize_value and prize_value ~= "" and prize_value ~= "-" and header then
-- Видаляємо символ ₴ якщо він вже є
local clean_prize = mw.ustring.gsub(prize_value, "₴", "")
clean_prize = mw.text.trim(clean_prize)
-- Перевіряємо чи це число більше 0
if clean_prize ~= "0" then
table.insert(results, {
tournament = header,
prize = clean_prize .. " ₴"
})
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:right;" | %s',
result.tournament,
result.prize
))
table.insert(table_html, '|-')
end
table.insert(table_html, '|}')
return table.concat(table_html, '\n')
end
return p