Участник:Гиперболоид инженера Мошонкина/скрипт: различия между версиями
Перейти к навигации
Перейти к поиску
Нет описания правки |
LeStar (обсуждение | вклад) м LeStar переименовал страницу Участник:Гиперболоид инженера Мошонкина/черновик в Участник:Гиперболоид инженера Мошонкина/скрипт |
(нет различий)
| |
Версия от 15:59, 21 апреля 2026
import re
def convert_to_lua(wiki_text):
lua_output = ["return {", ' ["Tournament_Data"] = {']
# --- 1. Парсинг групп ---
# Регулярка ищет опциональный заголовок (; Группа X), количество команд, формат (А1/А2) и всё тело шаблона
group_pattern = re.compile(
r'(?:;\s*Группа\s+([^\n]+)\s*)?\{\{Группа\s+(\d+)-А(\d+)\s*\|?(.*?)\}\}',
re.IGNORECASE | re.DOTALL
)
group_counter = 1
for match in group_pattern.finditer(wiki_text):
group_name = match.group(1).strip() if match.group(1) else f"Unnamed_{group_counter}"
group_counter += 1
num_teams = int(match.group(2))
legs_indicator = int(match.group(3))
leg_val = 1 if legs_indicator == 2 else 0 # 1 - два круга, 0 - один
body = match.group(4)
# Разбиваем по пайпу и удаляем пустые элементы
parts = [p.strip() for p in body.split('|') if p.strip()]
teams = []
chunk_size = num_teams + 1
# Формируем данные команд
for i in range(num_teams):
chunk = parts[i * chunk_size : (i + 1) * chunk_size]
if not chunk: continue
status = chunk[0].replace('LY', 'L')
name = chunk[1]
scores = chunk[2:]
teams.append({"name": name, "status": status, "scores": scores})
# Записываем в формат Lua
lua_output.append(f'\n ["Group_{group_name}"] = {{')
lua_output.append(' type = "group",')
lua_output.append(' standings = {')
for t in teams:
lua_output.append(f' {{"{t["name"]}", "{t["status"]}"}},')
lua_output.append(' },')
lua_output.append(' matches = {')
# Распределяем матчи
for i, team in enumerate(teams):
score_idx = 0
for j, opp in enumerate(teams):
if i == j: continue # Команда не играет сама с собой
if score_idx < len(team["scores"]):
score_str = team["scores"][score_idx]
score_idx += 1
if ':' in score_str:
g1, g2 = score_str.split(':')
lua_output.append(f' {{"{team["name"]}", "{opp["name"]}", {g1.strip()}, {g2.strip()}, {leg_val}}},')
lua_output.append(' }')
lua_output.append(' },')
# --- 2. Парсинг матчей на вылет ---
# Ищет шаблоны И1, И2, И4, И7 и т.д.
knockout_pattern = re.compile(r'\{\{И\d+\s*\|?(.*?)\}\}', re.IGNORECASE | re.DOTALL)
ko_counter = 1
for match in knockout_pattern.finditer(wiki_text):
body = match.group(1)
parts = [p.strip() for p in body.split('|') if p.strip()]
lua_output.append(f'\n ["Knockout_Stage_{ko_counter}"] = {{')
lua_output.append(' type = "knockout",')
lua_output.append(' matches = {')
ko_counter += 1
# Массив бьется по 5 элементов: Статус1, Команда1, Счёт, Команда2, Статус2
for i in range(0, len(parts), 5):
chunk = parts[i:i+5]
if len(chunk) < 5: continue
st1 = chunk[0].replace('LY', 'L')
t1 = chunk[1]
score_str = chunk[2]
t2 = chunk[3]
st2 = chunk[4].replace('LY', 'L')
# Проверяем, сколько кругов (есть запятая = два круга)
leg_val = 1 if ',' in score_str else 0
mod = "nil"
p1, p2 = "nil", "nil"
base_scores = score_str
# Парсинг доп. времени и пенальти
if '(' in score_str:
base_scores, ext = score_str.split('(', 1)
ext = ext.replace(')', '').strip().lower()
if 'et' in ext:
mod = '"aet"'
elif 'пен' in ext:
mod = '"pen"'
pen_match = re.search(r'(\d+):(\d+)', ext)
if pen_match:
p1, p2 = pen_match.groups()
# Считаем общую сумму голов (если матча было два)
g1, g2 = 0, 0
for pair in base_scores.split(','):
if ':' in pair:
s1, s2 = pair.split(':')
g1 += int(s1.strip())
g2 += int(s2.strip())
# Собираем строку
lua_output.append(
f' {{"{t1}", "{t2}", {g1}, {g2}, {mod}, {p1}, {p2}, "{st1}", "{st2}", {leg_val}}},'
)
lua_output.append(' }')
lua_output.append(' },')
lua_output.append(" }")
lua_output.append("}")
return "\n".join(lua_output)
# --- ЗАПУСК ---
if __name__ == "__main__":
# Сюда вставляй свой вики-код
data = """
; Группа B
{{Группа 4-А2
|Y|БАГ|5:1|4:0|3:2
|R|СКН|1:5|5:1|4:1
|R|АВИ|0:2|3:0|0:0
|R|ГАЛ|3:1|1:1|4:6
}}
; Группа C
{{Группа 3-А2
|Y|ПУЭ|0:0|4:1
|R|КОК|0:0|1:0
|R|ГРЛ|2:4|1:1}}
{{И4
|LY|КОМ|2:0|ЛЕС|R
|R|ГОН|0:2|СИН|LY
|LY|МРТ|4:1(ET)|ПАЛ|R
|LY|ГАМ|1:0|ЭКВ|R
}}
{{И7
|LY|ДРЕ|1:2, 1:3|ГАЙ|G
|LY|НИК|2:1, 1:2(пен. 3:4)|ГУА|G
|G|ПАК|5:2, 2:2|АНТ|LY
|LY|ТАИ|3:3, 1:4|СОМ|G
|G|ЭРИ|1:1, 3:1(ET)|АЛЯ|LY
|LY|БРУ|0:1, 0:3|БЕН|G
|G|ГРЕ|3:0, 1:1|БЕЛ|LY
}}
"""
result = convert_to_lua(data)
# Сохранить в файл (или можно просто вывести в консоль print(result))
with open("output.lua", "w", encoding="utf-8") as f:
f.write(result)
print("Код успешно сгенерирован и сохранён в файл output.lua")