ЧТМ:Центр управления модулями/скрипт сбора статистики турниров: различия между версиями

м Burato переименовал страницу Участник:Burato/скрипт в ЧТМ:ЧТМ:Центр управления модулями/скрипт сбора статистики турниров без оставления перенаправления
м Замена текста — «lang="py">» на «lang="python" line>»
 
(не показаны 3 промежуточные версии 2 участников)
Строка 1: Строка 1:
<syntaxhighlight lang="py>import re
<syntaxhighlight lang="python" line>import re


# ==========================================
# ==========================================
Строка 5: Строка 5:
# ==========================================
# ==========================================
TOURNAMENT = "ЧТМ" # Укажите название турнира
TOURNAMENT = "ЧТМ" # Укажите название турнира
YEAR = "2042"      # Укажите год
YEAR = "2046"      # Укажите год
IS_QUALIFICATION = True  # True = Квалификация (_Qual), False = Финальный турнир
IS_QUALIFICATION = True  # True = Квалификация (_Qual), False = Финальный турнир


# ==========================================
# ==========================================
# 2. ВСТАВЬТЕ ВАШ ТЕКСТ СЮДА
# 2. ВСТАВЬТЕ ВАШ ТЕКСТ ИЗ ВИКИПЕДИИ СЮДА
# ==========================================
# ==========================================
DATA = """
DATA = """
Строка 29: Строка 29:


STAGE_MAP = {
STAGE_MAP = {
    "Квалификация": "Qualification",
     "Первый тур": "Stage1",
     "Первый тур": "Stage1",
     "Второй тур": "Stage2",
     "Второй тур": "Stage2",
Строка 35: Строка 36:
     "1/8 финала": "8thfinal",
     "1/8 финала": "8thfinal",
     "1/4 финала": "Quarterfinal",
     "1/4 финала": "Quarterfinal",
    "Четвертьфиналы": "Quarterfinal",
    "Четвертьфинал": "Quarterfinal",
     "Полуфиналы": "Semifinal",
     "Полуфиналы": "Semifinal",
     "Полуфинал": "Semifinal",
     "Полуфинал": "Semifinal",
Строка 40: Строка 43:
     "Финал": "Final"
     "Финал": "Final"
}
}
CONFED_MAP = {
    "Южная Америка": "SouthAmerica",
    "Северная Америка": "NorthAmerica",
    "Америка": "America",
    "Евразия": "Eurasia",
    "Африка": "Africa",
    "Океания": "Oceania",
    "Европа": "Europe",
    "Азия": "Asia"
}
# Сортируем ключи по длине (по убыванию), чтобы Южная Америка проверялась раньше Америки
CONFED_KEYS = sorted(CONFED_MAP.keys(), key=len, reverse=True)


def parse_score(score_str, team1, team2, c1, c2, venue, is_second_leg=False):
def parse_score(score_str, team1, team2, c1, c2, venue, is_second_leg=False):
Строка 68: Строка 84:
     out = []
     out = []
      
      
    # Определяем название корневого ключа
     tournament_key = f"{TOURNAMENT}_{YEAR}"
     tournament_key = f"{TOURNAMENT}_{YEAR}"
     if IS_QUALIFICATION:
     if IS_QUALIFICATION:
Строка 77: Строка 92:
     current_round = ""
     current_round = ""
     current_stage = ""
     current_stage = ""
    current_confed = ""
   
     is_add_matches = False
     is_add_matches = False
     is_neutral_global = False
     is_neutral_global = False
Строка 96: Строка 113:
         out.append(f'        ["{key}"] = {{')
         out.append(f'        ["{key}"] = {{')
         out.append('            type = "group",')
         out.append('            type = "group",')
        if current_confed:
            out.append(f'            confederation = "{current_confed}",')
           
         out.append('            standings = {')
         out.append('            standings = {')
         for tm, col in zip(group_teams, group_colors):
         for tm, col in zip(group_teams, group_colors):
Строка 129: Строка 149:
         out.append(f'        ["{key}"] = {{')
         out.append(f'        ["{key}"] = {{')
         out.append('            type = "knockout",')
         out.append('            type = "knockout",')
        if current_confed:
            out.append(f'            confederation = "{current_confed}",')
           
         out.append('            matches = {')
         out.append('            matches = {')
         for m in knockout_matches:
         for m in knockout_matches:
