# 🔧 Исправление: Экранирование HTML тегов в комментариях ## 🐛 Проблема AI комментарии содержали упоминания JSX/HTML тегов, которые **исчезали** при отображении в Gitea/GitHub: **До исправления:** ``` Неправильное использование key: key должен быть на элементе , а не на ↑ ↑ исчез исчез ``` **Причина:** Markdown интерпретирует `` как HTML тег и пытается его отрендерить, но т.к. такого тега не существует, он просто исчезает. --- ## ✅ Решение Добавлена функция **`_escape_html_in_text()`**, которая **оборачивает HTML-подобные теги** в backticks: ```python def _escape_html_in_text(self, text: str) -> str: """Escape HTML tags in text to prevent Markdown from hiding them""" import re def replace_tag(match): tag = match.group(0) return f"`{tag}`" # Оборачиваем в backticks # Находим все <...> паттерны text = re.sub(r'<[^>]+>', replace_tag, text) return text ``` --- ## 🎯 Как работает ### Шаг 1: AI генерирует комментарий ``` "key должен быть на элементе , а не на " ``` ### Шаг 2: Функция экранирования ```python text = _escape_html_in_text(text) # Результат: "key должен быть на элементе ``, а не на ``" ``` ### Шаг 3: В Gitea/GitHub отображается ``` key должен быть на элементе ``, а не на `` ↑ ↑ ↑ ↑ backticks делают теги видимыми ``` --- ## 📊 Примеры ### Пример 1: JSX элементы **Входной текст:** ``` Неправильное использование key: key должен быть на , а не на ``` **После обработки:** ``` Неправильное использование key: key должен быть на ``, а не на `` ``` **В Gitea видно:** ``` Неправильное использование key: key должен быть на ``, а не на `` ``` --- ### Пример 2: HTML теги **Входной текст:** ``` Используйте
вместо для обертки ``` **После обработки:** ``` Используйте `
` вместо `` для обертки ``` **В Gitea видно:** ``` Используйте `
` вместо `` для обертки ``` --- ### Пример 3: Без HTML тегов **Входной текст:** ``` Опечатка в строке: 'shmapplication/json' должно быть 'application/json' ``` **После обработки:** ``` Опечатка в строке: 'shmapplication/json' должно быть 'application/json' ``` **В Gitea видно:** ``` Опечатка в строке: 'shmapplication/json' должно быть 'application/json' ``` *Без изменений - теги не найдены* --- ## 🔄 Где применяется Функция вызывается **дважды** для каждого ревью: ### 1. Для каждого комментария ```python for comment_data in state["comments"]: message = comment_data.get("message", "") message = self._remove_think_blocks(message) message = self._escape_html_in_text(message) # ← Экранируем comment = Comment(content=message, ...) ``` ### 2. Для общего summary ```python summary = await self.analyzer.generate_summary(...) summary = self._remove_think_blocks(summary) summary = self._escape_html_in_text(summary) # ← Экранируем await git_service.create_review(body=summary, ...) ``` --- ## 🧪 Тестирование Создан тест для проверки: ```python test_texts = [ "key должен быть на элементе , а не на ", "Используйте
вместо здесь" ] for text in test_texts: escaped = escape_html_in_text(text) print(f"Original: {text}") print(f"Escaped: {escaped}") ``` **Результат:** ``` Original: key должен быть на элементе , а не на Escaped: key должен быть на элементе ``, а не на `` Original: Используйте
вместо здесь Escaped: Используйте `
` вместо `` здесь ``` ✅ **Работает как ожидалось!** --- ## 🎨 Визуальное сравнение ### ❌ До исправления (в Gitea): ``` ❌ src/pages/search-character.tsx:105 ERROR: Неправильное использование key: key должен быть на элементе , а не на ↑ теги исчезли, непонятно о чем речь ``` ### ✅ После исправления (в Gitea): ``` ❌ src/pages/search-character.tsx:105 ERROR: Неправильное использование key: key должен быть на элементе ``, а не на `` ↑ теги видны и кликабельны, все понятно ``` --- ## 📝 Измененные файлы - **`backend/app/agents/reviewer.py`**: - Добавлена функция `_escape_html_in_text()` - Вызов функции для комментариев - Вызов функции для summary --- ## 🚀 Как попробовать 1. Backend уже подхватил изменения (`--reload`) 2. Нажмите **🔄 Повторить ревью** 3. Откройте PR в Gitea 4. Проверьте что теги теперь видны: ``, ``, и т.д. --- ## ✅ Готово! Теперь все HTML/JSX теги в комментариях **отображаются корректно** и код понятен! 🎉 **Попробуйте прямо сейчас!** 🧪