Автоматическая подсветка кода не работает в полноэкранном режиме просмотра

Приоритет/Серьезность:
Низкий
Платформа:
Chrome 124, Ubuntu 22
Версия:
Discourse v3.3.0.beta2-dev
Описание:
Discourse выполняет автоматическую подсветку синтаксиса с помощью hljs, даже если язык не указан. Эта функция работает в обычном просмотре темы, но не при просмотре кода в полноэкранном режиме.
Шаги для воспроизведения:

  1. Создайте тему с блоком кода, не указывая язык.
System.out.println("hello world");
  1. Откройте тему и убедитесь, что hljs определил язык и применил подсветку.
  2. Нажмите кнопку полноэкранного режима в правом верхнем углу блока кода.
  3. Убедитесь, что определение языка hljs не сработало и подсветка не применена.

Ниже приведены несколько скриншотов в одном изображении из-за ограничений для новых пользователей :confused:.

3 лайка

Спасибо за отчёт, @oskar1, я могу подтвердить эту ошибку локально. (На meta воспроизвести это сложнее, так как мы используем text, а не auto в качестве default code lang.)

Мы скоро займемся исправлением этого.

3 лайка

Я думаю, проблема здесь :thinking: :

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/highlight-syntax.js#L36-L52

Класс lang-auto применяется к коду в разметке Markdown и автоматически удаляется здесь, чтобы библиотека могла определить язык.

Однако при переходе в полноэкранный режим lang-auto больше не присутствует в элементе, и здесь остаётся только класс language-<определённый_здесь_язык>. Следовательно, lang не определён.

Возможное исправление может быть таким — если lang-auto не найден, ищите language-<..>:

const m = className.match(/^lang-(.+)$/);

const m = className.match(/^(?:lang|language)-(.+)$/);

1 лайк

Буду рад проверить PR, если вы захотите его отправить, @Arkshine, вы уже проделали большую часть работы :wink:.

3 лайка

Я сделал PR :+1:. Надеюсь, тестов достаточно!

2 лайка

Спасибо @Arkshine, исправление выглядит отлично, объединю его, как только тесты пройдут в CI.

3 лайка

Эта тема была автоматически закрыта через 18 часов. Новые ответы больше не принимаются.