はてなダイアリーのエントリを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

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2012/10/10 [Jekyll] [Liquid] [Ruby] Jekyll(Liquid)で記事の目次を出力するプラグインを作ってみた
  2. 2012/09/21 [Python] [Ruby] [Jekyll] Pygmentsを使ってJekyll内記事のコードハイライトを実現する
  3. 2012/09/20 [Jekyll] [StartUp] [Ruby] JekyllをGitHub Pagesに上げるための準備
  4. 2012/09/14 [Ruby] [StartUp] [Jekyll] JekyllとJekyll Bootstrapでかんたん静的サイト生成…するための準備
  5. 2014/04/01 [Ruby] [Jekyll] [イベント] kawasaki.rb #010 で発表してきました #kwskrb
  6. 2014/01/28 [Jekyll] [GitHub] [Ruby] Jekyllプロジェクトへpull requestを行う手順(したとは言っていない)
  7. 2013/09/07 [Ruby] [Git] [Jekyll] Jekyllバージョンアップの際に思いのほか手こずった話 てっく煮さん製プラグインの更新に追従したい編
  8. 2013/08/07 [Ruby] [Jekyll] [Git] Jekyllバージョンアップの際に思いのほか手こずった話 Jekyll Bootstrapの更新に追従したい編
  9. 2013/05/27 [Jekyll] [Ruby] Jekyll@GitHub Pagesの運用形態を変えたのでAnalyticsの設定が効かなくなっていた
  10. 2013/05/23 [Jekyll] [Liquid] [Ruby] 記事の目次を出力するJekyllプラグインの改良
  11. 2013/04/11 [Ruby] [Jekyll] Jekyllのバージョンを 0.12.0 にあげた
  12. 2012/12/25 [Ruby] メモ化を知った
  13. 2012/10/01 [Ruby] [Bundle] [Windows] bundle execを省略したいのでバッチを作った(Windows版)
  14. 2012/09/13 [Ruby] [Fluentd] Fluentdの自作プラグインがロードできないのでソースの中身を追ってみる…
  15. 2012/08/17 [Fluentd] [Ruby] Fluentdのプラグインを作成してみる(練習用)