На нашем форуме мы недавно заметили, что код подсвечивается автоматически, даже если autohighlight all code выключен, а highlighted languages пуст. Мы сделали это, потому что у нас много кода на языках, которые не поддерживаются. Но теперь он определяется как C#.
Я могу воспроизвести это на Try. Похоже, что настройка сайта autohighlight_all_code игнорируется. Функциональность, кажется, включена независимо от того, отмечена настройка или нет. Настройка highlighted languages влияет на определение языка, но если всё удалено, при обнаружении чего-либо похожего на код, по умолчанию, кажется, выбирается csharp.
Последнее изменение в ядре, связанное с подсветкой синтаксиса, — это рефакторинг от @j.jaffeux:
Я не думаю, что здесь что-то ухудшилось; в лучшем случае до моих различных исправлений несколько недель назад всё работало некорректно.
Вот что происходит: по умолчанию мы всегда добавляем auto и nohighlight в список допустимых классов для кода. Если вы не указали язык при определении блока кода, будет использоваться значение default_code_lang, которое по умолчанию равно auto. Если вы установите его в nohighlight, вы получите ожидаемый результат. Обратите внимание, что вам потребуется перестроить HTML-верстку постов. Также, скорее всего, вам не нужно очищать highlighted_languages, так как это не окажет эффекта, если выбран nohighlight.
Это происходит с совершенно новыми постами, значит, что-то определённо изменилось.
(И да, я понял, что пустой список языков мне не нужен — у нас иногда встречаются JS и Python, так что лучше разрешить их подсветку, если кто-то добавит код.)
Ох, ну… почему существует разница? И можно ли это изменить?
Что-то изменилось в Discourse, потому что блоки кода с ограждением раньше не подсвечивались автоматически. Наш форум на Discourse существует уже почти два года. До самого последнего обновления блоки кода с ограждением не подсвечивались автоматически.
Да, возможно, но, как я уже сказал, сейчас я не вижу ничего, что работало бы не так, как ожидалось. Поэтому пока я предполагаю, что раньше что-то работало некорректно по ошибке, и вы полагались на это поведение.
Мне кажется, что код определялся как язык, который загружался некорректно, из-за чего блок в итоге не подсвечивался.
Хм, хорошо. Можно ли тогда превратить это в предложение изменить описание (и даже название) настройки «autohighlight all code» на более точное? Возможно, стоит переименовать её в «autohighlight indented code» с описанием: «Применять подсветку синтаксиса к блочным отступным блокам кода, даже если язык явно не указан».
Это не ново, но я считаю, что наше внедрённое значение nohighlight неверно и должно быть no-highlight. Это также подтверждает мою догадку о том, что вы увидели: код был обнаружен, но не найден, и происходил переход к no-highlight. Я внесу это изменение.
Остаётся один вопрос: как C# мог быть вариантом, когда список подсвечиваемых языков был пуст? Действует ли пустая настройка так, будто она содержит список по умолчанию?
Когда мы удаляем этот класс и затем просим highlightjs подсветить блок кода, мы больше не полагаемся на markdown, и поскольку это изменение на стороне клиента, ограничения по классам больше не действуют.
Вкратце:
не auto → будет добавлен класс из списка в сгенерированной разметке, который используется highlightjs
auto → будет добавлен lang-auto в сгенерированной разметке, который затем удаляется во время выполнения, позволяя highlightjs самостоятельно определить подсветку