Nel nostro forum abbiamo notato di recente che il codice viene evidenziato automaticamente, anche se l’opzione autohighlight all code è disattivata e highlighted languages è vuoto. Lo avevamo fatto perché abbiamo molto codice in linguaggi non supportati. Ma ora viene rilevato come C#.
Posso riprodurre il problema su Try. Sembra che l’impostazione del sito autohighlight_all_code non venga rispettata. La funzionalità appare abilitata indipendentemente dal fatto che l’impostazione sia selezionata o meno. L’impostazione highlighted languages influisce sul rilevamento della lingua, ma se tutto viene rimosso, sembra che di default venga impostato su csharp quando rileva qualcosa di simile a codice.
L’ultima modifica al core che ha coinvolto l’evidenziazione della sintassi sembra essere il refactoring di @j.jaffeux:
Non credo che ci sia stato un regresso qui; al massimo, prima delle mie varie correzioni di qualche settimana fa, funzionava in modo errato.
Ciò che sta accadendo è che, per impostazione predefinita, aggiungiamo sempre auto e nohighlight all’elenco delle classi di codice accettabili. Se non definisci alcun linguaggio quando crei il tuo blocco di codice, verrà utilizzato il valore di default_code_lang, che per impostazione predefinita è auto; se lo imposti su nohighlight, dovresti ottenere il risultato previsto. Tieni presente che dovrai ricostruire l’HTML dei post. Probabilmente non è nemmeno necessario svuotare highlighted_languages, poiché non ha alcun effetto se scegli nohighlight.
Questo sta accadendo per post completamente nuovi, quindi qualcosa è sicuramente cambiato.
(E sì, ho capito che non mi serve un elenco vuoto delle lingue: riceviamo occasionalmente codice JS e Python, quindi tanto vale permettere l’evidenziazione se qualcuno aggiunge il codice.)
Il problema è che quando “evidenzia automaticamente tutto il codice” non è selezionato, i blocchi di codice non contrassegnati vengono comunque evidenziati automaticamente.
I blocchi di codice con delimitatori (```) ricevono sempre l’evidenziazione automatica; i blocchi di codice con indentazione (<code> </code>) sono quelli influenzati da tale impostazione.
Ohh. Beh… perché c’è una differenza? E può essere modificato?
Qualcosa è cambiato in Discourse, perché i blocchi di codice delimitati non venivano evidenziati automaticamente in passato. Abbiamo il nostro forum Discourse da quasi due anni. Fino all’aggiornamento più recente, i blocchi di codice delimitati non venivano evidenziati automaticamente.
Può essere modificato? Sì, l’impostazione “evidenzia automaticamente tutto il codice” rende il comportamento coerente per entrambi i tipi di blocchi di codice.
Se non desideri mai l’evidenziazione automatica a meno che non sia specificato esplicitamente un linguaggio,
Sì, forse, ma come ho detto, non vedo nulla che non funzioni come previsto ora, quindi la mia ipotesi è che prima qualcosa non funzionasse per errore e che tu ti stessi affidando a quel comportamento.
Penso che venisse rilevato come un linguaggio che non veniva caricato correttamente, finendo così per non essere evidenziato nel blocco.
Hmm, okay. Possiamo trasformarlo in una richiesta affinché la descrizione (e persino il nome) dell’impostazione “autohighlight all code” venga resa più accurata? Potrebbe essere modificata in “autohighlight indented code” con la descrizione “Applica l’evidenziazione del codice ai blocchi di codice indentati anche quando non specificano esplicitamente il linguaggio.”
Questo non è nuovo, ma credo che il valore nohighlight che abbiamo iniettato sia errato e dovrebbe essere no-highlight. Questo rafforza anche la mia ipotesi su ciò che hai rilevato come codice non trovato e che è passato al fallback no-highlight. Procederò con la modifica.
Resta una domanda: come era possibile che csharp fosse un’opzione quando le lingue evidenziate erano vuote? Una configurazione vuota agisce come se avesse l’elenco predefinito?
Quando rimuoviamo questa classe e poi chiediamo a highlightjs di evidenziare il blocco di codice, non facciamo più affidamento su markdown e si tratta di una modifica lato client, quindi i limiti delle classi non si applicano più.
In pratica:
not auto → aggiungerà una classe dalla lista nel markup generato, utilizzata da highlightjs
auto → aggiungerà lang-auto nel markup generato, che verrà poi rimosso a runtime e permetterà a highlightjs di decidere l’evidenziazione