인쇄 보기와 이메일에 렌더링된 Discourse-math 포함

네, Sam의 요약을 정확히 짚었다고 생각합니다: 이메일/인쇄 보기에 렌더링된 수식을 표시하려면 서버 측 수식 렌더링(또는 최소한 서버 측 “프리-렌더링”)이 필요합니다. 이메일 클라이언트는 MathJax를 실행하지 않기 때문입니다.

현실적인 접근 방식은 다음과 같습니다:

  • 쿠킹(cooking) 중(또는 쿠킹 후 백그라운드 작업에서) 수식 스팬을 찾습니다(인라인 + 디스플레이).
  • Node 환경에서 MathJax를 사용하여 각 수식을 SVG(또는 MathML 폴백)로 렌더링합니다.
  • 이메일/인쇄에 사용되는 쿠킹된 HTML의 수식을 다음 중 하나로 교체합니다:
    • 인라인 <svg ...> (가장 높은 충실도, 외부 페치 없음), 또는
    • <img src="data:image/svg+xml;base64,..."> (일부 클라이언트와의 호환성이 더 좋지만 크기가 커질 수 있음).
  • 안정적인 키(예: sha256(latex + display_mode + macros + font_config))로 캐싱하여 고유한 수식당 한 번만 렌더링되도록 합니다.

까다로운 부분(하지만 범위를 조심스럽게 설정하면 관리 가능합니다):

  • DOM 시뮬레이션: MathJax의 “브라우저” 출력이 DOM을 원하므로, mathjax-full + jsdom(또는 순수 어댑터 경로 사용)이 필요할 것입니다.
  • 성능/타임아웃: 작업 큐에서 비동기로 수행하고, 렌더링이 실패하면 우아하게 저하 처리합니다(LaTeX를 그대로 두는 것).
  • 이메일 클라이언트 특이사항: 일부 클라이언트는 SVG를 제거하므로 폴백 계획이 중요합니다(예: 지원되는 경우 평문/LaTeX 또는 MathML).

누군가 빠른 스파이크(spike)를 원한다면, 제가 할 첫 번째 실험은 다음과 같습니다:

  1. mathjax-full을 사용하여 $begin:math:text$E\=mc\^2$end:math:text$를 SVG로 렌더링하는 작은 Node 스크립트,
  2. 그것이 어떤 가정을 하는지 확인(DOM vs 어댑터),
  3. 그런 다음 MiniRacer가 막다른 길인지, 그리고 이 문제를 "Node 사용 가능"으로 취급해야 하는지(또는 작은 서비스로) 결정합니다.

그 스파이크가 성공하면, 어디에 플러그인을 넣을지(이메일 파이프라인 vs 쿠킹 vs 인쇄 보기)와 무엇을 캐시/저장할지에 대해 논의할 수 있습니다.