Привет! Как упоминалось в временном, но рабочем скрипте импорта Flarum, я переехал с Flarum на Discourse. Это мой первый сайт, и мне очень нравится ваша работа — спасибо всем вам.
На первый взгляд в режиме разработки всё выглядело отлично: все посты были успешно перенесены. В браузере большинство из них отображаются нормально, но при более глубоком анализе обнаруживается множество устаревших HTML-тегов, которые ломают загрузку изображений, их импорт в локальное хранилище и так далее.
Есть ли умный способ удалить HTML-разметку из всех постов после миграции?
Ещё один вопрос: мне также нужно исправить множество ссылок, заменив http на https.
Спасибо за помощь. Кстати, тот временный скрипт, который я предоставил, определённо стоит доработать, чтобы он лучше обрабатывал посты в формат Discourse (это уже не входит в мои компетенции)…
Проще всего исправить эти проблемы в импортере. Если вы уже вышли в онлайн и это невозможно, то будет сложнее. Вам просто нужно написать код для изменения исходного текста и повторно обработать сообщения. Чудес не бывает, боюсь.
Похоже, вы столкнулись с проблемой, описанной здесь: Fix broken images for posts created by the WP Discourse and RSS plugins. В моём первом ответе в этой теме я подробно объясняю причины возникновения проблемы. Она затрагивает изображения в постах, созданных с использованием HTML. Я обновлю заголовок этой темы, чтобы стало ясно, что проблема касается не только постов, созданных через плагин WP Discourse или RSS-ленту.
В идеале парсер Markdown в Discourse должен уметь обрабатывать теги изображений HTML, обернутые в другие теги HTML. Однако, я думаю, что это сложная проблема для исправления.
Да, это именно тот феномен, который наблюдается с моими битыми изображениями внутри других HTML-тегов.
Я начал исправлять это вручную, но это трудоемкий процесс, к тому же он усугубляется тем, что пост возвращается в начало списка последних. Это требует ручного сброса поднимания и так далее.
Я попробую разобраться с логикой удаления HTML-тегов, изучив несколько очень проблемных постов. Затем, возможно, мне понадобится помощь в автоматизации этого процесса для всей базы данных. Я планирую использовать DataExplorer, чтобы разобраться с этой частью. Позволяет ли DataExplorer действовать как IDE для выполнения таких преобразований постов?
Привет! Я разобрался, как вручную очистить контент и исправить битые изображения. Однако я хотел бы сделать это в автоматическом режиме.
Моя цель — найти способ удалить все HTML-теги, такие как [P], [/P] и [BR/].
Я искал на форуме, но ничего подходящего не нашёл. Проверил скрипты импорта, но там нет импортера из Discourse в Discourse, с которого можно было бы начать. Понимаю, что мне нужен скрипт, который:
обращается к таблице постов;
проходит по всем постам;
для каждого поста:
– удаляет теги P полностью;
– заменяет BR/ на символ новой строки;
– выполняет умную обработку URL;
– выполняет умную обработку изображений;
затем, вероятно, перезапускает процесс пересборки всех постов.
Может быть, кто-то подскажет актуальное обсуждение на Discourse или у кого-то есть скрипт или фрагменты кода, с которых можно начать? Я не опытный разработчик, но могу доработать работающие решения…
Как только достигну цели, обязательно поделюсь результатами с сообществом.
posts=Post.where("raw like '%Sent from%using Tapatalk'")
posts.each do |post|
post.raw.gsub!(/^Sent from my.+?using Tapatalk$/,"")
post.save
post.rebake!
end
Думаю, вам не нужно делать что-то «умное» для изображений или URL, если они каким-то образом не повреждены.
Вам нужно что-то вроде
post.raw.gsub!(/\/?\[p\]/ig,"\n")
чтобы заменить [p] и [/p] на символ новой строки (лишняя новая строка не повредит, но вы можете убрать \n, если считаете, что она не нужна), однако я не тестировал это, поэтому, скорее всего, код неверен. Вы можете протестировать его, например, на https://rubular.com/.
Когда мы мигрировали наш форум, у нас было бесчисленное количество подобных проблем с bbcode и тегами из почти двух десятилетий публикаций на форуме.
Мы не использовали функцию remap в rake для этого и во всех случаях применяли технику, которую описывает @pfaffman в своём фрагменте кода:
Приведённый выше фрагмент кода с использованием gsub() иллюстрирует один из лучших способов очистки сырых сообщений после (или, что ещё лучше, во время) миграции.
Убедитесь, что вы протестировали свои регулярные выражения ПЕРЕД тем, как применять их к базе данных, и сделайте полную резервную копию перед выполнением таких операций напрямую в вашей БД.
Привет, ниже содержимое моего скрипта cleanup.rb, который я запускаю командой: RAILS_ENV=development bundle exec ruby script/cleanup.rb
Содержимое файла:
require_relative '../config/environment'
pm = 0
Post.find_each do |test|
test.raw.gsub!(/<(.|\/.)>/i,"")
test.save
test.rebake!
pm = pm + 1
end
puts "cycled through #{pm} posts"
Я пробовал выполнить d/rake posts:rebake, который обработал 1757 постов. Мой скрипт проходит только по 1712 постам — это импортированные записи с HTML-тегами, а остальные — новые, созданные в Discourse.
Думаю, я уже почти у цели, но при проверке исходного содержимого в интерфейсе я всё ещё вижу все HTML-теги.
Пытался перезапустить окружение и заново запустить unicorn, но безрезультатно. Почти у цели… почти у цели ;o)
Использовал ваше предложение из Rubular, и теперь regexr.com выглядит так (см. скриншот ниже). Пока остановился на тегах p и r, чтобы разобраться с ними, прежде чем добавлять более сложные.
Когда я добавил оператор put в свой небольшой файл cleanup.rb, чтобы вывести содержимое POST-запроса в CLI, я заметил, что теги HTML вообще не выводятся.
Однако при редактировании любого поста я вижу следующее, с тегами HTML справа. Это, похоже, не обычная ситуация, потому что, когда я возвращаюсь редактировать пост, который сейчас редактирую, я не вижу тегов HTML…
В этом gsub нужен символ g после /i, чтобы совпадать с несколькими тегами. Но если то, что вы видите в выводе puts, отличается от того, что вы видите после выполнения скрипта, то у меня нет объяснения.
Насколько я помню (и именно так мы обычно сопоставляем многострочные строки с помощью gsub…), для регулярного выражения Ruby, работающего с многострочным текстом, требуется модификатор m:
/./m - Любой символ (модификатор m включает многострочный режим)
После нескольких запусков в cleanup.log всё ещё содержится 10 вхождений <p> примерно в 21 000 строках сырого материала постов. Странно, но они никогда не удаляются.
Ещё более странно (для меня): когда я запускаю unicorn и захожу на сайт с локальной машины, я всё ещё вижу HTML-теги во всех постах, которые проверяю в режиме просмотра сырого текста редактора.
Похоже, я работаю с разным окружением? Может быть, d/unicorn обращается к локальному продакшн-окружению, а мой скрипт вносит изменения в dev?
Сначала пытаюсь всё настроить в dev-окружении, используя руководство по Docker локально, прежде чем переходить к живому сайту.
Должно быть, я упускаю какую-то очевидную для новичка вещь.