Math should be quotable

Discourse Math è stato notevolmente aggiornato a gennaio 2026 a una nuova versione ufficiale inclusa nel core, con MathJax 4.1 come predefinito e KaTeX come alternativa. La documentazione del plugin nota anche che KaTeX include l’estensione CopyTex per copiare il sorgente LaTeX.

Valrebbe la pena aggiungere una piccola patch di theme-component che migliori la selezione delle citazioni per i post con molta matematica?

Per i siti con molta matematica in MathJax, come Physics with Ethan, l’idea più pratica è:

  1. Intercettare l’HTML selezionato prima che Discourse lo riconverta in Markdown,
  2. Trovare gli elementi contenitori della matematica,
  3. Sostituirli con la loro sorgente TeX originale racchiusa in $...$ o $$...$$,
  4. Quindi lasciare che Discourse continui a costruire la citazione.

Ecco un potenziale script di theme-component con cui inizierei, se valga la pena modificare l’area </head> o JS del tema Horizon (o Default).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 comunemente memorizza la sorgente in un figlio di annotazione.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

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

        // Euristica: i contenitori di matematica a blocco sono spesso contenitori di visualizzazione.
        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);

          // Sostituisci il buffer che Discourse converte successivamente in markdown di citazione.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Fallisci silenziosamente in modo che la normale quotazione continui a funzionare.
          console.warn("La patch di citazione matematica è fallita:", e);
        }
      },
    });
  });
</script>

Alcune importanti avvertenze:

  • Questa è una patch pratica, non qualcosa che ho trovato già pubblicato da Meta. La strategia sottostante è dedotta dal percorso di citazione che passa attraverso l’HTML selezionato e aMarkdown.
  • È più probabile che sia utile quando sto usando il provider MathJax, che è quello predefinito in Discourse Math, e l’opzione che uso di solito.
  • Lo script potrebbe necessitare di piccole modifiche ai selettori a seconda che la mia matematica renderizzata finisca come mjx-container, .MathJax o un altro contenitore. Lo proverei su un sito di staging, che sarebbe una nuova installazione standard.
  • È improbabile che sia perfetto per ogni caso limite, specialmente per selezioni miste inline/blocco o materiale citato annidato.

Poiché Discourse ora supporta ufficialmente KaTeX con CopyTex, un’altra strada è cambiare provider se il mio problema principale è copiare il sorgente LaTeX piuttosto che la fedeltà di rendering. Questo non risolverebbe automaticamente la selezione della citazione, ma significa che la matematica renderizzata ha già un percorso più facile da copiare integrato.

Per il mio sito con molta matematica, Physics with Ethan, al momento sto pensando:

  • mantenere MathJax a meno che qualcuno non suggerisca di passare a KaTeX? ,
  • forse aggiungere una patch di selezione citazione al tema Horizon, da quanto sopra (usando un sito di staging).
  • e trattarlo come una correzione locale per la qualità della vita fino a quando non ci sarà una soluzione upstream adeguata. Il fatto che questa discussione sulla funzionalità del 2020 sia ancora aperta nel 2026 suggerisce che l’upstream potrebbe rimanere lento qui.
2 Mi Piace