# Определение языка блока кода Модуль: `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`.