Math should be quotable

Discourse Math a été considérablement mis à jour en janvier 2026 vers une nouvelle version officielle groupée, avec MathJax 4.1 par défaut et KaTeX comme alternative. La documentation du plugin note également que KaTeX inclut l’extension CopyTex pour copier la source LaTeX.

Vaut-il la peine d’ajouter un petit correctif de composant de thème qui améliore la sélection des citations pour les messages contenant beaucoup de contenu mathématique ?

Pour les sites à forte densité de MathJax comme Physics with Ethan, l’idée la plus pratique est la suivante :

  1. Intercepter le HTML sélectionné avant que Discourse ne le reconvertisse en Markdown,
  2. Trouver les éléments d’enveloppement des mathématiques,
  3. Les remplacer par leur source TeX originale encapsulée dans $...$ ou $$...$$,
  4. Laisser ensuite Discourse continuer à construire la citation.

Voici un script de composant de thème potentiel avec lequel je commencerais, s’il est judicieux de modifier la zone </head> ou JS du thème Horizon (ou Défaut).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 stocke couramment la source dans un enfant d'annotation.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

      if (annotation?.textContent?.trim()) {
        const tex = annotation.textContent.trim();

        // Heuristique : les conteneurs mathématiques en bloc sont souvent des conteneurs d'affichage.
        const isBlock =
          el.tagName === "MJX-CONTAINER" &&
          (el.getAttribute("display") === "true" ||
            el.getAttribute("display") === "block");

        return isBlock ? `$$\n${tex}\n$$` : `$${tex}$`;
      }

      return null;
    }

    function patchMathInFragment(fragment) {
      const candidates = fragment.querySelectorAll(
        "mjx-container, .math, .katex, .MathJax"
      );

      candidates.forEach((node) => {
        const replacement = texFromMathElement(node);
        if (!replacement) {
          return;
        }

        const textNode = document.createTextNode(replacement);
        node.replaceWith(textNode);
      });

      return fragment;
    }

    api.modifyClass("component:quote-button", {
      pluginId: "ethan-math-quote-fix",

      _selectionChanged() {
        this._super(...arguments);

        try {
          const selection = window.getSelection();
          if (!selection || selection.rangeCount === 0) {
            return;
          }

          const range = selection.getRangeAt(0);
          const fragment = range.cloneContents();
          patchMathInFragment(fragment);

          const container = document.createElement("div");
          container.appendChild(fragment);

          // Remplacer le tampon que Discourse convertit ensuite en markdown de citation.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Échouer silencieusement pour que la citation normale fonctionne toujours.
          console.warn("Le correctif de citation mathématique a échoué :", e);
        }
      },
    });
  });
</script>

Quelques mises en garde importantes :

  • Il s’agit d’un correctif pratique, pas de quelque chose que j’ai trouvé déjà publié par Meta. La stratégie sous-jacente est déduite du chemin de citation passant par le HTML sélectionné et toMarkdown.
  • Il est plus susceptible d’aider lorsque j’utilise le fournisseur MathJax, qui est la valeur par défaut actuelle dans Discourse Math, et l’option que j’utilise habituellement.
  • Le script pourrait nécessiter de petits ajustements de sélecteur en fonction de si mes mathématiques rendues finissent par être mjx-container, .MathJax, ou un autre enveloppement. Je testerais sur un site de staging, qui serait une nouvelle installation standard.
  • Il est peu probable qu’il soit parfait pour tous les cas limites, en particulier les sélections mixtes en ligne/bloc ou le contenu cité imbriqué.

Étant donné que Discourse prend désormais officiellement en charge KaTeX avec CopyTex, une autre approche consiste à changer de fournisseur si mon principal point de douleur est la copie de la source LaTeX plutôt que la fidélité du rendu. Cela ne résoudrait pas automatiquement la sélection de citation, mais cela signifie que les mathématiques rendues ont déjà un chemin plus facile à copier intégré.

Pour mon site à forte densité de MathJax, Physics with Ethan, je pense actuellement :

  • Garder MathJax à moins que quelqu’un ne suggère de passer à KaTeX ? ,
  • Peut-être ajouter un correctif de sélection de citation au thème Horizon, à partir de ce qui précède (en utilisant un site de staging).
  • Et le traiter comme une correction locale de qualité de vie jusqu’à ce qu’il y ait une solution amont appropriée. Le fait que ce sujet de fonctionnalité de 2020 soit toujours ouvert en 2026 suggère que la solution amont pourrait rester lente à cet égard.
2 « J'aime »