はてダのデータエクスポートの形式を調べてみた。

はてなダイアリーから移行しようと前々から思っていた [1] のですが、最近の騒動もありちょうど良い機会なので、reST形式で記述できるブログに移行することにしました。 先日tinkererをBTSした のもこれ絡みであったりします。今回のエントリはその下調べについてお話です。

エクスポートの方法。

はてなダイアリーのユーザならもちろん知っていると思うのですがおさらいです。画面上部のメニューにある[管理]リンクから、画面遷移後の左のメニュー[データ管理]をクリックすると、[ブログのエクスポート]というセクションに、”はてなの日記データ形式”、”Movable Type形式”、”CSV形式”が選べます。はてなの日記データ形式は、はてな記法で書いたブログエントリがXMLで

<?xml version="1.0" encoding="UTF-8"?>
<diary>
<day date="2006-12-23" title="">
<body>
*1169835868*[生活]せっかく天気の良い土曜なのに、起きたら14時半。
うちは東向きなので、もう洗濯物も布団も干す意味ない…。明日はちゃんと起きよう。

*1169835977*[駄文]Blogなぞ使ってみることにした。
Blogなんぞ使うつもりは今までまったく無かったのだが、以下のような理由で使ってみることにした。

+最近自宅サーバのサイト「 `ペンギンと愉快な機械たち <http://www.palmtb.net/>`_ 」のFrontPageに駄文を書き連ねることが多くなった。(でも、いつ書いたのか分からないんだよな)
+社内研究会でBlogを使うようになった。(インターネットでは無かった、ということ。社内ブログはMovableType Enterprise Edition)
+Google先生のBloggerが正式にリリースされた

とまぁ、こんな所かな。手順書とかトラブるなどの技術関連のまとめた文書は今までどおり本家に記載していくので、まぁ、棲み分けはできるかと。
</body>
</day>
(snip)

という形式になっています。一方、Movable Type形式では、

AUTHOR: mkouhei
TITLE: せっかく天気の良い土曜なのに、起きたら14時半。
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: 1
ALLOW PINGS: 1
DATE: 12/23/2006 03:24:28 AM
CATEGORY: 生活
-----
BODY:

                <div class="section">
                        <p>うちは東向きなので、もう洗濯物も布団も干す意味ない…。明日はちゃんと起きよう。</p>
                </div>

-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:
-----

--------

という感じになっています。はてなダイアリ独自のフォーマットを解析するよりも、Movable Type形式を解析する方が汎用性があるのでこちらを解析することにしました。ちなみにCSV形式の場合は、ブログエントリの本文がMovable Type形式と同じHTML形式になっています。

Movable Type形式での1エントリあたりのフォーマット

Movable Type形式でエクスポートすると、1エントリが次のようになっています。ここでのエントリとは、はてな記法の1個のアスタリスク”*”で始まるブログエントリです。

  • 同じ日に複数エントリがある場合は、別のエントリとして区切られます
  • メタ情報は1つのkeyが1行に記述されます。keyとvalueの区切りは”: “になっています
  • BODYの中はHTMLで記述されています
  • エントリの終わりは、8個のハイフン”——–”になっています

1エントリのフォーマットは次のようになります。

AUTHOR,TITLE,STATUS,ALLOW COMMENTS,CONVERT BREAKS,ALLOW PINGS,DATE,CATEGORY (←実際にはこれらが一行ずつ記載されます)
-----
BODY
(エントリ本文がHTMLで記述)
-----
EXTENDED BODY:
-----
EXCERPT:
-----
KEYWORDS: (以上、3つのキーは実際には使われません)
-----
(コメントがある場合のみ)
COMMENT,AUTHOR,EMAIL,IP,URL,DATE,コメント本文
-----
(複数コメントがある場合)
COMMENT,AUTHOR,EMAIL,IP,URL,DATE,コメント本文
-------- (←エントリの区切り)

メタ情報のkey

  • AUTHOR: はてなID
  • TITLE: はてな記法で1アスタリスク(*)で始まるタイトル
  • STATUS: Publish ←Publishしかないので、公開済みのエントリだけがエクスポートされる
  • ALLOW COMMENTS: 1
  • CONVERT BREAKS: 1
  • ALLOW PINGS: 1 ←以上3つのキーは全てのエントリで1。特に今回は使わないので無視
  • DATE: MM/DD/YYYY HH:dd:ss AM|PM 形式ののローカルタイム(JST)
  • CATEGORY: カテゴリで指定したカテゴリ。複数ある場合は複数行。

本文(BODY)のHTMLタグのフォーマット

エントリの本文の単位は

<div class="section">
</div>

になっています。一行エントリを書くと

<div class="section">
<p>本文ほげほげ</p>
</div>

となっているので、このsectionクラスのdiv要素内にエントリの本文が記述されるワケですね。

サブセクション(**)を使った場合のフォーマット

h4を使い、同じdiv要素の中に記述されます。

<div class="section">
<p></p>
<h4></h4>
<p></p>
</div>

コードブロックのフォーマット

pre要素を使っているだけです。

<pre class="syntax-highlight">
hoge
</pre>

コードブロックの中でのsyntax highlight

<span class="someclass">hoge</span>

という感じで、単語や記号ごとにspan要素で括られています。reSTのコードブロックに移行する上ではこのsyntax highlight用のspanは取り除く必要があります。なお、使われているclassは次の通りです。(以下はshの場合)

  • synComment
    • ナンバー(#)以降の文字列。
  • synStatement
    • ダブルクォーテーション("), start, stop, ||, exit,
  • synConstant
    • ダブルクォーテーションで括られた文字列, exit のあとのリターンコードの数字,
  • synSpecial
    • ハイフン(-)で始まる文字列(つまり、コマンドオプション), {, },

footnoteのフォーマット

注釈記号のフォーマットは下記のようになっています。

<span class="footnote"><a href="/hatenaID/#f1" name="fn1" title="footnoteの文章">*1</a>

また、footnote自体の記述位置とフォーマットは以下の通りです。

<div class="section">
</div>
<div class="footnote">
<p class="footnote"><a href="/hatenaID/#fn1" name="f1">*1</a>: footnoteの文章</p>
</div>

引用のフォーマット

<blockquote>
<p>文章</p>
</blockquote>

なのでHTMLでの標準的な記述方法ですね。

ブログパーツ

使用しているものによってまちまちですが、基本的にそのまま出力されています。例えば、 amazletでは

<div class="amazlet=box">hogehoge</div>

gistでは

<script src="https://gist.github.com/hoge.js?file=hoge.sh"></script>

という感じです。

次回に続く!

[1]一番の理由は広告です。基本毎日更新しないと最新のエントリのすぐ下に広告が表示されるようになったこと、スマホのブラウザでアクセスすると問答無用で広告が表示されることが移行することを決心した理由です。私のブログを購読して下さっている方がいらっしゃるのはもちろん嬉しいのですが、自分のブログは備忘録であったり日記であったりと書いている一番の理由は、自分のためであるというのがあるので、意図しない広告が表示されるのはとても鬱陶しいのですよね。