はてなダイアリー

はてなダイアリーでははてな記法という、HTMLの簡略記法が使えます。この記法を利用することで簡単に整形された日記を書くことができます。私も6年間はてなダイアリーと、はてな記法のお世話になりました。

しかしはてな記法は、はてな独自の簡略記法なので他では使えません。従って一つの不安がよぎります。

この先もし10年、20年とブログを書き続けるとしたら、それははてな記法でいいのかと。

はてなダイアリーには別の不満もあります。次のようなものです。

  1. HTML整形後の文章をローカル環境で確認できない。
  2. 記事に変更が生じてWeb上で直接編集した場合に、ローカルデータと内容が不一致となり、その管理が煩雑となる1
  3. あんなにサンプルがあるのに、イケてるデザインが見当たらない2
  4. 基本的にサイトが重い。

Github Pages + Jekyll

そんな理由から私はGitHub PagesJekyllを利用して、自分でブログを構築することにしたのです。この利点は次のようなものです。

  1. HTML簡略記法のDe-Facto StandardとなっているMarkdown記法が使える。
  2. テンプレート言語Liquidを使って、syntax highlight, amazonその他のタグの埋め込みができる。
  3. HTML整形後の文章をローカル環境で確認できる。
  4. githubにおいてgitによるsourceおよびblog dataの一元管理ができる。
  5. Jekyll-Bootstrapなどをベースに、自由なデザインでサイトを構築できる。
  6. Jekyllは静的サイトを構築するためサイトが軽い。

過去データの変換

しかしここで一つの問題が浮上します。それは過去にはてなで投稿した記事の取り扱いです。記事は自分の資産です。できれば同時に移管したい。自分がその一番の読者ですし。しかしそれらは当然に、はてな記法で書かれていてMarkdownへの変換が必要です。記事の数は300を超えるので手作業は現実的ではありません。

そこでRubyで適当なscriptを書いてみました。完全とは言いがたいですが、自分の記事に関してはエラーなくmarkdownへ変換できました。こうして無事、はてなにおけるすべての記事をここGithub Pagesに移管することができたのです。

現状Jekyllでは、一つの記事更新のためにすべてのファイルを変換しなければならないなどの問題もありますが、その使い勝手にはかなり満足しています。アフィリエイトもできますしね : )

hateda2mdの紹介

で、このscriptをもう少しまともな形に作りなおしてhateda2mdとしてgem化しました。良かったら試してみてください。果たしてこんな所に需要があるかは分かりませんけど。

hateda2md | RubyGems.org

melborne/hateda2md

Hateda2mdとは

Hateda2mdは、はてな記法で書かれたXMLファイルから、Jekyll用のMarkdownファイルを生成するコンバータです。定義済みフィルタを使って、または自身でフィルタを定義して変換を行うことができます。

インストール

$ gem install hateda2md

使い方

はてなダイアリーのブログエクスポート機能を使って、はてなの日記データ形式でdownloadをおこない、username.xmlファイルを取得します。そしてこのファイルを次のようにしてhateda2mdで処理します。

require "hateda2md"

mdb = HateDa::MdBuilder.new('hatena-diary.xml')

# 定義済みフィルタをセットする
mdb.set :title
mdb.set :subtitle
mdb.set :link
mdb.set :amazon

# 変換を実行する
mdb.run

# 変換後のデータを各エントリーに対応した複数のMarkdownファイルに保存する
mdb.save_to_files

本処理によりmdディレクトリ以下に、(各エントリではなく)各日記に対応した複数のmarkdownファイルが生成されます。そのファイル名は各日記の日付とタイトルで構成されます。ASCII以外の文字はファイル名のタイトル部分から除去されます。

すべての定義済みフィルタをセットするには、MdBuilder#pre_defined_filtersまたはHateDa::Converter.pre_defined_filtersメソッドを呼びます。

# すべての定義済みフィルタを呼ぶ
filters = mdb.pre_defined_filters
# => [:title, :subtitle, :subsubtitle, :order_list, :unorder_list, :blockquote, :pre, :super_pre, :footnote, :br, :link, :hatebu, :amazon, :youtube, :image, :gist]

# すべての定義済みフィルタをセットする
filters.each { |f| mdb.set f }

mdb.run
mdb.save_to_files

定義済みフィルタのうち、:super_pre, :footnote, :hatebu, :amazon, :youtube, :gistの各フィルタは、liquid tagへの変換を行うので、対応するRuby script pluginが必要となります。

melborne.github.com/_plugins at source · melborne/melborne.github.com · GitHub

ただ、:hatebu, :youtube, :gistの各フィルタに関しては、その第2引数にfalseを渡すことで、liquid tagに代えてhtmlコードを生成させることもできます。

また、MdBuilder#filterメソッドを使って、独自フィルタを定義することができます。次のようにします。

# はてな記法によるwikipediaタグをliquid tagに変換するフィルタを定義する
mdb.filter(/\[wikipedia:(.*?)\]/) do |md|
  "{ % wikipedia #{md[1]} % }"
end

フィルタ定義のやり方はhateda2mdが依存しているgsub-filterのreadmeと、HateDa::Converterで定義しているfilterの内容を参照してください。

また、MdBuilder#runに引数を渡すことで、特定のエントリだけを変換することができます。

# 20番目のエントリだけを変換
mdb.run(20)

# 100番から最後のエントリを変換
mdb.run(100..-1)

# 10番から20件を変換
mdb.run(10,20)

Enjoy your Blog life!


関連記事: 30分のチュートリアルでJekyllを理解する


はてなダイアリーガイドブック―ウェブログでつながる新しいコミュニティ by 水野 貴明

(追記:2012-05-06) hateda2mdのversion upに応じて記述を直しました。

(追記:2012-05-07) hateda2mdの説明を一分追加しました。

  1. 自己管理の問題でもありますが..
  2. 自分の好みのという意味です..


blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS