Cozinhando com C++

(Primeira postagem, então me desculpem…)

Recentemente configurei meu próprio fórum Discourse: https://crucible.hubbe.net/ e, em geral, tenho ficado muito satisfeito com ele. A comunidade é voltada para uma placa do tipo Arduino usada principalmente por criadores de adereços (prop makers). Por isso, acabamos usando bastante código C++ com templates. Em particular, usamos algo chamado “style” (estilo), que configura como as luzes aparecem. Os estilos podem ser complicados, então escrevi um editor/visualizador online e, em seguida, usei o componente de tema discourse-linkify para fazer com que os estilos fossem automaticamente vinculados ao editor. Precisei fazer algumas pequenas alterações no componente de tema discourse-linkify para fazer com que os caracteres de URL e afins fossem citados corretamente, o que foi relativamente simples, e posso criar um PR (pull request) com essas alterações se houver interesse.

O resultado pode ser visto aqui: StylePtr links - The Crucible - The Crucible

No entanto, há um problema…
Parte do código com templates acaba parecendo um pouco com HTML por causa de todos os caracteres < e >, e, em algum momento, o Discourse remove algumas dessas “tags”. Basicamente, parece que qualquer palavra desconhecida entre < > é removida. A próxima linha desta postagem será (sem os espaços):

< - o foo está aqui

No início, achei que fosse o componente linkify que estava fazendo algo errado, mas, após algumas investigações, parece que o conteúdo faltante já havia desaparecido antes mesmo do linkify ser executado. Então, acho que as tags extras evaporaram em algum momento do processo de “cozimento” (cooking process)?

Percebi que, em blocos de código (triple-backtick e similares), as tags sobrevivem, mas, para os meus propósitos, seria melhor se elas sempre sobrevivessem.

Por um tempo, pensei que seria suficiente modificar o arquivo discourse/lib/utilities.cs:CODE_BLOCKS_REGEXP para fazer isso funcionar, mas o inCodeBlock não é usado de muitos lugares, então talvez essa não seja a abordagem correta? Além disso, ainda não consegui descobrir como modificar o CODE_BLOCKS_REGEXP a partir de um plugin ou componente de tema.

Qual código é realmente responsável por remover essas tags?
Qual é a melhor maneira (mais suportada) de desativar isso?

Também devo destacar que, como as pessoas às vezes colam grandes blocos de código, pode ser muito difícil perceber que algumas partes do meio foram perdidas. Pelo menos, seria melhor se tags desconhecidas fossem convertidas em sinais de aviso piscantes ou algo que informe ao usuário que algo inesperado ocorreu.

Pergunta: por que não tentar usar blocos de código em markdown?

Basta envolver seu código em três crases: ` caractere.

Assim:

aqui 
<foo>
é <some> </fooer> </foo>

E este é o markdown bruto real da minha postagem: https://meta.discourse.org/raw/187974/3


Você terá que educar seus usuários, mas esse é o seu trabalho como moderador, além de ajudar todos os usuários que precisarão lidar com markdown mais adiante.

Você pode fazer isso criando um novo tópico fixo global, algo como “Como incorporar código neste site” ou “Como digitar neste site”.

Você também pode direcioná-los para este link: Referência Markdown (commonmark.org)

Ok, eu só queria deixar este link aqui também, caso alguém mais tenha o mesmo problema.

Parece que adicionar crases e um link usando o mesmo padrão que o plugin piratize usa resolveria o desafio.

Porque tenho coisas melhores para fazer do que brigar com gatos?
Se houver uma maneira fácil e uma maneira correta de fazer as coisas, as pessoas sempre escolherão a maneira fácil. Acredito que, se eu pudesse realmente impedir que as pessoas coloquem templates StylePtr<> fora de texto pré-formatado, elas seriam forçadas a fazer a coisa certa, mas como faço isso? (Além disso, parece uma solução muito drástica, pois também poderia impedir maneiras perfeitamente válidas de falar sobre templates StylePtr<>.)

Minha solução atual para vincular templates StylePtr<> usando linkify também não funciona em texto pré-formatado porque o DOM é muito diferente, mas esse é um problema menor que provavelmente consigo resolver com um pouco de programação.

Talvez. Acredito que o que eu faria seria usar esse padrão para adicionar as crases automaticamente se elas não estiverem presentes e, em seguida, usar um callback pós-cozimento para criar os links. A menos que eu esteja enganado, não há como adicionar um link no meio de algum texto pré-formatado de outra forma.

Incentivar os usuários a usar crases para código em linha e três crases para blocos de código é a melhor solução. Talvez crie um tópico fixo sobre isso no seu fórum?

Além disso, você pode experimentar Unformatted Code Detector.

O componente de tema do detector de código não formatado parece promissor.
Então, só preciso criar um componente de tema que gerencie os links dentro de código pré-formatado, o que eu já planejava fazer de qualquer forma. Com certeza vou tentar isso.

Acontece que tudo o que eu precisava fazer era ativar o suporte a expressões regulares multilinha no módulo linkify para fazê-lo funcionar mais como eu queria. Então, acho que estou bem, desde que as pessoas realmente prestem atenção ao detector de código não formatado.