はてなダイアリーのエントリをJekyllへ移行する


あらすじ

はてなダイアリーからJekylに移行したいんだけど、完全に移行し切るには過去の遺産(はてなダイアリーのエントリ)も移したいよ。

はてなのエントリ取得

何はなくともエントリをエクスポートしてこない事には始まらない。管理画面から データ管理 => インポート/エクスポート => はてなの日記データ形式 をDL。

はてな => Jekyll

どうやるか

はてなのエントリをJekyllで見るためには、恐らく2通りの方法がある。


  1. はてなエントリをMarkdown記法に変換して、Jekyllに突っ込む

  2. はてなエントリから記事を作れるようにJekyllにパーサを突っ込む

さて…。

てっく煮ブログさんのJekyll

俺の最強ブログ システムが火を噴くぜ - てっく煮ブログ

自分がどうすればいいのかなーと悩んでいる時、ものすごくタイムリーに移行なされており(タイムリーでした)、かつ自分のやりたい事(はてなエントリの移行など)を全てプラグインなどで実現されていたためすぐにGitHubを見に行きました。

nitoyon/tech.nitoyon.com ・ GitHub

$ git clone https://github.com/nitoyon/tech.nitoyon.com.git

ぐ…中身は結構複雑。

ソースを見る前にローカルで動くか見せてもらおうっと。

$ vi Gemfile

gem 'jekyll'
gem 'hparser'
gem 'sass'
gem 'RedCloth'
gem 'rdiscount'


これで bundle exec jekyll --server で行けるかと思ったけど、なんか色々ないって言われる。

どうやらまだgemが最新版になっていないらしい(gemからJekyllを持ってくると、多分 JEKYLL_HOME/lib/jekyll/tags/post_url.rbがないとか言われる)ので、GitHubから最新版を持ってくる。

$ git clone git://github.com/mojombo/jekyll.git # fa8400ab61cb8df176f9fb2ec52d85f93c7418a7より新しければ大丈夫そう
$ git clone git://github.com/hotchpotch/hparser.git # 4fbeefc8becc45ed18bf374bec9a2d862db473d5より以下同文

Jekyllとhparserはこれに置き換え。これで実行すると…おお、自分のローカルでてっく煮ブログが…!

なんとなく動かして、どうなっているか色々見てみる。

コンバート

それでは、いよいよはてなのエントリ.xmlをhogehoge.htn * n個 のファイルにコンバートする。以下の作業は全て上記のてっく煮さんのブログをcloneした中を間借りして行なっている。己のリポジトリで行なってもできる。


  • Gemfileに nokogiri を追加する

$ vi Gemfile

gem 'nokogiri' # コンバート用



  • _scripts/ 直下に _posts_caches ディレクトリを作る

  • bundle exec ruby convert_hatena_to_jekyll_posts.rb HATENA_ID はてなのエントリ.xml を実行!

  • ……が、途中で止まる。どうやらUrl先のtitleを探しに行くとき、対象が404だった場合例外を吐くらしい


対象のコンテンツが 404 になっている場合には例外が出てスクリプトが停止します。
その場合は _caches/url_title.json に手動でエントリを追加する、元のエントリを
修正する、などして回避してください。


との事なので、止まっては修正止まっては修正。最後まで行くと、hogehoge.htnの山が_posts下に築かれる。

※ これをskipがなくなるまでやる(スーパーpreの中の文頭にアスタリスクがあるとダメみたい(Gitのグラフなどダメだった))

……が。あれ? はてなダイアリーの記事のタグが複数あってもhogehoge.htnにコンバートされると先頭の1個しか指定してくれていない?

parse_dayメソッドをいじってみる…。

    unless m = title.match(/^\*([^*]+)\*(\[.*\])(.*)/)

     tags[0].gsub!("][", ",")
tags[0].gsub!("[", "")
tags[0].gsub!("]", "")
tags = tags.join(",")
tags.gsub!(",", ", ")

content = {
"layout" => "post",
"title" => name_ja,
"description" => "",
"catecory" => "",
"tags" => tags + "]",
"old_url" => "http://d.hatena.ne.jp/#{hatena_id}/#{old_url}",
}.to_yaml

content.gsub!("tags: ", "tags: [")

content = content + "---\n" + convert_text(text, hatena_id)


これで、やりたいことができた……。

が、yamlの扱い方がよくわからん。hogehoge.htnファイルのtagsとして tags: [aaa, bbb, ccc] って出力したかったんだけど、配列の記述のまま "[aaa, bbb, ccc]" to_yamlすると hogehoge.htn内で ! ' [aaa, bbb, ccc] ' こう出力されてしまったので力技でうまくいくように。

まあ一回しか変換しないしいっか……。

これではてなダイアリーの全ての記事がhogehoge.htnとして _posts ディレクトリに生成された。

あとはこれを己のJekyllの _posts に放り込み、コンバートは完了。

起動/変換

最後にJekyllでhogehoge.htnファイルを静的ファイルに変換する。てっく煮さんのpluginがいくつかないと正常に変換されず、途中で止まるかも。

(要確認)とりあえず _plugins 下にこんだけあれば動いた。ここははてなダイアリーで使っている記法による?amazonを使ってなければamazon.rbはいらないかもしれない。

converters
┣ hatena.rb
┣ ext
┃┗ post_to_liquid_raw.rb
┣ filters
┃┣ json_filter.rb
┃┣ locale_filter.rb
┃┗ simplify_rss_description.rb
┗ tags
┣ amazon.rb
┣ post_link.rb
┣ tweet.rb
┣ twitter.rb
┗ youtube.rb

プロジェクトのGemfileでは Jekyllhparser をGutHubから最新のものを持ってくればそれで良いかな。(そのうちgemでも取れるようになると思うが)あと albino じゃなくて pygments.rb を使うようにする。

自分用TODO


  • おかしい

    • 2009-10-19-1255949562.htn

    • 2011-05-01-1304204171.htn

    • 2011-10-08-1318068887.htn

    • 2011-11-27-1322329546.htn

    • 2011-11-28-1322482230.htn

    • 2011-12-16-1324086694.htn