Модуль:FetchData3: відмінності між версіями
Admin (обговорення | внесок) Немає опису редагування |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 81: | Рядок 81: | ||
return nil, error_output("Player Not Found", player_name) | return nil, error_output("Player Not Found", player_name) | ||
end | end | ||
| Рядок 170: | Рядок 91: | ||
if not name or name == "" then | if not name or name == "" then | ||
return error_output("No Player Name", "") | return error_output("No Player Name", "") | ||
end | end | ||
-- Отримуємо дані з таблиці "Призові" | -- Отримуємо дані з таблиці "Призові" | ||
local prize_data = get_player_row("Призові", name) | local prize_data, err = get_player_row("Призові", name) | ||
if not prize_data then | |||
return err or "''Відсутні''" | |||
if prize_data then | |||
end | end | ||
local results = {} | local results = {} | ||
-- Пропускаємо першу колонку (ім'я гравця) | -- Пропускаємо першу колонку (ім'я гравця) | ||
for i = 2, # | for i = 2, #prize_data.cells do | ||
local | local prize_value = prize_data.cells[i] | ||
local header = | local header = prize_data.headers[i] | ||
if | if prize_value and prize_value ~= "" and prize_value ~= "-" and header then | ||
local | -- Видаляємо символ ₴ якщо він вже є | ||
local clean_prize = mw.ustring.gsub(prize_value, "₴", "") | |||
clean_prize = mw.text.trim(clean_prize) | |||
-- Перевіряємо чи це число більше 0 | |||
if clean_prize ~= "0" then | |||
table.insert(results, { | table.insert(results, { | ||
tournament = header, | |||
prize = clean_prize .. " ₴" | |||
tournament = | |||
prize = | |||
}) | }) | ||
end | end | ||
| Рядок 281: | Рядок 128: | ||
local table_html = { | local table_html = { | ||
'{| class="wikitable sortable" style="width: calc(100% - 470px);"', | '{| class="wikitable sortable" style="width: calc(100% - 470px);"', | ||
' | '! Турнір !! Призові', | ||
'|-' | '|-' | ||
} | } | ||
| Рядок 287: | Рядок 134: | ||
for _, result in ipairs(results) do | for _, result in ipairs(results) do | ||
table.insert(table_html, string.format( | table.insert(table_html, string.format( | ||
'| style="text-align:left;" | %s | '| style="text-align:left;" | [[%s]] || style="text-align:right;" | %s', | ||
result.tournament, | result.tournament, | ||
result.prize | result.prize | ||
Версія за 13:41, 27 листопада 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
----------------------------------------------------------------------
-- ГОЛОВНА ФУНКЦІЯ ДЛЯ ОТРИМАННЯ ТИТУЛІВ У ВИГЛЯДІ ТАБЛИЦІ
----------------------------------------------------------------------
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