Inclure Discourse-math cuit dans la vue d'impression et les e-mails

Oui, je pense que le résumé de Sam est exact : si nous voulons que les e-mails / la vue d’impression affichent les maths rendues, nous avons besoin d’un rendu des maths côté serveur (ou au moins d’un « pré-rendu » côté serveur), car les clients de messagerie n’exécuteront pas MathJax.

Une approche réaliste serait :

  • Pendant la cuisson (ou dans un travail d’arrière-plan après la cuisson), trouver les spans mathématiques (en ligne + affichage).
  • Rendre chaque expression en SVG (ou MathML en secours) en utilisant MathJax dans un environnement Node.
  • Remplacer les maths dans le HTML cuit utilisé pour les e-mails/l’impression par :
    • \u003csvg ...\u003e en ligne (meilleure fidélité, pas de récupération externe), ou
    • \u003cimg src=\"data:image/svg+xml;base64,...\"\u003e (plus compatible pour certains clients, mais peut devenir volumineux).
  • Mettre en cache avec une clé stable (par exemple, sha256(latex + display_mode + macros + font_config)), afin de ne rendre qu’une seule fois par formule unique.

Les points délicats (mais gérables s’ils sont délimités avec soin) :

  • Simulation de DOM : La sortie « navigateur » de MathJax veut un DOM ; nous aurions donc probablement besoin de mathjax-full + jsdom (ou d’utiliser la voie de l’adaptateur pur).
  • Performance / délais d’attente : le faire de manière asynchrone dans une file d’attente de tâches et dégrader gracieusement (laisser le LaTeX tel quel si le rendu échoue).
  • Particularités des clients de messagerie : certains clients suppriment les SVG ; avoir un plan de secours est donc important (par exemple, texte brut/LaTeX, ou MathML là où il est pris en charge).

Si quelqu’un souhaite faire un essai rapide, la première expérience que je ferais serait :

  1. Un tout petit script Node utilisant mathjax-full pour rendre $begin:math:text$E\\=mc\\^2$end:math:text$ en SVG,
  2. Voir quelles hypothèses il fait (DOM vs adaptateur),
  3. Décider ensuite si MiniRacer est une impasse et si nous devons traiter cela comme « nécessite Node disponible » (ou un petit service).

Si cet essai fonctionne, nous pourrons discuter de l’endroit où il s’intègre (pipeline d’e-mail vs cuisson vs vue d’impression), et de ce que nous mettons en cache/stockons.