Files
utun2/doc/code_language_detection.md
T

68 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Определение языка блока кода
Модуль: `tools/chatgui/src/code_language.h/.cpp`. Включается для блоков с пустым языком;
явная метка, включая `text`/`plain`, всегда имеет приоритет. Исходник сообщения, протокол,
видимый текст, координаты выделения и копирование не меняются.
Это небольшой набор взвешенных признаков, а не парсер или модель машинного обучения.
Он ограничен первыми 16384 символами UTF-16 и девятью языками. Возвращает пустой результат
при недостатке признаков или близких оценках. Например, арифметика и многие фрагменты C/C++
не позволяют надёжно выбрать язык. Короткие комментарии/лицензии также могут остаться без определения.
Совпадающие конструкции неподдерживаемых языков всё равно могут привести к ошибочному выбору.
## Воспроизводимая выборка
`tools/chatgui/tests/code_language_corpus.json` содержит URL с commit SHA, SHA-256 каждого файла,
ожидаемые языки и разделение выборки на первоначальную и дополнительную проверку.
Сами сторонние исходники в репозиторий не добавляются; скачиваются в отдельный каталог.
Имя файла и расширение в определитель не передаются.
27 исходных файлов: по три файла каждого языка из двух проектов. Проекты: zlib/curl, fmt/googletest,
JUnit/Gson, Okio/Kotlin stdlib, ripgrep/fd, Symfony/Laravel, lodash/jQuery,
Bootstrap/normalize.css, HTML5 Boilerplate/htmx. Дополнительно три отрицательных примера: README и лицензии.
Для каждого файла проверяется полный текст и три окна по 20 строк: начало, середина, конец.
Окна не выбираются по результату распознавания. В `404.html` среднее окно целиком содержит CSS;
его ожидаемый язык указан отдельно в манифесте.
Первая выборка выявила конфликт `std::` в Rust/C++, дополнительная — неоднозначность `let`/`=>`
и HTML с вложенным JavaScript. По этим случаям исправлены общие правила и добавлены регрессионные тесты.
Поэтому итоговые цифры описывают проверенную выборку после исправлений, а не независимую оценку точности.
## Результаты на Linux, 02.11.2026
| Язык исходного файла | Полные файлы: верно | Окна: верно | Окна: не определено | Ошибочный язык |
|---|---:|---:|---:|---:|
| C | 3/3 | 2/9 | 7 | 0 |
| C++ | 3/3 | 4/9 | 5 | 0 |
| Java | 3/3 | 6/9 | 3 | 0 |
| Kotlin | 3/3 | 6/9 | 3 | 0 |
| Rust | 3/3 | 6/9 | 3 | 0 |
| PHP | 3/3 | 9/9 | 0 | 0 |
| JavaScript | 3/3 | 6/9 | 3 | 0 |
| CSS | 3/3 | 7/9 | 2 | 0 |
| HTML, включая CSS-окно | 3/3 | 9/9 | 0 | 0 |
| **Итого код** | **27/27** | **55/81** | **26** | **0** |
Все три текстовых отрицательных примера и девять их окон дали пустой результат.
Полный прогон 120 входов занял 67 мс вместе с чтением, SHA-256 и диагностикой на этой машине;
это разовое измерение, не гарантированная задержка интерфейса.
## Запуск
```sh
cmake --build tools/chatgui/build --target test_code_language test_message_text -j4
ctest --test-dir tools/chatgui/build --output-on-failure -R '^(test_code_language|test_message_text)$'
python3 tools/chatgui/tests/run_code_language_corpus.py \
--cache /tmp/utun-code-corpus \
--test-binary tools/chatgui/build/test_code_language
```
Первая загрузка требует сети; повторный запуск использует кеш и сверяет все SHA-256.
В Windows нужно передать путь к `test_code_language.exe` и доступный каталог кеша.
Без `CODE_LANGUAGE_CORPUS` обычный CTest запускает синтетические регрессии, а сетевую выборку пропускает.
Скрипт загрузки выставляет переменную сам и запускает именно C++-реализацию определителя.
`test_message_text` проверяет реальную подсветку всех девяти языков, приоритет явной метки,
отключение через `text`/`plain`, неизменность исходника и кеш.
Логи выполненного прогона: `/tmp/code-language-corpus-final.log`, `/tmp/code-language-final-tests.log`.