Add "Quality"

2026-04-12 20:46:42 +00:00
parent 0e922c1d6d
commit 88a89b97fb

69
Quality.md Normal file

@@ -0,0 +1,69 @@
# Проверки качества
## Спеллчекер
### Как работает
1. Кнопка **АБВ**`toggleSpellCheck()`
2. `extractTextFromHtml(previewHtml)` — извлекает текст из HTML:
- DOM-парсинг через DOMParser
- Убирает `<style>`, `<script>`
- Убирает шаблонные теги: `{%...%}`, `{{...}}`, `@{...}`, `${...}`
- Дедуплицирует повторяющиеся фрагменты
- Нормализует пробелы
- Макс 9500 символов
3. POST к Яндекс.Спеллеру через прокси `/speller/services/spellservice.json/checkText`
- Параметры: `text`, `lang=ru,en`, `options=518` (все проверки)
4. `injectSpellMarks(previewHtml, errors)` — инжектирует метки:
- Ищет ошибочные слова в HTML (только в текстовых нодах, не в тегах)
- Оборачивает в `<mark class="va-spell" title="подсказка">слово</mark>`
- Wavy red underline (CSS)
- Tooltip: "Повтор слова" / "→ предложения" / "Неизвестное слово"
5. Результат показывается в iframe вместо обычного превью
### Библиотека spellcheck.js
- `extractTextFromHtml(html)` — DOM-based, handles encoding
- `injectSpellMarks(html, errors)` — position-aware injection
## Проверка ссылок
### Как работает
1. Кнопка **🔗** → `runLinkCheck()`
2. `extractLinksFromHtml(previewHtml)` — DOM-парсинг, извлекает все `href` и `src`
3. POST `/api/check-links` с массивом URL (макс 50)
4. Backend проверяет каждый URL:
- HEAD запрос с таймаутом 10 сек
- `isPublicUrl()` фильтр (без localhost/private IP)
- Возвращает: `{url, status, ok, redirected, finalUrl, error}`
5. Результаты показываются в панели:
- ✅ Зелёный — 2xx
- 🔄 Жёлтый — редирект
- ❌ Красный — ошибка / 4xx / 5xx
## Типограф
### Как работает
1. Кнопка **Типограф** или кнопка **Т** на отдельном поле
2. SOAP-запрос к Art. Lebedev Типограф через прокси `/typograf/`
3. `sanitizeTypograf(text)` — очистка перед отправкой:
- Убирает `<br>`, `<p>` теги
- Нормализует пробелы
4. Результат: правильные кавычки «», тире —, неразрывные пробелы
5. `applyNowrapSpaces(block, field)` — после типографа, заменяет пробел после 1-3-буквенных слов на `&nbsp;`
### typografAll()
Применяет типограф ко ВСЕМ текстовым полям всех блоков за один проход.
## Форматирование текста
Кнопки в шапке каждого блока:
| Кнопка | Функция | Результат в Pug |
|--------|---------|----------------|
| **Ж** | `wrapBold()` | `<span style="font-weight:700">текст</span>` |
| **•** | `insertBullet()` | `&bull;&nbsp;` перед текстом |
| **br** | `insertBr()` | `<br>` в позиции курсора |
| **A** | Цвет текста | `<span style="color:#hex">текст</span>` |
| **URL** | `insertLink()` | `<a href="url">текст</a>` |
| **👁** | Превью блока | Показывает рендер одного блока |
Shift+Enter в textarea → вставляет `<br>` вместо переноса строки.