# 🔧 Исправление: Экранирование 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 должен быть на элементе , а не на
 исчез
```
**Причина:** 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 должен быть на элементе ``, а не на `
"
```
### Шаг 2: Функция экранирования
```python
text = _escape_html_in_text(text)
# Результат:
"key должен быть на элементе ``, а не на `![]() `"
```
### Шаг 3: В Gitea/GitHub отображается
```
key должен быть на элементе ``, а не на `
`"
```
### Шаг 3: В Gitea/GitHub отображается
```
key должен быть на элементе ``, а не на `![]() `
                             ↑              ↑      ↑     ↑
                             backticks делают теги видимыми
```
---
## 📊 Примеры
### Пример 1: JSX элементы
**Входной текст:**
```
Неправильное использование key: key должен быть на , а не на
`
                             ↑              ↑      ↑     ↑
                             backticks делают теги видимыми
```
---
## 📊 Примеры
### Пример 1: JSX элементы
**Входной текст:**
```
Неправильное использование key: key должен быть на , а не на ![]() ```
**После обработки:**
```
Неправильное использование key: key должен быть на ``, а не на `
```
**После обработки:**
```
Неправильное использование key: key должен быть на ``, а не на `![]() `
```
**В Gitea видно:**
```
Неправильное использование key: key должен быть на ``, а не на `
`
```
**В Gitea видно:**
```
Неправильное использование key: key должен быть на ``, а не на `![]() `
```
---
### Пример 2: HTML теги
**Входной текст:**
```
Используйте
`
```
---
### Пример 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 должен быть на элементе ``, а не на `
Escaped:  key должен быть на элементе ``, а не на `![]() `
Original: Используйте
`
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. Проверьте что теги теперь видны: ``, `
`
       ↑ теги видны и кликабельны, все понятно
```
---
## 📝 Измененные файлы
- **`backend/app/agents/reviewer.py`**:
  - Добавлена функция `_escape_html_in_text()`
  - Вызов функции для комментариев
  - Вызов функции для summary
---
## 🚀 Как попробовать
1. Backend уже подхватил изменения (`--reload`)
2. Нажмите **🔄 Повторить ревью**
3. Откройте PR в Gitea
4. Проверьте что теги теперь видны: ``, `![]() `, и т.д.
---
## ✅ Готово!
Теперь все HTML/JSX теги в комментариях **отображаются корректно** и код понятен! 🎉
**Попробуйте прямо сейчас!** 🧪
`, и т.д.
---
## ✅ Готово!
Теперь все HTML/JSX теги в комментариях **отображаются корректно** и код понятен! 🎉
**Попробуйте прямо сейчас!** 🧪