chroju.dev/blog

the world as code

はてなブログからの記事移行を完了した

旧ブログから全記事移行完了しました。ちょっとだけ疲れた。

もともとはてなブログで記事を書いてたわけですが、こちらは記事のエクスポート形式がMovableType形式にしか対応してないので、そこからMarkdownに変換し直したりだとか、はてなキーワードリンクを削除したりとか、地道にいろいろやらねばならず。たぶんスクリプトでガチャーンと一発でやれるんでしょうけど、力が足りないのでvimでファイル開いて変換ポイント確認してはポチポチコマンドで置換してやりました。

エクスポートファイルの分割

はてなブログからエクスポートすると、最初は全記事が1ファイルに連なった状態で吐かれます。自分はMT使った経験ないんでわかりませんが、これは「そういうもの」と考えていいんですかね。一方のoctopressはエントリーごとに分割されているので、まずはこのエクスポートファイルを1記事ずつ分割してやらなくてはならない。あとヘッダの形式も微妙に両者で異なるので、ここの変換も必要。

なんか変換ツール落ちてないかなと堕落した感じで探しまわってたら、一応ありました。

名前がMT to Markdownなので完全にMarkdownへ変換してくれるものかと期待したのだけど、実際やってくれるのは先ほど挙げた「分割」と「ヘッダの書き換え」程度です。中身はHTMLタグのまま。一方で自分の環境だと<&lt;に変わってしまうといった副作用もあり。あと元のヘッダにあったBASENAMEだとかCONVERT BREAKSといった文字列がそのまま本文内に残ってたり。。。ちょっと謎。ただ、変換が楽になるのは確か。

vimによる置換

スクリプト力弱いので、あとはvimによる力技です。今回初めて複数ファイルを一挙にvimで扱うってやったけど、便利ですね。

vimではバッファリストがあるのは知っていたけど、一方で引数リストっていうのもあって、:args hoge.txt fuga.txtとかでファイルリストを作れます。元々は名前の通り、vimを起動するときに与えた引数が入ってるリストらしいのだけど、任意に書き換えができるのであまり「引数」リストという感じはしない。バッファ内の全ファイルへのコマンド実行は:bufdoで出来るし、引数リストについても似た感じで:argdoが使える。このあたりを上手く活用すれば、今回のような複数ファイルを一挙に処理するのはたやすい。

例えば先の&lt;<に全置換したり。他にも置換コマンドはh1タグを#に変換するだとか、いろいろな形で使いました。

:argdo %s/&lt;/</g

CONVERT BREAKSと書かれた行を全部消したり。

:argdo g/CONVERT BREAKS/d

自分が今回初めて身に付けた知識でもっとも有効だったのは、検索でマッチした文字列を置換後の文字列内で指定する方法ですかね。検索パターンの括弧でくくった部分(vimなのでエスケープして\(\)で囲った部分、ということになりますが)を、置換パターンから\1で指定できる。これははてなキーワードのリンクを一掃するのに役立ちました。

:argdo %s/<a class="keyword"\(.\{-}\)<\/a>/\1/g

あー、あとこのコマンドで重要なのは{-}の部分ですかね。これで最短マッチになるらしい。他、細かなとこだと改行コードを入力するには<C-v><C-m>と打つとか、<C-r>/で直前の検索パターンをコマンドラインに入力できるとか、いろいろこの機会に調べられてタメになりました。

参考

ファイルのリネーム

また先のコードで分割したMarkdownファイルは自動的にファイル名も振ってくれるんですけど、日本語の場合は漢字をなんとなく頑張って読んでローマ字に変換してくれた、気持ちはありがたいけど残念な感じのものになっちゃいます。なのでこれも一括変換。

ファイル名一括変換だとrenameコマンドってのがあるのですね。Linuxだと標準で入ってるけどUNIX系にはないだとか。なのでMacにも入ってなかったので、Homebrewでインストール。

$ brew install rename

使い方としてはrename 's/hoge/fuga/' *.markdown形式が使える、要はvimの置換コマンドっぽく書けるので、vimmerならこれが便利ではないかと。正規表現も当然使えます。ただし、vimで必要なあの面倒くさいエスケープの数々が要らなくなっていたり、先ほど書いた\1によるマッチ文字列の流用が$1に変わっていたり、若干の使用感の違いはあります。でも便利。

参考

そんなこんなで記事の変換が終わったら、あとはoctopressのレポジトリで/source/_postsの中に全ファイルブチ込んでrake generateかければ生成されます。最初はちょっと戸惑いもありましたが、やれてしまうと案外簡単に移行できるなという感じです。