Cucinare con C++

(Primo post, quindi abbiate pazienza…)

Ho appena configurato il mio forum Discourse: https://crucible.hubbe.net/. Per la maggior parte ne sono molto soddisfatto. La community è dedicata a una scheda di tipo Arduino utilizzata principalmente dai prop maker. Di conseguenza, finiamo per usare molto codice C++ basato su template. In particolare, utilizziamo una cosa chiamata “style” che configura l’aspetto delle luci. Gli style possono essere complessi, quindi ho scritto un visualizzatore/editor online, e ho poi utilizzato il componente del tema discourse-linkify per fare in modo che gli style venissero automaticamente collegati all’editor. Ho dovuto apportare alcune modifiche minori al componente del tema discourse-linkify per gestire la codifica dei caratteri URL e simili, il che è stato abbastanza semplice, e posso creare una PR per queste modifiche se c’è interesse.

Il risultato può essere visto qui: StylePtr links - The Crucible - The Crucible

Tuttavia, c’è un problema…
Alcuni dei codici basati su template finiscono per assomigliare un po’ all’HTML a causa di tutti i caratteri < e >, e a un certo punto Discourse rimuove alcuni di questi “tag”. Fondamentalmente, sembra che qualsiasi parola sconosciuta racchiusa tra < > venga rimossa. La riga successiva in questo post sarà ma senza gli spazi:

< - il foo è qui

All’inizio pensavo che fosse il componente linkify a fare qualcosa di sbagliato, ma dopo alcune ricerche, sembra che le parti mancanti siano già sparite prima che linkify venga eseguito. Quindi immagino che i tag extra siano evaporati da qualche parte durante il processo di “cottura”?

Ho notato che nei blocchi di codice (triplo accento grave e simili) i tag sopravvivono, ma per i miei scopi sarebbe meglio se sopravvivessero sempre.

Per un po’ ho pensato che sarebbe stato sufficiente modificare discourse/lib/utilities.cs:CODE_BLOCKS_REGEXP per far funzionare questa cosa, ma inCodeBlock non viene utilizzato da molte parti, quindi forse è sbagliato? Inoltre, non ho ancora capito come modificare effettivamente CODE_BLOCKS_REGEXP da un plugin o un componente del tema.

Quale codice è effettivamente responsabile della rimozione di questi tag?
Qual è il modo migliore (più supportato) per disabilitarlo?

Dovrei anche sottolineare che, poiché le persone a volte incollano grandi blocchi di codice, può essere molto difficile accorgersi che alcune parti nel mezzo sono andate perse. Almeno, sarebbe meglio se i tag sconosciuti venissero trasformati in segnali di avvertimento lampeggianti o in qualcosa che permetta all’utente di sapere che è successo qualcosa di inaspettato.

Domanda: perché non provare a usare i blocchi di codice Markdown?

Basta racchiudere il codice tra tre backtick: ` carattere.

Come in questo esempio:

here 
<foo>
is <some> </fooer> </foo>

E questo è il Markdown grezzo effettivo del mio post: https://meta.discourse.org/raw/187974/3


Dovrai educare i tuoi utenti, ma questo è il tuo compito come moderatore, inoltre aiuterà ogni utente che dovrà in seguito gestire il Markdown.

Puoi farlo creando un nuovo argomento globale fissato, qualcosa come “Come incorporare il codice su questo sito” o “Come scrivere su questo sito”.

Puoi anche indirizzarli a questo link: Riferimento Markdown (commonmark.org)

Ok, volevo solo condividere questo link nel caso qualcun altro abbia lo stesso problema.

Sembra che aggiungere i backtick e un link seguendo lo stesso pattern utilizzato dal plugin piratize risolverebbe il problema.

Perché ho cose migliori da fare che rincorrere i gatti?
Se esiste un modo semplice e un modo corretto per fare le cose, le persone sempre sceglieranno la via più semplice. Immagino che se potessi davvero impedire alle persone di inserire template StylePtr<> al di fuori del testo preformattato, allora sarebbero costrette a fare la cosa giusta, ma come posso farlo? (Inoltre, sembra una soluzione molto pesante, poiché potrebbe anche impedire modi perfettamente validi per parlare dei template StylePtr<>.)

La mia attuale soluzione per collegare i template StylePtr<> usando linkify non funziona nemmeno con il testo preformattato perché il DOM è molto diverso, ma è un problema minore che probabilmente posso risolvere con un po’ di codice.

Forse. Penso che quello che farei sarebbe usare questo pattern per aggiungere automaticamente i backtick se non sono presenti, e poi utilizzare un callback post-cottura per il collegamento. A meno che non mi sbagli, non c’è modo di aggiungere un link nel mezzo di un testo preformattato altrimenti.

Incitare gli utenti a utilizzare i backtick per il codice in linea e tre backtick per i blocchi di codice è la soluzione migliore. Forse potresti creare un argomento fissato al riguardo nel tuo forum?

Inoltre, potresti provare Unformatted Code Detector.

Il componente del tema per il rilevamento del codice non formattato sembra promettente.
Dovrò quindi creare un componente del tema che gestisca i collegamenti all’interno del codice preformattato, cosa che avevo già in programma di fare. Proverò senz’altro.

Alla fine, ho scoperto che bastava abilitare il supporto per le espressioni regolari multilinea nel modulo linkify per farlo funzionare più come volevo. Quindi penso di aver risolto, a patto che le persone prestino davvero attenzione al rilevatore di codice non formattato.