5.5 KiB
Определение языка блока кода
Модуль: 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 и диагностикой на этой машине; это разовое измерение, не гарантированная задержка интерфейса.
Запуск
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.