Документацію для цього модуля можна створити у Модуль: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