Files
utun2/doc/code_language_detection.md
T

5.5 KiB
Raw Blame History

Определение языка блока кода

Модуль: 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.