Bem, gastei mais do que admito para converter e corrigir conteúdo quebrado após a atualização para o novo plugin de matemática, então estou postando aqui os comandos importantes que usei (desculpem a gambiarra feia, fiquei com preguiça). Alguma correção manual do conteúdo ainda foi necessária, mas não muita no nosso caso.
NOTA: Isso é para fins de inspiração. Lembre-se do poema “Não me responsabilizo…”. Não execute isso cegamente se não o entender.
# substitui \\\\ por \\ (que também traduz \\\\\\\\ para \\\\)
Post.where('raw ~ ?', "\\\\\\\\").each{|p| p.raw=p.raw.gsub(/\\\\\\\\/, "\\\\"); p.save; print "."; $stdout.flush;}; puts "";
# substitui {align} por {aligned} e remove todas as versões com asterisco
Post.where('raw ~ ?', "\\\\begin\\{align").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{align.*?\\}/, "\\1{aligned}"); p.save; print "."; $stdout.flush;}; puts "";
# substitui {array} por {matrix} e remove todas as versões com asterisco
Post.where('raw ~ ?', "\\\\begin\\{array").each{|p| p.raw=p.raw.gsub(/(begin|end)\\{array\\*?\\}/, "\\1{matrix}"); p.save; print "."; $stdout.flush;}; puts "";
# substitui `\begin{equation}` por `$$`
Post.where('raw ~ ?', "\\\\begin\\{equation").each{|p| p.raw=p.raw.gsub(/\s*\\(begin|end)\\{equation\\*?}\\s*/, "$$"); p.save; print "."; $stdout.flush;}; puts "";
# adiciona novas linhas antes e depois de `$$`
Post.where('raw ~ ?', "\\$\\$").each{|p| p.raw=p.raw.gsub(/\$\$/,"\\n$$ \\n"); p.save; print "."; $stdout.flush;}; puts "";
# adiciona `$$` antes e depois de blocos `{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 "";
# ... corrige `$$` duplos em `{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 "";
## aplique os dois comandos acima a outros ambientes que você possa ter além de {aligned}
# CORREÇÃO MANUAL RECOMENDADA PARA O SEGUINTE:
# Posts onde `$$` aparecem em `> ` citado `\u003e `. Apenas o `$$` de abertura e
# fechamento devem ser prefixados, ou seja, `\u003e $$`, o conteúdo entre eles não deve
# ou então será renderizado como sinais de maior que de matemática.
# Execute isso para identificar os posts:
Post.where('raw ~ ?', ">\\s*\\n\\s*$$").each{|p| puts "https://discourse.domain.com/p/#{p.id}";};
# ... OU, execute isso para tentar uma correção automatizada, embora arriscada
# (funcionou bem para nós, alguns posts precisaram de mais trabalho manual):
Post.where('raw ~ ?', ">\\s*\\n\\s*$$").each{|p| p.raw=p.raw.gsub(/(\\>\s*)\\$\\$(.*?)\\$\\$\\s*?\\n/m,"\\1\u003e $$\\\\2\u003e $$\n\u003e"); p.save; print "."; $stdout.flush;}; puts "";
# Cosmético, opcional: substitui 3+ novas linhas consecutivas por 2 novas linhas
Post.where('raw ~ ?', "\\n{3,}").each{|p| p.raw=p.raw.gsub(/\n{3,}/,"\n\n"); p.save; print "."; $stdout.flush;}; puts "";
# Opcional: substitui 2+ novas linhas consecutivas antes e depois de `$$`
# por uma única nova linha
# AVISO: tudo bem na versão atual do plugin, mas pode exibir
# de forma diferente em uma versão futura (?). Por exemplo, em Latex real, uma linha vazia
# após $$ antes do texto faz uma diferença no espaçamento vertical.
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 "";