Очистить HTML-теги во всех постах после миграции?

Привет! Как упоминалось в временном, но рабочем скрипте импорта 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 для выполнения таких преобразований постов?

С нетерпением жду начала обучения.

Кен

Нет, плагин Data Explorer позволяет только читать данные из базы данных сайта. Он не позволяет записывать данные в базу данных сайта.

Привет! Я разобрался, как вручную очистить контент и исправить битые изображения. Однако я хотел бы сделать это в автоматическом режиме.

Моя цель — найти способ удалить все 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/.

Супер, это полностью поставило меня на правильный путь.

Думаю, для моего простого случая достаточно будет rake posts:remap["find","replace"], верно?

Сейчас попробую, огромное спасибо!

Может быть непросто (если вообще возможно) понять, как экранировать [ с помощью этой задачи rake.

Извините, символ “]” я вставил просто потому, что не мог понять, как ввести «<».

Мне нужно лишь удалить несколько таких стандартных HTML-тегов.

Тогда всё должно быть в порядке, верно, с использованием remap?

Вероятно, да. Вы цитируете элементы с помощью обратных кавычек, как здесь:

`<`p`>`

или

`<p>`

Кстати, @koen360,

Когда мы мигрировали наш форум, у нас было бесчисленное количество подобных проблем с 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, отличается от того, что вы видите после выполнения скрипта, то у меня нет объяснения.

Странно, я получаю:

script/cleanup.rb:9: неизвестная опция регулярного выражения - g

когда добавляю g к i вот так:

require_relative ‘../config/environment’

pm = 0
Post.find_each do |test|
puts test.raw
test.raw.gsub!(/<(.|/.)>/ig,“”)
test.save
test.rebake!
pm = pm + 1
end
puts “пройдено #{pm} постов”

Насколько я помню (и именно так мы обычно сопоставляем многострочные строки с помощью gsub…), для регулярного выражения Ruby, работающего с многострочным текстом, требуется модификатор m:

/./m - Любой символ (модификатор m включает многострочный режим)

См.:

Надеюсь, это поможет.

Спасибо, с регулярным выражением всё сработало.

Кажется, есть два момента, которые я не могу объяснить с помощью этого скрипта:

# Вызывайте его так:
# RAILS_ENV=development bundle exec ruby script/cleanup.rb -> cleanup.log

require_relative '../config/environment'
pm = 0
Post.find_each do |test|
	puts test.raw
	test.raw.gsub!(/<(.|\/.)>/im,"")
	test.save
	test.rebake!
	pm = pm + 1
end
puts "пройдено постов: #{pm}"
  1. После нескольких запусков в cleanup.log всё ещё содержится 10 вхождений <p> примерно в 21 000 строках сырого материала постов. Странно, но они никогда не удаляются.
  2. Ещё более странно (для меня): когда я запускаю unicorn и захожу на сайт с локальной машины, я всё ещё вижу HTML-теги во всех постах, которые проверяю в режиме просмотра сырого текста редактора.

Похоже, я работаю с разным окружением? Может быть, d/unicorn обращается к локальному продакшн-окружению, а мой скрипт вносит изменения в dev?

Сначала пытаюсь всё настроить в dev-окружении, используя руководство по Docker локально, прежде чем переходить к живому сайту.

Должно быть, я упускаю какую-то очевидную для новичка вещь. :sweat_smile: