bs2md BathyScapheの過去ログXMLをMarkdownに変換するシェルスクリプト

作品と活動
Markdown
Chat GPT
約2200字

最近取り組んでいる「NASにあらゆるデータを集約してデータベース化する」という趣味の一環で、 20年以上前——小中学生時代に読み漁っていた2chの過去ログをテキストファイルとしてエクスポートする方法が欲しくなった。その当時の1.5GBの過去ログがzipアーカイブとしてバックアップに残っていたからだ。

BathyScaphe自体は「2ch→5ch→JaneStyle事件」という仕様変化を経た今でも現役で利用できる状態になっており、過去ログそのものは現在も閲覧できる。

ただ、全文検索システムで利用するにはMarkdownやプレーンテキストのようなシンプルなテキスト形式に変換したい。

BathyScapheは~/Library/Application Support/BathyScaphe/Documents/に過去ログを板名/DAT番号.threadのような形式で保存する。 このthreadファイルの中身はmacOSのplist形式のXMLで、かなり素直な構造をしている。 そこで、ChatGPTと話しながらいい感じの書式のMarkdownにしてくれるシェルスクリプトを作成した。

バッチ処理もできるため、過去ログディレクトリを指定すれば一括でMarkdownに変換できる。出力は以下のような書式になる。

  • 出力先/新・mac/2003-03-08_Text-to-Speechって面白いですね Part2_1047124728.md
# Text-to-Speechって面白いですね Part2

新・mac
作成日時: 2003-03-08 11:58:00 更新日時: 2004-07-08 16:45:51
DAT: 1047124728

##### <span id="1">1</span> 名前: 名称未設定 Mail:  投稿日: 2003-03-08 11:58:00 ID:hfQmwKNJ

<pre>
  <br> 開け!:「SimpleText」を開く。 <br> 開け!:「Text-to-Speech」で歌わせる。 <br>  <br>  <br> 「Text-to-Speech」はOSのCD-ROMに入っています。 <br> 前スレ、関連リンク、Tipsは<a href="../test/read.cgi/mac/1047124728/2-5">&gt;&gt;2-5</a>あたり   予備で<a href="../test/read.cgi/mac/1047124728/5-10">&gt;&gt;5-10</a> 
</pre>

このMarkdownをGitHubのようなMarkdownレンダラーで閲覧すると、以下のようにそこそこ読める見栄えになる。

レス番にIDを振っているのでちゃんとアンカーリンクも機能する。

使い方

CLIツールなのでターミナルを使う。 macOS Tahoe 26.2 で特に外部ツールに依存なく動作するつもり。

  1. gistから2つのスクリプトをダウンロードしてチェックサムを検証
    cd ~/Desktop
    # 単体処理用スクリプト
    curl -o bs2md_single.sh https://gist.githubusercontent.com/hokkey/e61bf1cc57e388425b9f02012f6dd6b7/raw/bs2md_single.sh
    # バッチ処理用スクリプト
    curl -o bs2md.sh https://gist.githubusercontent.com/hokkey/e61bf1cc57e388425b9f02012f6dd6b7/raw/bs2md.sh
    
    # チェックサム検証
    cat << 'EOF' | shasum -a 256 -c
     68c041fe2bec57c240fd9a5434e73bd44263f3a5362773e55a4110949becfc9b  bs2md_single.sh
     b21a1db5206545bba770089e70c9390534846228106a143bbe04e55586184c8a  bs2md.sh
    EOF
    
    # こうなったら成功
    # bs2md_single.sh: OK
    # bs2md.sh: OK
    
  2. チェックサム検証がOKなら問題はないので、実行権限を付与してから過去ログのあるディレクトリを指定して処理を開始する。環境によっては過去ログのディレクトリへのアクセス許可を求められるかもしれない。
    # 実行権限付与
    chmod +x bs2md_single.sh
    chmod +x bs2md.sh
    
    # 例: ~/Library/Application Support/BathyScaphe/Documents/ に過去ログがある場合
    # HOGEを自分のホームディレクトリ名に変更すること
    ./bs2md.sh "/Users/HOGE/Library/Application Support/BathyScaphe/Documents" ~/Desktop/markdown/
    
  3. 雑な作りなので処理は遅め。全ファイルが処理されるまで待つ
  4. ~/Desktop/markdown/にMarkdown形式で過去ログが出力される

活用例

プレーンなmarkdownファイルなので色々な用途に活用できる。

Webサイト化

たとえばmarkservで出力ディレクトリを指定すれば、そのままWebサイトとして閲覧できる。

全文検索DB化

出力ディレクトリ全体をsist2でインデックスすれば全文検索もできる。もっとも、2chの過去ログは様々なサービスで既に全文検索できるようになっている。「過去の自分が関心を持って閲覧していたログに対して検索や閲覧ができる」という部分にしか独自の価値はないが……。

コード解説

シェルスクリプトは専門外なので要件と引数だけ設計してバイブコーディングで実装。うちのCynic Sci-Fi JPへ以下のプロンプトを投げつけ、1時間ほど試行錯誤して作成した。

BathyScapheのthread形式をMarkdownに出力するスクリプトを作れ。thread形式は正規のplistだ。

サンプルのthreadファイル:添付
Markdownの構造:
# {Title} // スレタイ - 板名

板: {BoardName}
作成日時: {CreatedDate}
DAT: {dat}

## {n} 名前: {Contents[n].Name} Mail: {Contents[n].Mail} 投稿日: {Contents[n].Date} ID:{Contents[n].ID}

{Contents[n].Message}

実装はmacOS上で動作するシェルスクリプトとする。必要なCLIツールがあれば前提としてもよい。出力はUTF-8で、;&amp; などの実体参照はそのまま維持する。元データのHTMLは維持する。
シェルスクリプトの入力値は1:threadファイルへのパス 2:出力先ディレクトリ とする。出力ファイル名は "{BoardName} - {Title}.md" をベースとするが、macOSでファイル名に使えない文字や、Titleの右端に全角スペースや半角スペースが連続する場合はトリムする。
  • bs2md_single.sh: 単体処理用のスクリプト。plistを処理はpython
  • bs2md.sh: ディレクトリ内のthreadファイルを一括で処理するバッチスクリプト。単体処理スクリプトに依存

※投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。