こんにちは。Makeshift but working flarum import script で述べたとおり、Flarum から Discourse へ移行しました。私の最初のサイトであり、皆さんの素晴らしい作業に心底感動しています。心から称賛します。
開発環境では一見問題なさそうだったのが、投稿の移行方法でした。ブラウザ上ではほとんど正常に見えますが、実際には多くのレガシーな HTML タグが含まれており、画像の読み込みやローカルストレージへのインポートなどで問題を引き起こしています。
移行後にすべての投稿から HTML マークアップを削除する賢い方法はありませんか?
別の質問ですが、http から https への URL の修正も多数必要です。
ご支援ありがとうございます。余談ですが、私が提供した Makeshift スクリプトは、Discourse の投稿形式への処理をより適切に行えるよう修正すべきでしょう(これは私のスキルセット外ですが)。
pfaffman
(Jay Pfaffman)
2020 年 12 月 3 日午前 10:53
2
これらの問題はインポーターで修正するのが最も簡単です。すでに公開済みでそれが不可能な場合は、より難しくなります。生のテキストを変更し、投稿を再構築するコードを書くだけです。魔法のようなものはありません、残念ながら。
simon
2020 年 12 月 3 日午後 5:45
3
これは、こちらのトピックで説明されている問題に遭遇されているようです: https://meta.discourse.org/t/fix-broken-images-for-posts-created-by-the-wp-discourse-and-rss-plugins/160773。そのトピックの私の最初の返信で、問題の原因について詳しく説明しています。この問題は、HTML で作成された投稿に含まれる画像に影響します。WP Discourse プラグインや RSS フィードで生成された投稿だけでなく、より広範な影響があることを明確にするため、トピックのタイトルを更新します。
理想的には、Discourse の Markdown パース機能は、他の HTML タグで囲まれた HTML 画像タグも処理できるようになるはずです。ただし、この問題を修正するのは難しい課題だと思います。
はい、私の場合、他のHTMLタグ内に含まれている破損した画像でまさにこの現象が起きています。
手動で修正を始めたのですが、手間がかかるうえ、修正すると投稿が「最新リスト」のトップに移動してしまうという問題もあります。そのため、手動で「トップ移動」をリセットするなどの作業も必要になります。
いくつかの非常に状態の悪い投稿を確認しながら、HTMLタグを除去するロジックを調べて対応を進めようと思います。その後、データベース全体でこの処理を自動化する必要があるかもしれません。その部分についてはData Explorer を使って検討してみます。Data Explorer を使って、これらの投稿変換を行うためのIDEとして機能させることは可能でしょうか?
学習曲線を楽しみにしています。
Koen
simon
2020 年 12 月 4 日午後 6:02
5
いいえ、Data Explorer プラグインはサイトのデータベースからの読み取りのみを許可しており、書き込みは許可していません。
こんにちは。手動で整理し、壊れた画像を修正する方法は見つけましたが、自動化したいと考えています。
やりたいことは、[P]、[/P]、[BR/] といった HTML タグをすべて削除する方法を見つけることです。
フォーラムを検索しましたが、近いものが見つかりませんでした。インポートスクリプトも確認しましたが、Discourse から Discourse へのインポーターは含まれていませんでした。おそらく、以下の処理を行うスクリプトが必要だと考えています。
posts テーブルにアクセス
すべての投稿を反復処理
各投稿に対して以下の処理を実行:
P タグを完全に削除
BR/ を改行文字に置換
URL に対してスマートな処理を実行
画像に対してスマートな処理を実行
おそらくすべての投稿を再ビルド(rebake)
Discourse に関連する議論への案内や、着手できるスクリプトやスニペットをお持ちの方はいらっしゃいますでしょうか?熟練した開発者ではありませんが、動作するものを修正することはできます。
目標を達成できたら、コミュニティに共有いたします。
Koen
pfaffman
(Jay Pfaffman)
2020 年 12 月 21 日午後 6:47
7
以下は、似たような処理を行うコードです。
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 については、何らかの理由で破損していない限り、何か「賢い」処理をする必要はないと思います。
[p] と [/p] を改行に置き換えるには、以下のような処理が考えられます。
post.raw.gsub!(/\/?\[p\]/ig,"\n")
ただし、余分な改行があっても問題ありませんが、改行が必要ない場合は \n を削除することもできます。ただし、私はテストしていないため、このコードはおそらく間違っているでしょう。https://rubular.com/ などでテストしてみてください。
素晴らしい、これで完全に正しい方向に進めました。
私の単純なケースでは、rake posts:remap["find","replace"] で十分でしょうか?
試してみます。ありがとうございます!
pfaffman
(Jay Pfaffman)
2020 年 12 月 21 日午後 10:25
9
その rake タスクで [ をエスケープする方法を特定するのは(可能であればですが)難しい場合があります。
koen360
2020 年 12 月 21 日午後 10:31
10
すみません、その「]」という文字は、「<」の入れ方がわからなかったため、私が入れたものです。
いくつかの標準的な HTML タグを削除するだけで大丈夫です。
その後、リマップを使用すれば問題ないですよね?
pfaffman
(Jay Pfaffman)
2020 年 12 月 21 日午後 10:32
11
おそらくそうです。バッククォートで引用するには、次のようにします。
`<`p`>`
または
`<p>`
neounix
(Dark Matter)
2020 年 12 月 22 日午前 2:33
12
koen360:
remap を使えば問題ないですよね?
余談ですが @koen360
当社のフォーラムを移行した際、約20年間にわたるフォーラム投稿から、無数の bbcode やタグの問題が発生しました。
これらに対しては rake の remap 関数を使用せず、すべて @pfaffman がコードスニペットで示している手法を採用しました。
上記のコードスニペットで gsub() を使用している部分は、移行後(あるいはより理想的には移行中)に生データ投稿をクリーンアップする最良の方法の一つを要約しています。
本番のデータベースに実際に適用する前に必ず正規表現(REGEX)をテストし、このような操作を直接データベースで行う前に完全なバックアップを取得してください。
koen360
2020 年 12 月 22 日午後 10:51
13
こんにちは、以下は RAILS_ENV=development bundle exec ruby script/cleanup.rb で実行している 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"
rake posts:rebake を試しましたが、1757 件の投稿がリベイクされました。一方、このスクリプトは 1712 件の投稿のみを処理しています。これは HTML タグが含まれるインポート済みのデータであり、残りは Discourse で新規作成されたものです。
かなり近づいてきたと思いますが、UI で raw 内容を確認すると、まだすべての HTML タグが表示されてしまいます。
環境の再起動や Unicorn の再起動を試みましたが、効果はありませんでした。あと一歩…あと一歩です ;o)
pfaffman
(Jay Pfaffman)
2020 年 12 月 22 日午後 11:30
14
正規表現はどこかでテストしましたか?生データが正しく変更されたか確認するために、1投稿ずつ処理してください。
Rubular の提案を使って、regexr.com は以下のスクリーンショットのようになりました。今は p タグと r タグに絞って、それらを整理してから、より複雑なものを追加する予定です。
cleanup.rb に、生のポスト内容を CLI に出力する put 文を追加したところ、HTML タグが一切出力されていないことに気づきました。
しかし、ポストを編集すると、右側に HTML タグが表示されるようになります。これは通常の状態ではないようです。なぜなら、再度編集画面に戻ると、HTML タグが表示されなくなるからです。
何か心当たりはありますか?
pfaffman
(Jay Pfaffman)
2020 年 12 月 25 日午後 9:17
17
その gsub は、複数のタグに一致させるために /i の後に g が必要です。ただし、puts で表示される内容とスクリプト実行後の内容が異なる場合、私は説明できません。
neounix
(Dark Matter)
2020 年 12 月 27 日午前 8:33
19
私の記憶では(そして、gsub を使って複数行をマッチさせる一般的な方法では)、Ruby のマルチライン正規表現には m が必要です。
/./m - 任意の文字(m 修飾子はマルチラインモードを有効にします)
参照:
参考になれば幸いです。
koen360
2020 年 12 月 27 日午前 10:22
21
regexp の側からは動作しました、ありがとうございます。
このスクリプトでは説明できないことが 2 つあります:
# 以下のように呼び出します:
# 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}件の投稿を巡回しました"
このスクリプトを数回実行した後、cleanup.log には約 21,000 行の生投稿データの中に <p> タグのインスタンスが 10 件含まれたままになっています。奇妙なことに、これらは決して削除されません。
さらに奇妙なのは(私にとって)、unicorn を起動してローカルマシンでサイトにアクセスすると、エディタの「生表示」で確認するすべての投稿に HTML タグが残っていることです。
おそらく、私は異なる環境を見ていないでしょうか?unicorn はローカルの本番環境を参照している一方、私のスクリプトは開発環境に変更を適用しているのでしょうか?
まずは Docker ガイドに従ってローカルで開発環境を正しく動作させ、その後本番サイトに移行しようとしています。
見落としている初歩的なミスに違いないと思います。