Recientemente configuré mi propio foro de Discourse: https://crucible.hubbe.net/. Por lo general, he estado muy satisfecho con él. La comunidad está dedicada a una placa tipo Arduino utilizada principalmente por creadores de accesorios. Como tal, terminamos usando mucha plantilla de código C++. En particular, usamos algo llamado un “estilo” que configura cómo aparecen las luces. Los estilos pueden ser complicados, así que escribí un editor/visor en línea y luego utilicé el componente de tema discourse-linkify para que los estilos se enlacen automáticamente al editor. Tuve que hacer algunos cambios menores en el componente de tema discourse-linkify para que las comillas de los caracteres de URL y demás funcionaran, lo cual fue bastante sencillo, y puedo crear una PR con esos cambios si hay interés.
Sin embargo, hay un problema…
Parte del código de plantilla termina pareciendo un poco HTML debido a todos los caracteres < y >, y en algún momento Discourse elimina algunas de esas “etiquetas”. Básicamente, parece que cualquier palabra desconocida encerrada en < > se elimina. La siguiente línea de este post será < foo > pero sin los espacios:
< - el foo está aquí
Al principio pensé que era el componente linkify el que estaba haciendo algo mal, pero tras investigar un poco, parece que lo que falta ya ha desaparecido antes de que se ejecute linkify. Así que supongo que las etiquetas extra se evaporaron en algún lugar del proceso de cocción.
Noté que en los bloques de código (tres comillas invertidas y similares) las etiquetas sí sobreviven, pero para mis propósitos sería mejor si siempre sobrevivieran.
Durante un tiempo pensé que sería suficiente modificar discourse/lib/utilities.cs:CODE_BLOCKS_REGEXP para que esto funcionara, pero inCodeBlock no se usa desde muchos lugares, ¿así que quizás eso es incorrecto? Además, aún no he descubierto cómo modificar realmente CODE_BLOCKS_REGEXP desde un plugin o un componente de tema.
¿Qué código es realmente el responsable de eliminar estas etiquetas?
¿Cuál es la mejor manera (la más compatible) de desactivarlo?
También debo señalar que, dado que las personas a veces pegan grandes bloques de código, puede ser muy difícil detectar que algunas partes del medio se han perdido. Como mínimo, sería mejor que las etiquetas desconocidas se convirtieran en signos de advertencia parpadeantes o en algo que informe al usuario de que ha ocurrido algo inesperado.
Tendrás que educar a tus usuarios, pero ese es tu trabajo como moderador, además ayudará a todos los usuarios que tengan que lidiar con Markdown más adelante.
Podrías hacerlo añadiendo un nuevo tema global fijado, algo como “Cómo incrustar código en este sitio” o “Cómo escribir en este sitio”.
¿Porque tengo cosas mejores que hacer que perseguir gatos?
Si existe una forma fácil y una forma correcta de hacer las cosas, la gente siempre elegirá la forma fácil. Supongo que si pudiera evitar realmente que las personas coloquen las plantillas de StylePtr<> fuera del texto preformateado, entonces se verían obligadas a hacer lo correcto, pero ¿cómo lo hago? (Además, parece una solución muy drástica, ya que también podría impedir formas perfectamente válidas de hablar sobre las plantillas de StylePtr<>.)
Mi solución actual para enlazar plantillas de StylePtr<> usando linkify tampoco funciona en texto preformateado porque el DOM es muy diferente, pero ese es un problema menor que probablemente pueda solucionar con un poco de programación.
Quizás. Creo que lo que haría sería usar este patrón para agregar automáticamente las comillas invertidas si no están presentes y luego usar una función de retorno (callback) post-cocción para los enlaces. A menos que esté equivocado, no hay otra forma de agregar un enlace en medio de algún texto preformateado.
Fomentar que los usuarios usen comillas invertidas para el código en línea y tres comillas invertidas para bloques de código es la mejor solución. ¿Quizás crear un tema fijado sobre eso en tu foro?
El componente de tema para el detector de código sin formato parece prometedor. Luego solo tendré que crear un componente de tema que gestione los enlaces dentro del código preformateado, algo que ya tenía planeado hacer de todos modos. Definitivamente probaré esto.
Resulta que todo lo que tenía que hacer era habilitar el soporte de expresiones regulares multilinea en el módulo linkify para que funcionara más como yo quería. Así que creo que ya está bien, suponiendo que la gente realmente preste atención al detector de código sin formato.