diff --git a/mihomo_editor.py b/mihomo_editor.py index 7a56d8e..a7edae5 100644 --- a/mihomo_editor.py +++ b/mihomo_editor.py @@ -319,12 +319,95 @@ def insert_proxy_logic(content, proxy_name, target_groups): return "\n".join(new_lines) +def replace_proxy_block(content, target_name, new_yaml_lines): + lines = content.splitlines() + new_content_lines = [] + + in_proxies = False + found_target = False + replaced = False + + # Регулярка для поиска начала блока прокси с указанным именем + # Учитывает кавычки и пробелы: - name: "target_name" + name_pattern = re.compile(r'^\s*-\s+name:\s*(["\'])?' + re.escape(target_name) + r'(\1)?\s*$') + + i = 0 + while i < len(lines): + line = lines[i] + stripped = line.strip() + + # Определяем секцию proxies + if stripped.startswith('proxies:'): + in_proxies = True + new_content_lines.append(line) + i += 1 + continue + + # Если вышли из proxies (новая секция начинается без отступа) + if in_proxies and line and not line.startswith(' ') and not line.startswith('\t') and not line.startswith('#'): + in_proxies = False + + if in_proxies and not replaced: + if name_pattern.match(stripped): + # Нашли целевой прокси. + # 1. Определяем отступ этого блока (обычно 2 пробела) + indent_len = len(line) - len(line.lstrip()) + + # 2. Добавляем новый YAML. + # new_yaml_lines приходят без отступов (или с базовыми). + # Нам нужно убедиться, что первая строка имеет дефис, а остальные - отступ. + # Обычно new_yaml_lines[0] уже "- name: ...". + # Просто добавим отступ всем строкам. + + # Принудительно меняем имя в новом YAML на целевое, чтобы сохранить структуру + # (хотя парсеры уже могли вернуть новое имя, но лучше перестраховаться) + if new_yaml_lines and "name:" in new_yaml_lines[0]: + # Заменяем имя в первой строке нового конфига на старое (target_name) + new_yaml_lines[0] = re.sub(r'name:\s*".*"', f'name: "{target_name}"', new_yaml_lines[0]) + + for n_line in new_yaml_lines: + new_content_lines.append(" " * indent_len + n_line) + + replaced = True + found_target = True + + # 3. Пропускаем старый блок + # Читаем дальше, пока не найдем строку с ТАКИМ ЖЕ отступом, начинающуюся с '-' (следующий элемент списка) + # или строку с МЕНЬШИМ отступом (конец секции) + i += 1 + while i < len(lines): + next_line = lines[i] + next_stripped = next_line.strip() + next_indent = len(next_line) - len(next_line.lstrip()) + + if not next_stripped: # Пустые строки пропускаем/удаляем внутри блока + i += 1 + continue + + if next_indent < indent_len: + # Конец секции proxies + break + + if next_indent == indent_len and next_stripped.startswith('-'): + # Следующий элемент списка + break + + # Это всё еще часть старого блока, пропускаем + i += 1 + continue + + new_content_lines.append(line) + i += 1 + + return "\n".join(new_content_lines) + + HTML_TEMPLATE = """
-