Строка 139: Строка 162:
         if not line: continue
         if not line: continue
          
          
         # ЗАЩИТА ОТ "ПРИЛИПШИХ" СКОБОК (исправление вашего бага)
         # Защита от прилипших скобок
         close_table_now = False
         close_table_now = False
         if line.endswith("}}"):
         if line.endswith("}}"):
             close_table_now = True
             close_table_now = True
             line = line[:-2].strip() # отрезаем }} с конца строки
             line = line[:-2].strip()
              
              
        # Если строка состояла только из }}, теперь она пустая — закрываем таблицу и идём дальше
         if not line and close_table_now:
         if not line and close_table_now:
             if in_group: flush_group()
             if in_group: flush_group()
Строка 153: Строка 175:
             continue
             continue


        # Проверка нейтрального поля
         if "нейтральном поле" in line.lower() or "на нейтральном" in line.lower():
         if "нейтральном поле" in line.lower() or "на нейтральном" in line.lower():
             is_neutral_global = True
             is_neutral_global = True


        # СМЕНА РАУНДА
         m_round = re.match(r'===\s*(.+?)\s*===', line)
         m_round = re.match(r'===\s*(.+?)\s*===', line)
         if m_round:
         if m_round:
Строка 163: Строка 187:
             current_round = ROUND_MAP.get(raw_round, "Round")
             current_round = ROUND_MAP.get(raw_round, "Round")
             is_add_matches = False
             is_add_matches = False
            current_confed = "" # Сбрасываем конфедерацию при новом раунде
             if current_round in ["Playoffs", "AddTournament", "Qual"]:
             if current_round in ["Playoffs", "AddTournament", "Qual"]:
                 current_stage = current_round
                 current_stage = current_round
                 current_round = ""
                 current_round = ""
             continue
             continue
        # ПОИСК КОНФЕДЕРАЦИИ (только если мы не внутри таблицы)
        if not in_group and not in_knockout:
            for ck in CONFED_KEYS:
                if ck in line:
                    current_confed = CONFED_MAP[ck]
                    break  # Если нашли длинное имя (например Южная Америка), дальше не ищем


         if "; Дополнительные матчи" in line:
         if "; Дополнительные матчи" in line:
Строка 172: Строка 204:
             continue
             continue


        # СМЕНА СТАДИИ / ГРУППЫ
         m_stage = re.match(r';:?\s*(.+)', line)
         m_stage = re.match(r';:?\s*(.+)', line)
         if m_stage and "Дополнительные" not in m_stage.group(1):
         if m_stage and "Дополнительные" not in m_stage.group(1):
Строка 184: Строка 217:
             continue
             continue


        # НАЧАЛО ТАБЛИЦЫ ГРУППЫ
         m_g_start = re.search(r'\{\{Группа\s*\d+-А(\d)', line)
         m_g_start = re.search(r'\{\{Группа\s*\d+-А(\d)', line)
         if m_g_start:
         if m_g_start:
Строка 190: Строка 224:
             continue
             continue
              
              
        # НАЧАЛО ТАБЛИЦЫ ПЛЕЙ-ОФФ
         if re.search(r'\{\{И\d+', line):
         if re.search(r'\{\{И\d+', line):
             in_knockout = True
             in_knockout = True
             continue
             continue


        # ПАРСИНГ СТРОКИ ГРУППЫ
         if in_group:
         if in_group:
             m_row = re.match(r'^([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|(.*?)\|*$', line)
             m_row = re.match(r'^([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|(.*?)\|*$', line)
Строка 203: Строка 239:
                 group_matrix.append(scores)
                 group_matrix.append(scores)


        # ПАРСИНГ СТРОКИ ПЛЕЙ-ОФФ
         if in_knockout:
         if in_knockout:
             m_ko = re.match(r'^\|?([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|([^\|]+)\|([А-ЯЁ]{3})\|([A-Z-a-z]{1,2})', line)
             m_ko = re.match(r'^\|?([A-Za-z]{1,2})\|([А-ЯЁ]{3})\|([^\|]+)\|([А-ЯЁ]{3})\|([A-Z-a-z]{1,2})', line)
Строка 216: Строка 253:
                         knockout_matches.append(parsed_leg)
                         knockout_matches.append(parsed_leg)


         # Если в конце этой строки были }}, закрываем всё
         # КОНЕЦ ТАБЛИЦЫ (если скобки были прилипшими к последней строке)
         if close_table_now:
         if close_table_now:
             if in_group: flush_group()
             if in_group: flush_group()
Строка 233: Строка 270:


if __name__ == "__main__":
if __name__ == "__main__":
     main()"</syntaxhighlight>
     main()</syntaxhighlight>