Что ж, я потратил больше, чем готов признаться, на конвертацию и исправление повреждённого контента после обновления до нового плагина для математики, поэтому публикую здесь важные команды, которые я использовал (извините за уродливые хаки, просто лень было делать аккуратно). Некоторая ручная правка контента всё ещё потребовалась, но в нашем случае это было не так уж много.
ПРИМЕЧАНИЕ: Это сделано в ознакомительных целях. Помните стихотворение «Я не несу ответственности…». Не запускайте это вслепую, если не понимаете, что делаете.
# Заменить \\ на \ (что также преобразует \\\\ в \\)
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 "";