새 수학 플러그인으로 업그레이드

여전히 구버전 “Discourse Mathjax” 플러그인이 설치되어 있습니다. 새 플러그인으로 게시물을 올바르게 표시되도록 성공적으로 변환하신 분이 계신가요? 작동하는 명령줄을 공유해 주시면 감사하겠습니다.

두 플러그인은 100% 호환되지 않으며, 새 플러그인만 활성화하면 일부 콘텐츠가 깨지는 문제가 있습니다.

예를 들어, 새 플러그인은 \begin{...}...\end{...} 블록 앞뒤에 이중 $$를 요구합니다. 예를 들어 이중 $$ 없이 \begin{align}...\end{align}을 사용하더라도 구버전 플러그인에서는 수식으로 렌더링되지만, 새 플러그인에서는 그렇지 않습니다.

이러한 부분을 변환하려면 모든 콘텐츠를 스크래핑하여 정규식 검색 및 치환을 통해 \begin{..}/\end{..} 앞뒤에 이중 $$를 추가/삽입해야 합니다(하지만 중첩된 블록은 문제가 될 수 있습니다). 아직 발견하지 못한, 콘텐츠가 깨져 보이는 다른 사례들도 있을 수 있습니다(5년 된 포럼으로 수학 콘텐츠가 매우 많습니다).

음, 새 수식 플러그인으로 업그레이드한 후 깨진 콘텐츠를 변환하고 수정하는 데 말하기 민망할 정도로 많은 시간을 보냈습니다. 그래서 여기에서 제가 사용했던 중요한 명령어들을 공유합니다. (조금 지저분한 해킹 기법이지만, 너무 게을러져서 그러네요.) 그래도 수동으로 콘텐츠를 수정해야 하는 부분이 있었지만, 우리 경우에는 그렇게 많지 않았습니다.

참고: 이는 영감을 위한 목적입니다. "나는 아무 책임도 지지 않는다…"라는 시를 떠올려 보세요. 이해하지 못하는 경우 맹목적으로 실행하지 마십시오.

# \\ 를 \ 로 대체 (이 경우 \\\\ 도 \\ 로 변환됨)
Post.where('raw ~ ?', "\\\\").each{|p| p.raw=p.raw.gsub(/\\\\/, "\\"); p.save; print "."; $stdout.flush;}; puts "";

# {align} 을 {aligned} 로 대체하고 모든 별표(*) 버전 제거
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/(begin|end)\{align.*?\}/, "\\1{aligned}"); p.save; print "."; $stdout.flush;}; puts "";

# {array} 를 {matrix} 로 대체하고 모든 별표(*) 버전 제거
Post.where('raw ~ ?', "\\\\begin\\{array").each{|p| p.raw=p.raw.gsub(/(begin|end)\{array\*?\}/, "\\1{matrix}"); p.save; print "."; $stdout.flush;}; puts "";

# `\begin{equation}` 을 `$$` 로 대체
Post.where('raw ~ ?', "\\\\begin\\{equation").each{|p| p.raw=p.raw.gsub(/\s*\\(begin|end)\{equation\*?\}\s*/, "$$"); p.save; print "."; $stdout.flush;}; puts "";

# `$$` 앞뒤에 새 줄 추가
Post.where('raw ~ ?', "\\$\\$").each{|p| p.raw=p.raw.gsub(/\$\$/,"\n$$\n"); p.save; print "."; $stdout.flush;}; puts "";

# `{aligned}` 블록 앞뒤에 `$$` 추가
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/\s*(\\begin\{align)/m,"\n$$\n\\1").gsub(/(\\end\{align.*?\})\s*/m,"\\1\n$$\n"); p.save; print "."; $stdout.flush;}; puts "";

