Math should be quotable

O Discourse Math foi amplamente atualizado em janeiro de 2026 para uma nova versão oficial incluída no núcleo, com MathJax 4.1 como padrão e KaTeX como alternativa. A documentação do plugin também observa que o KaTeX inclui a extensão CopyTex para copiar a origem LaTeX.

Valeria a pena adicionar um pequeno patch de componente de tema que melhora a seleção de citações para posts com muito conteúdo matemático?

Para sites com uso intensivo de MathJax, como o Physics with Ethan, a ideia mais prática é:

  1. interceptar o HTML selecionado antes que o Discourse o converta de volta em Markdown,
  2. encontrar os elementos de encapsulamento de matemática,
  3. substituí-los pela sua fonte TeX original encapsulada em $...$ ou $$...$$,
  4. então deixar o Discourse continuar construindo a citação.

Aqui está um potencial script de componente de tema com o qual eu começaria, se valer a pena modificar a área de </head> ou JS do tema Horizon (ou Padrão).


<script type="text/discourse-plugin" version="1.0">
  apiInitializer("1.34.0", (api) => {
    function texFromMathElement(el) {
      // MathJax v3/v4 comumente armazena a fonte em um filho de anotação.
      const annotation =
        el.querySelector('annotation[encoding="application/x-tex"]') ||
        el.querySelector('annotation');

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

        // Heurística: wrappers de bloco de matemática são frequentemente contêineres de exibição.
        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);

          // Substitui o buffer que o Discourse converte posteriormente em markdown de citação.
          if (this.quoteState) {
            this.quoteState.buffer = container.innerHTML;
          }
        } catch (e) {
          // Falha silenciosamente para que a citação normal ainda funcione.
          console.warn("Math quote patch failed:", e);
        }
      },
    });
  });
</script>

Algumas ressalvas importantes:

  • Este é um patch prático, não algo que encontrei publicado pela Meta. A estratégia subjacente é inferida do caminho da citação passando pelo HTML selecionado e paraMarkdown.
  • É mais provável que ajude quando estou usando o provedor MathJax, que é o padrão atual no Discourse Math, e a opção que costumo usar.
  • O script pode precisar de pequenos ajustes nos seletores, dependendo se a minha matemática renderizada acaba como mjx-container, .MathJax ou outro wrapper. Eu testaria em um site de staging, que seria uma nova instalação padrão.
  • É improvável que seja perfeito para todos os casos extremos, especialmente seleções mistas inline/bloco ou material citado aninhado.

Como o Discourse agora suporta oficialmente o KaTeX com CopyTex, outra abordagem é mudar o provedor se o meu principal ponto de dor for copiar a fonte LaTeX em vez da fidelidade de renderização. Isso não resolveria automaticamente a seleção de citação, mas significa que a matemática renderizada já tem um caminho mais amigável para cópia integrado.

Para o meu site com uso intensivo de MathJax, Physics with Ethan, estou atualmente pensando:

  • manter o MathJax, a menos que alguém sugira que eu mude para KaTeX? ,
  • talvez adicionar um patch de seleção de citação ao tema Horizon, a partir do acima (usando um site de staging).
  • e tratá-lo como uma correção local de qualidade de vida até que haja uma solução upstream adequada. Este tópico de recurso de 2020 ainda estar aberto em 2026 sugere que o upstream pode permanecer lento aqui.
2 curtidas