Обновление до нового плагина Math

У меня всё ещё установлен старый плагин «Discourse Mathjax». Кто-нибудь успешно конвертировал свои сообщения для корректного отображения с новым плагином? Не могли бы вы поделиться рабочим примером команды командной строки?

Эти два плагина не полностью совместимы: если просто активировать новый, часть содержимого будет отображаться некорректно.

Например, новый плагин требует двойных $$ до и после блоков \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, раз этот плагин теперь официальный, не могли бы мы, пожалуйста, исправить работу функции «Цитата»? При выделении текста с формулами и нажатии кнопки «Цитата» сейчас все формулы удаляются, а затем дублируются. JavaScript-код функции «Цитата» должен распознавать HTML-теги для формул и добавлять необходимые $ и/или $$ в поле редактирования, вместо того чтобы удалять их и удваивать строку с формулой.

Также, думаю, было бы неплохо включить в плагин более свежую версию KaTeX. Включённая версия — 0.11, которой уже более двух лет, тогда как стабильная версия KaTeX — 0.15.2, которая более функциональна и содержит множество исправлений ошибок. Я знаю о readme, но мало кто будет его читать.

Также было бы здорово добавить MathJax 3.x (он намного быстрее 2.7).

РЕДАКТИРОВАНИЕ: Существует гораздо более простой способ обновления встроенного KaTeX, не требующий сборки из исходного кода. Достаточно скачать архив, скопировать файлы и заменить папку со шрифтами в 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 по этому поводу?

Создал PR для обновления KaTeX и также обновил его до последней версии. Сам не использую MathJax, поэтому пока не стал заниматься этим. В конечном итоге Discourse, возможно, захочет разрешить подключение к CDN для этих библиотек (позволить пользователю указывать URL, чтобы при желании можно было зафиксировать конкретную версию; по умолчанию использовать текущий хост), даже если это немного противоречит философии Discourse, так как эти библиотеки очень часто обновляются с исправлениями и прочими улучшениями.

К сожалению, у меня нет времени на создание PR для исправления функции «Цитата» — сейчас слишком много работы, поэтому я оставил сообщение в надежде, что кто-то другой сможет это исправить.

Огромное спасибо за PR @nordize, мы его уже приняли!

Я помню, что в этой теме было много сообщений и обсуждений — что случилось?

Я хотел добавить несколько заметок к своему последнему вкладу, сделанному ранее в этом году, а также предложить улучшение для сохранения макросов между математическими выражениями с помощью Katex (см. здесь). Не в ту ли тему я попал?

Посты в этой теме автоматически удаляются по таймеру, но я могу восстановить любой из них, если вы захотите перенести их в тему в стиле «Советы и хитрости»?

Зачем, черт возьми?! Этот плагин важен и является одним из самых популярных. Обсуждение в этой теме содержало множество интересных постов. Я написал как минимум один гайд в одном из постов и был уверен, что он останется там для ссылок. Я и мои коллеги даже добавили некоторые посты в закладки… и теперь всё это исчезло?

Это очень странное решение. Разве одна из целей Discourse не заключалась в том, чтобы иметь возможность работать с длинными темами (адаптивная загрузка и всё такое)? «Удалять их»… surely мы не испытываем нехватки места! В наши дни наследие информации гораздо важнее. Я действительно не понимаю таких решений, ведь это уже не 1990 год, и по сути это означает, что ответственность всё ещё лежит на отдельном пользователе — сохранять информацию и прилагать невероятные усилия, чтобы делиться ею из локальных источников, потому что она может исчезнуть в любой момент из того места, где была опубликована онлайн. Это поощряет расточительство, создаёт неудобства, требует лишнего внимания и организации, а также снижает доверие и надёжность. Помощь пользователям сообщества становится неэффективной и проблематичной, если информация стирается через 1 месяц. Это противоречит нескольким целям. Мы должны были двигаться в противоположном направлении.

Конечно, это не вопрос жизни и смерти, я не хочу раздувать из мухи слона, но всё же… Не могли бы вы восстановить всё в полном объёме и, возможно, пересмотреть эту политику удаления через 1 месяц в будущем?

В любом случае, @sam — я создал этот PR: katex: enable persistent macros by qnxor · Pull Request #51 · discourse/discourse-math · GitHub, который я настоятельно рекомендую слить, так как Mathjax по умолчанию поддерживает это, поэтому у людей, переключающихся между Mathjax и Katex, контент будет сломан. То же самое касается людей, обновляющихся со старого плагина.

Возможно, я выразился не слишком деликатно. :slightly_smiling_face:

Надеюсь (если всё пойдёт по плану :crossed_fingers:), что любая полезная информация или интересное обсуждение были либо перенесены в первое сообщение темы, либо выделены в отдельную тему. Есть вероятность, что так происходит не всегда, но я готов проверить это. :+1:

Конечно, возможно, не хватило кофе… но неприятно обнаруживать, что время, потраченное на что-то (ради сообщества), было потрачено впустую. Думаю, мне стоило сохранить руководство и скрипты, которые я написал для обновления с старого плагина, а также другие посты, которые меня интересовали, и надеяться, что люди будут обращаться ко мне за помощью по электронной почте. Кто мог подумать, что размещение их на форуме сообщества окажется самым небезопасным вариантом. Да, не хватило кофе…

Ничего из этого здесь, насколько я могу судить, не произошло.

Восстановление темы было бы слишком…? Определённо не хватило кофе! :slight_smile:

Думаю, я выбрал все правильные? Я переместил их из области авто-таймера в Support, так что они должны быть в безопасности от удаления. :+1: Есть ли какие-то корректировки или изменения, которые вы хотите, чтобы я внес?