# ... {aligned} 안의 이중 `$$` 수정
Post.where('raw ~ ?', "\\\\begin\\{aligned").each{|p| p.raw=p.raw.gsub(/(\\end\{align.*?\}\n\$\$)\n\$\$/,"\\1").gsub(/\$\$\n(\$\$\n\\begin\{align)/,"\\1"); p.save; print "."; $stdout.flush;}; puts "";

## 위 두 명령어를 {aligned} 외에 가지고 있을 수 있는 다른 환경에 적용

# 다음 항목에 대해서는 수동 수정을 권장합니다:
# `> ` 인용 환경 내에 `$$` 가 나타나는 게시글. 시작과 끝의 `$$` 에만 접두사를 붙여야 하며, 즉 `> $$` 처럼,
# 그 사이의 콘텐츠에는 붙여서는 안 됩니다. 그렇지 않으면 수식보다 부호(>)로 렌더링됩니다.
# 해당 게시글을 식별하려면 다음을 실행하세요:
Post.where('raw ~ ?', ">\\s*\\n\\s*\\$\\$").each{|p| puts "https://discourse.domain.com/p/#{p.id}";};

# ... 또는, 자동 수정을 시도해 보세요. 다만 위험할 수 있습니다.
# (우리는 잘 작동했지만, 몇몇 게시글은 추가적인 수동 작업이 필요했습니다):
Post.where('raw ~ ?', ">\\s*\\n\\s*\\$\\$").each{|p| p.raw=p.raw.gsub(/(>\s*)\$\$(.*?)\$\$\s*?\n/m,"\\1> $$\\2> $$\n>"); p.save; print "."; $stdout.flush;}; puts "";

# 외관상, 선택 사항: 3개 이상의 연속된 새 줄을 2개 새 줄로 대체
Post.where('raw ~ ?', "\\n{3,}").each{|p| p.raw=p.raw.gsub(/\n{3,}/,"\n\n"); p.save; print "."; $stdout.flush;}; puts "";

# 선택 사항: `$$` 앞뒤의 2개 이상의 연속된 새 줄을
# 단일 새 줄로 대체
# 경고: 현재 플러그인 버전에서는 문제없지만, 향후 버전에서는 다르게 표시될 수 있습니다 (?). 예를 들어 실제 LaTeX에서는
# 텍스트 앞의 $$ 뒤의 빈 줄이 세로 간격에 차이를 만듭니다.
Post.where('raw ~ ?', "\\n\\$\\$\\n{2,}|\\n{2,}\\$\\$").each{|p| p.raw=p.raw.gsub(/\n\$\$\n{2,}/,"\n$$\n").gsub(/\n{2,}\$\$/,"\n$$"); p.save; print "."; $stdout.flush;}; puts "";

@sam 이 플러그인이 이제 공식 플러그인이 되었으니, “Quote” 기능도 제대로 작동하도록 수정해 주실 수 있을까요? 수식이 포함된 텍스트를 선택한 후 “Quote” 버튼을 사용하면, 현재는 모든 수식이 제거되고 문자열이 중복되어 나타납니다. “Quote” 기능의 자바스크립트 코드가 수식 HTML 태그를 인식하여 편집 상자에 필요한 $ 또는 $$를 추가하도록 하면, 수식 문자열을 제거하고 중복시키는 문제를 해결할 수 있습니다.

또한, 플러그인에 더 최신 버전의 KaTeX를 번들링하는 것이 좋다고 생각합니다. 현재 번들링된 버전은 2년 이상 지난 0.11 버전인 반면, KaTeX 안정 버전은 훨씬 기능이 풍부하고 많은 버그가 수정된 0.15.2입니다. readme에 대한 내용은 알고 있지만, 많은 사용자가 그걸 확인하기는 어려울 것입니다.

Mathjax 3.x도 좋을 것 같습니다 (2.7보다 훨씬 빠름).

수정: 소스에서 KaTeX를 빌드할 필요 없이 번들링된 KaTeX를 훨씬 쉽게 업그레이드하는 방법이 있습니다. tarball을 가져오고, 파일을 복사하고, css의 폰트 폴더를 교체하면 됩니다.

wget -O- https://github.com/KaTeX/KaTeX/releases/latest/download/katex.tar.gz | tar -zx
cp katex/fonts/*.woff* /path/to/discourse/plugins/discourse-math/public/katex/fonts/
cp katex/katex.min.* katex/contrib/mhchem.min.js /path/to/discourse/plugins/discourse-math/public/katex/
sed -i "s~url(fonts/~url(/plugins/discourse-math/katex/fonts/~g" /path/to/discourse/plugins/discourse-math/public/katex/katex.min.css

모든 내용이 훌륭해 보이는데, 이 부분에 대해 PR을 제출할 수 있을까요?

KaTeX 업데이트를 위해 PR을 생성했고, 최신 릴리스 버전으로도 업데이트했습니다. 저는 MathJax를 사용하지 않아 아직 해당 부분은 건드리지 않았습니다. 궁극적으로 Discourse는 이러한 라이브러리가 매우 자주 수정 및 업데이트되는 점을 고려하여, CDN 링크를 허용하는 기능을 도입할 수 있을 것입니다(사용자가 원하는 릴리스 버전을 고정할 수 있도록 URL을 지정할 수 있게 하고, 기본값은 현재 호스트로 설정). 이는 Discourse의 이념과 약간 어긋날 수 있지만, 실용적인 측면에서 고려해 볼 만합니다.

불행히도 “Quote” 기능 수정을 위한 PR은 만들 시간이 없습니다. 요즘 업무로 인해 바빠서, 다른 누군가가 이 문제를 해결해 주기를 바라는 마음으로 메시지를 남겼습니다.

@nordize 님, PR을 병합해 주셔서 정말 감사합니다!

이 스레드에 많은 메시지와 토론이 있었다고 기억하는데, 무슨 일이 있었나요?

올해早些에 제가 했던 최신 기여에 몇 가지 주석을 추가하고, KaTeX를 사용하여 수학 표현식 사이에서 매크로가 유지되도록 하는 개선 사항(여기 참조)을 추가하러 왔습니다. 제가 잘못된 스레드에 있는 건가요?

이 주제의 게시글은 자동 타이머에 의해 삭제되도록 설정되어 있습니다. 팁&트릭스(Tips&Tricks) 스타일의 주제로 옮기고 싶으시면 원하시는 글을 찾아서 옮겨 드릴 수 있습니다.

도대체 왜 이런 걸까요?!? 이 플러그인은 중요하며 가장 인기 있는 플러그인 중 하나입니다. 이 주제에서의 토론에는 많은 관심 있는 게시글들이 있었습니다. 저는 최소한 하나의 가이드를 게시글로 작성했으며, 나중에 참조할 수 있을 것이라고 믿었습니다. 저와 제 동료들은 심지어 일부 게시글에 북마크를 해두기도 했는데 … 그런데 이제 전부 사라진 건가요?

이것은 매우 이상한 결정입니다. Discourse의 목적 중 하나가 긴 주제에 대응할 수 있는 것(적응형 로딩 등)이 아니었나요? “정리한다” … 분명히 공간이 부족해서가 아니겠죠! 요즘 같은 시대에는 정보의 영속성이 더 중요합니다. 1990년대가 아닌 지금, 온라인에 게시된 정보가 언제든 사라질 수 있다는 것은 개인이 정보를 저장하고, 로컬 소스에서 공유하기 위해 고군분투해야 한다는 부담을 여전히 개인에게 지우는 것과 같습니다. 이는 낭비, 번거로움, 불필요한 주의와 조직화를 초래하고 신뢰와 신뢰성을 떨어뜨립니다. 정보가 1개월 후에 지워지면 커뮤니티 사용자를 돕는 것도 비효율적이고 문제가 많아집니다. 이는 여러 목적을 저해합니다. 우리는 정반대 방향으로 나아가야 했습니다.

물론 생사여탈의 문제는 아니며, 과장하고 싶지 않지만 … 그래도 … 이를 전체적으로 복구하고, 앞으로 이 1개월 정책을 재고해 주실 수 있을까요?

그리고, @sam - 저는 이 PR을 만들었습니다: katex: enable persistent macros - Pull Request #51 - discourse/discourse-math - GitHub Mathjax에는 기본적으로 이 기능이 포함되어 있으므로, Mathjax와 Katex 간에 전환하는 사용자들이 깨진 콘텐츠를 경험하지 않도록 병합을 권장합니다. 오래된 플러그인에서 업그레이드하는 사용자들에게도 마찬가지입니다.

조금 더 신중하게 말했어야 했을 수도 있습니다. :slightly_smiling_face:

(모든 것이 순조롭게 진행된다면 :crossed_fingers:) 유용한 정보나 흥미로운 토론 내용이 OP(첫 번째 게시글)로 이동되었거나 새로운 주제로 분리되었기를 바랍니다. 항상 그런 것은 아니지만, 제가 한번 확인해 보겠습니다. :+1:

아, 아마도 커피가 부족했던 것 같네요… 하지만 커뮤니티를 위해 시간을 투자한 것들이 물거품이 되어버리는 것을 발견하는 건 정말 기분이 나쁘네요. 아마도 구 플러그인에서 업그레이드하기 위해 작성한 가이드와 스크립트, 그리고 관심이 있던 다른 게시물들을 저장해 두었다가 사람들이 이메일로 도움을 요청하길 기다렸어야 했나 봅니다. 커뮤니티 포럼에 게시하는 것이 가장 위험한 선택지일 줄은 누가 알았겠습니까. 네, 커피가 부족했던 것 같네요 …

제가 볼 때 여기서는 그런 일이 전혀 일어나지 않았습니다.

게시물을 되살리는 것은 너무 …? 확실히 커피가 부족했던 것 같습니다! :slight_smile:

모든 게 제대로 된 것 같나요? 자동 타이머 영역에서 #support로 옮겼으니 삭제 위험은 없을 거예요. :+1: 제가 조정하거나 변경할 부분이 있으면 말씀해 주세요.