Actualizando a Nuevo Plugin de Matemáticas

Todavía tengo instalado el antiguo plugin “Discourse Mathjax”. ¿Alguien ha logrado convertir sus publicaciones para que se muestren correctamente con el nuevo plugin? ¿Sería tan amable de publicar un comando funcional?

Los dos plugins no son 100% compatibles, ya que parte del contenido se romperá si simplemente activo el nuevo.

Por ejemplo, el nuevo plugin requiere $$ dobles antes y después de los bloques \\begin{...}...\\end{...}, por ejemplo \\begin{align}...\\end{align} (sin $$ dobles) se renderiza como matemáticas con el plugin antiguo pero no con el nuevo.

Para convertir esos, rasparía todo el contenido y haría una búsqueda-reemplazo con expresiones regulares para anteponer/posponer los $$ dobles antes/después de \\begin{..}/\\end{..} (pero los bloques anidados serían un problema). Puede haber otros casos en los que el contenido aparezca roto que aún no he detectado (es un foro de 5 años con muchas matemáticas).

1 me gusta

Bueno, gasté más de lo que me gusta admitir para convertir y arreglar contenido roto después de actualizar al nuevo plugin de matemáticas, así que publico aquí los comandos importantes que usé (disculpen la fea chapuza, me dio pereza). Todavía fue necesaria una corrección manual del contenido, pero no tanta en nuestro caso.

NOTA: Esto es a título inspirador. Recuerda el poema “No asumo ninguna responsabilidad…”. No ejecutes esto a ciegas si no lo entiendes.

# reemplazar \\\\ en \\ (lo que también traduce \\\\\\\\ en \\\\)
Post.where('raw ~ ?', "\\\\\\\\").each{|p| p.raw=p.raw.gsub(/\\\\\\\\/, "\\\\"); p.save; print "."; $stdout.flush;}; puts "";

# reemplazar {align} con {aligned} y eliminar todas las versiones con asterisco
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{align.*?\\}/, "\\\\1{aligned}"); p.save; print "."; $stdout.flush;}; puts "";

# reemplazar {array} con {matrix} y eliminar todas las versiones con asterisco
Post.where('raw ~ ?', "\\\\begin\\{array").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{array\\*?\\}/, "\\\\1{matrix}"); p.save; print "."; $stdout.flush;}; puts "";

# reemplazar `\begin{equation}` con `$$`
Post.where('raw ~ ?', "\\\\begin\\{equation").each{|p| p.raw=p.raw.gsub(/\s*\\\\(begin|end)\\{equation\\*?\\}\s*/, "$$"); p.save; print "."; $stdout.flush;}; puts "";

# añadir nuevas líneas antes y después de `$$`
Post.where('raw ~ ?', "\\$\\$").each{|p| p.raw=p.raw.gsub(/\$\$/,"\n$$\n"); p.save; print "."; $stdout.flush;}; puts "";

# añadir `$$` antes y después de bloques `{aligned}`
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/\s*(\\\\begin\\{align)/m,"\n$$\n\\\\1").gsub(/(\\\\end\\{align.*?\\})\s*/m,"\\\\1\n$$\n"); p.save; print "."; $stdout.flush;}; puts "";

