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