nordize
(Nordize)
1
我仍然安装了旧的“Discourse Mathjax”插件。有人成功地将他们的帖子转换为在新插件下正常显示吗?您能否分享一个可行的命令行?
这两个插件并非 100% 兼容,因为如果我只激活新插件,某些内容将会损坏。
例如,新插件要求在 \\begin{...}...\\end{...} 块前后使用双 $$,例如 \\begin{align}...\\end{align}(没有双 $$)在旧插件中会被渲染为数学公式,但在新插件中则不会。
要转换这些内容,我会抓取所有内容,然后进行正则表达式搜索替换,在 \\begin{..}/\\end{..} 前后添加双 $$(但嵌套的此类块将是一个问题)。可能还有其他内容会出现损坏的情况,我尚未发现(这是一个有 5 年历史的论坛,包含大量数学内容)。
1 个赞
nordize
(Nordize)
2
好吧,我花了比我承认的还要多的时间来转换和修复升级到新数学插件后损坏的内容,所以我在这里发布了我使用的重要命令(请原谅丑陋的 hackery,我太懒了)。仍然需要一些手动修复内容,但在我们这里并不多。
注意: 这仅供参考。请记住“我概不负责……”的诗。如果不理解,请不要盲目运行。
# 将 \\\\ 替换为 \\ (这也会将 \\\\\\\\ 翻译为 \\\\)
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(/(\u003e\s*)\$\$(.*?)\$\$\s*?\n/m,"\\1\u003e $$\\2\u003e $\n\u003e"); 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 "";
2 个赞
nordize
(Nordize)
3
@sam 既然这个插件现在是官方的,我们能否也让“引用”功能正常工作?当选择带有数学公式的文本然后使用“引用”按钮时,我目前得到的是所有数学公式都被剥离但又重复了。 “引用”功能的 JavaScript 代码可以识别数学公式的 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
5 个赞
sam
(Sam Saffron)
4
这一切听起来都很棒,你有没有可能为这个提交一些 PR?
3 个赞
nordize
(Nordize)
5
已创建 PR 来更新 KaTeX,并已将其更新至最新版本。我个人不使用 MathJax,所以暂时没有处理它。最终 Discourse 可能希望允许链接到这些库的 CDN(允许用户指定 URL,以便他们可以修复某个发布版本,如果他们愿意的话;默认为当前主机),即使这有点违背 Discourse 的理念,因为这些库更新非常频繁,包含各种修复。
可惜的是,没有时间为“引用”功能的修复创建一个 PR——最近工作实在太忙了,这就是为什么我发消息希望其他人能处理它。
4 个赞
nordize
(Nordize)
7
我记得这个帖子有很多消息和讨论——发生了什么?
我来这里是为了在我今年早些时候的最新贡献中添加一些注释,以及一项改进,允许宏在 Katex 的数学表达式之间持久化(参见 此处)。我是否在错误的帖子中?
此主题中的帖子将自动清除,但我可以为您挖掘任何帖子,如果您想将它们移至“技巧与窍门”风格的主题?
nordize
(Nordize)
9
为什么?!这个插件很重要,而且是最受欢迎的插件之一。这个主题的讨论中有许多有价值的帖子。我在帖子中写了至少一篇指南,并相信它会一直在那里供我参考。我和我的同事们甚至收藏了其中一些帖子……现在它们都消失了?
这是一个非常奇怪的决定。难道 Discourse 的目的之一不是能够处理长篇主题(自适应加载等等)吗?“清理它们”……我们肯定不缺空间!在这个时代,信息的传承比什么都重要。我真的不理解这样的决定,现在不是 1990 年了,这实际上意味着责任仍然在于个人保存信息,并费尽心思从本地来源共享信息,因为它可能随时从在线发布的地方消失,这会造成浪费、麻烦、不必要的关注和组织,并降低信任度和可靠性。如果信息在一个月后被清除,帮助社区用户也会变得效率低下和有问题。这违背了几个目的。我们应该朝着相反的方向前进。
这当然不是生死攸关的事情,我不想小题大做,但还是……你能否恢复全部内容,并可能重新考虑未来的一月政策?
另外,@sam - 我提交了这个 PR:https://github.com/discourse/discourse-math/pull/51,我鼓励合并它,因为 Mathjax 默认就有这个功能,所以切换 Mathjax 和 Katex 的用户会遇到内容损坏的问题。对于从旧插件升级的用户来说也是如此。
1 个赞
我本可以更委婉地表达。 
希望(一切顺利
)任何有用的信息/有趣的讨论都已被移至 OP 或拆分到新主题中。有可能这并不总是会发生,但我很乐意查看一下。 
2 个赞
nordize
(Nordize)
11
当然,可能是咖啡因不够……但很高兴发现你为社区投入时间的东西被白白浪费了。我想我应该保存我为升级旧插件而编写的指南和脚本,以及我感兴趣的其他帖子,然后希望人们通过电子邮件向我寻求帮助。谁知道把它们发到社区论坛上会是最不安全的选择。是的,咖啡因不够……
据我所知,这里什么都没有发生。
把这个话题带回来会不会太……?绝对是咖啡因不够! 
1 个赞
我想我已经把所有正确的都弄好了?我已经把它们从自动计时器区域移到了#support,所以它们应该不会被删除。
你想让我做任何调整或更改吗?