# ... corregir `$$` dobles en `{aligned}`
Post.where('raw ~ ?', "\\\\begin\\{aligned").each{|p| p.raw=p.raw.gsub(/(\\\\end\\{align.*?\\}\\n\\$\\$)\\n\\$\\$/,"\\\\1").gsub(/\$\\$\\n(\\$\\$\\n\\\\begin\\{align)/,"\\\\1"); p.save; print "."; $stdout.flush;}; puts "";

## aplicar los dos comandos anteriores a otros entornos que puedas tener además de {aligned}

# CORRECCIÓN MANUAL RECOMENDADA PARA LO SIGUIENTE:
# Publicaciones donde `$$` aparecen en un entorno citado `> `. Solo se deben prefijar los `$$` de apertura y
# cierre, es decir, `> $$`, el contenido intermedio no debe serlo
# o de lo contrario se renderizará como signos de mayor que de matemáticas.
# Ejecuta esto para identificar las publicaciones:
Post.where('raw ~ ?', ">\s*\n\s*\$\$").each{|p| puts "https://discourse.domain.com/p/#{p.id}";};

# ... O, ejecuta esto para intentar una corrección automática, aunque sea arriesgada
# (funcionó bien para nosotros, algunas publicaciones necesitaron más trabajo manual):
Post.where('raw ~ ?', ">\s*\n\s*\$\$").each{|p| p.raw=p.raw.gsub(/(\>\s*)\$\$(.*?)\$\$\s*?\n/m,"\\\\1>\$\$ \\\\2 > $$\n> "); p.save; print "."; $stdout.flush;}; puts "";

# Cosmético, opcional: reemplazar 3+ saltos de línea consecutivos con 2 saltos de línea
Post.where('raw ~ ?', "\\n{3,}").each{|p| p.raw=p.raw.gsub(/\n{3,}/,"\n\n"); p.save; print "."; $stdout.flush;}; puts "";

# Opcional: reemplazar 2+ saltos de línea consecutivos antes y después de `$$`
# con un solo salto de línea
# ADVERTENCIA: está bien en la versión actual del plugin, pero puede mostrarse
# de manera diferente en una versión futura (?). Por ejemplo, en Latex real, una línea vacía
# después de $$ antes del texto sí marca una diferencia en el espaciado vertical.
Post.where('raw ~ ?', "\\n\\$\\$\\n{2,}|\\n{2,}\\$\\$").each{|p| p.raw=p.raw.gsub(/\n\$\$\n{2,}/,"\n$$\n").gsub(/\n{2,}\$\$/,"\n$$"); p.save; print "."; $stdout.flush;}; puts "";
2 Me gusta

@sam dado que este complemento ahora es oficial, ¿podríamos hacer que la función “Citar” también funcione correctamente? Al seleccionar texto con matemáticas y luego usar el botón “Citar”, actualmente obtengo todas las matemáticas eliminadas y duplicadas. El código javascript para la función “Citar” podría reconocer las etiquetas html de matemáticas y agregar los $ y/o $$ necesarios en el cuadro de edición, en lugar de eliminarlos y duplicar la cadena matemática.

Además, creo que sería bueno incluir una versión más reciente de Katex en el complemento. La versión incluida tiene más de 2 años, 0.11, mientras que Katex estable es 0.15.2, que es más completa y tiene muchos errores corregidos. Soy consciente del readme, pero poca gente se molestará.

Mathjax 3.x también sería bueno (mucho más rápido que 2.7).

EDITAR: Hay una actualización mucho más fácil de Katex incluido que no requiere compilar Katex desde las fuentes. Simplemente descarga el tarball, copia los archivos, reemplaza la carpeta de fuentes en el css.

wget -O- https://github.com/KaTeX/KaTeX/releases/latest/download/katex.tar.gz | tar -zx
cp katex/fonts/*.woff* /path/to/discourse/plugins/discourse-math/public/katex/fonts/
cp katex/katex.min.* katex/contrib/mhchem.min.js /path/to/discourse/plugins/discourse-math/public/katex/
sed -i "s~url(fonts/~url(/plugins/discourse-math/katex/fonts/~g" /path/to/discourse/plugins/discourse-math/public/katex/katex.min.css
5 Me gusta

Todo esto suena genial, ¿hay alguna posibilidad de que envíes algunas PR para esto?

3 Me gusta

Creado un PR para actualizar KaTeX y también actualizado a la última versión. No uso MathJax yo mismo, así que aún no me he ocupado de eso. En última instancia, Discourse puede querer permitir enlazar a una CDN para estos (permitir al usuario especificar la URL para que pueda arreglar una versión de lanzamiento si lo desea; por defecto al host actual) incluso si va un poco en contra del espíritu de Discourse, ya que estas bibliotecas se actualizan con mucha frecuencia con correcciones y demás.

Lamentablemente, no tengo tiempo para un PR para la corrección de la función “Quote”, estoy demasiado saturado de trabajo estos días, por eso dejé un mensaje esperando que alguien más pueda abordarlo.

4 Me gusta

¡Muchas gracias por la PR @nordize, la fusioné!

5 Me gusta

Recuerdo que este hilo contenía muchos mensajes y discusiones. ¿Qué pasó?

Vine para añadir algunas notas a mi última contribución que hice a principios de este año, así como una mejora para permitir que las macros persistan entre expresiones matemáticas con Katex (ver aquí). ¿Estoy en el hilo equivocado?

Las publicaciones de este tema tienen un temporizador automático para eliminarlas, pero puedo desenterrarlas si deseas moverlas a un tema de estilo Consejos y trucos.

¿Por qué demonios?!? Este plugin es importante y uno de los más populares. La discusión en este tema tenía muchas publicaciones de interés. Escribí al menos una guía en una publicación y confié en que estaría allí para consultarla. Mis colegas e incluso yo marcamos algunas de las publicaciones… ¿y ahora todo ha desaparecido?

Esta es una decisión muy extraña. ¿No era uno de los propósitos de Discourse poder lidiar con temas largos (carga adaptativa y todo eso, etc.)? “Eliminarlas”… ¡seguro que no nos falta espacio! En esta era, la posteridad de la información es más importante. Realmente no entiendo tales decisiones, ya que no estamos en 1990 y, básicamente, dice que la carga todavía recae en el individuo para guardar información y hacer todo lo posible para compartirla desde fuentes locales, porque puede desaparecer en cualquier momento de donde se publicó en línea, lo que fomenta el desperdicio, las molestias, la atención y la organización innecesarias, y disminuye la confianza y la fiabilidad. Ayudar a los usuarios de la comunidad también se vuelve ineficiente y problemático si la información se borra después de 1 mes. Esto anula bastantes propósitos. Se suponía que debíamos ir en la dirección opuesta.

No es una cuestión de vida o muerte, obviamente, no quiero exagerar las cosas, pero aun así… ¿Podrían recuperarlo por completo y quizás reconsiderar esta política de 1 mes en el futuro?

De todos modos, @sam, hice esta PR: katex: enable persistent macros by qnxor · Pull Request #51 · discourse/discourse-math · GitHub, que animo a fusionar porque Mathjax tiene eso por defecto, por lo que las personas que cambian entre Mathjax y Katex tendrían contenido roto. Lo mismo ocurre con las personas que actualizan desde el antiguo plugin.

1 me gusta

¡¿Por qué demonios?!? Este plugin es importante y uno de los más populares. La discusión en este tema tenía muchas publicaciones de interés. Escribí al menos una guía en una publicación y confié en que estaría allí para consultarla. Yo y mis colegas incluso marcamos algunas de las publicaciones… ¿y ahora todo ha desaparecido?
[/quote]

Podría haberlo dicho con más delicadeza. :slightly_smiling_face:

Esperemos (si todo va bien :crossed_fingers:) que cualquier información útil/discusión interesante se haya trasladado a la OP o se haya dividido en un nuevo tema. Existe la posibilidad de que esto no siempre suceda, pero estaré encantado de echar un vistazo y comprobarlo. :+1:

2 Me gusta

Claro, quizás no suficiente café… pero es genial descubrir que las cosas en las que inviertes tiempo (en aras de una comunidad) se tiran por el desagüe. Supongo que debería haber guardado la guía y los scripts que escribí para actualizar desde el antiguo plugin, así como las otras publicaciones que me interesaban, y luego esperar que la gente me pidiera ayuda por correo electrónico. Quién iba a decir que publicarlos en el foro de la comunidad iba a ser la opción más insegura. Sí, no suficiente café…

Nada de eso sucedió aquí, hasta donde yo sé.

Traer de vuelta el tema sería demasiado…? ¡Definitivamente no es suficiente café! :slight_smile:

1 me gusta

¿Creo que tengo todos los correctos? Los he movido del área de temporizador automático a Support, así que deberían estar a salvo de cualquier eliminación. :+1: ¿Algún ajuste o cambio que quieras que haga?