特定の条件を満たす(Scrapboxの)スクラップを抽出して別プロジェクトへコピーする
やってみた系の記事です。
Scrapbox[1]を利用している際に、あるプロジェクトのページのうち一部を別プロジェクトにコピーしたいと思うことがありました。
やってみたら案外簡単にできたので備忘録として記事に残しておこうと思います。
やりたいこと
- 移行元のプロジェクトにあるページのうち、特定の条件を満たすようなページを別のプロジェクトへコピーする
- ここでの特定の条件とは、以下に示すもののうちどちらかを満たすものとする
- ページタイトルに特定の文字列を含む(文字列の例:
本
) - ページ本文に特定のタグ[2]を含む(タグの例:
#book
)
- ページタイトルに特定の文字列を含む(文字列の例:
つまり、タイトルに「本」を含んでいるか、あるいは#bookというタグを持つスクラップを別のプロジェクトへコピーするということです。
方法
Scrapboxにはプロジェクト内のページをインポートおよびエクスポートする機能[3]があります。エクスポート機能ではプロジェクトのデータを表すJSONのファイルを取得でき、インポート機能ではJSONのファイルを使ってページを作成することができます。
今回は移行元のプロジェクト内容をエクスポートし、得られたJSONにふるいを掛けることで目的のページデータのみを残したJSON形式のファイルを作成します。作成したファイルを移行先のプロジェクトにインポートすれば、目的であったページのコピーが実現できることになります。
JSONのデータにふるいを掛ける部分についてはRustを利用して実現しました。JSONのシリアライズ・デシリアライズにはserdeとserde_jsonを使っています。
作ったもの
今回書いたスクリプトを載せておきます。
清々しいほどにエラーハンドリングをしていないコードです。流用する場合は注意してください。
解説
大したことはしていませんが簡単に解説をします。
構造体を定義している部分について、これはインポート時に必要なJSONのフォーマットを眺めて決定しました。インポート時に必要なJSONはエクスポートしたJSONからいくつかのフィールドを削ったものと同じであるため、In/Outで別のデータ構造を用意する必要がありませんでした。また、エクスポートされたJSONのうち余分なフィールドは、デシリアライズ時にデータ自体を削っています。これは未知のフィールドが無視されるというserdeデフォルトの挙動によるものです。
次に全体的な処理の流れについてです。素朴にファイル内容を読み込んでfilterをかけ、結果をシリアライズしてファイルに書き出しています。巨大なJSONを読ませる場合には改善が必要になるかもしれませんが、今回は移行元のページが560個ほど、抽出されたページは25個ほどだったためか特に問題は起きませんでした。
Discussion