mt2en - Movable Type (or はてなダイアリー) to Evernote Converter

Time-stamp: "2012-03-12 Mon 11:37 JST hig"

見出しのクリックで本文の表示/非表示が切り替わります

What is this?

The Movable Type Import / Export Format(のサブセット. 下記)を, Evernote Markup Languageに変換するPython Scripts.

Python scripts that convert texts in the Movable Type Import / Export Format document into Evernote Markup Language.

The Movable Type Import / Export Format(のサブセット. 下記のRestriction参照)を, Evernote Markup Languageに変換するPython Scripts.

ブログ(Weblog)には, 他のサービスへの移行のために, Movable Type形式(MTIEF=The Movable Type Import / Export Format)で Export / Import できるものがある. それをこのツールで変換して, エントリごとにEvernoteのノートとすることができる.

Restriction

  • Movable Type形式に従うすべての文書がコンバートできるわけではない. はてなダイアリー(で樋口が使うはてな記法だけで書かれた日記)からMovable Type形式で exportしたものがとりあえずコンバートできるだけ.
  • 画像をノート中にとりこむことはしないで(原理的にはできるはず), とりあえず元のはてなダイアリーへのリンクにしている.

Download

mt2en-1.0.tar.gz(2012-03-11)

How to Use and Possible Errors

  1. 引越元のサービスからMovable Type形式でデータを書き出して, exporeted_mt.txtとして保存. はてなダイアリーなら, 管理 > インポート/エクスポート > ブログのエクスポート > Movable Type形式
  2. シェル(ターミナル)で
    shell% cat exported.txt | python mt2en.py | python et.py > archive.enex
    
  3. Evernote Desktopで, ファイル > アーカイブからノートをインポートarchive.enexを選択. タグをインポートにチェック
  4. ノートブック Import archiveが新規に作られ, その中にノートが作られる. 何かよくないことが起きても, このノートブックを消せば, ノートブックの外に被害が及ぶことはないはず.
  5. [インポートエラー]インポートの過程でエラーダイアログ《インポートに失敗しました: Evernoteは, ファイル'%@'からノートをインポートできませんでした》が出ないか観察する
  6. [書式エラー]インポートに成功したら, ノート内が空白になってしまってるものがないか確認する
  7. [同期エラー]同期する. 同期に失敗したら, 未同期のノートを観察する(回転矢印のフィールドでソートするといい). 最悪でも, これらのノートを消去すれば, 既存のノート, 未同期でないノートは正常に同期される. あるいは, [個別対応]これらのノートを手で編集して, 同期できるようになるまで怪しいところをとりのぞく.

ちなみに樋口の場合, 3.5年分のはてなダイアリーを変換したところ2600個のノートになり, そのうち1個だけが[同期エラー]に対する[個別対応]を要しました. 具体的には,

<h4><a href="relativeurl">something</a></h4>
となっているところからaタグを取り除く必要がありました. こんなのはあまり性能の実証にならない. 樋口のはてなダイアリーが変換できるところまで改良してそこでやめたんだし, ひとによってどのはてな記法を使うかは違うから.

Requirements

  • lxml 2.3.2
  • Python 2.7

Tested with

  • python27 from Fink 0.32.3
  • lxml-py2.7 from Fink 0.32.3
  • and some other python and XML libraries from Fink 0.32.3
  • Evernote Desktop 3.0.7 Beta 2 on Mac OS X 10.6

Specification

mt2en.pyet.pyに分かれてるのは必然性はない.

mt2en.py

Evernote ML にかなり整合するXML (almost?)整形式にする.

ファイル全体を1個のen-export elementに対応させる.

1個の TITLE: を1個のノート(note element in Evernote ML)に対応させる.

Evernote MLの各フィールドの意味はEvernote API: Module: Typesで説明されている.

Evernote MLMovable TypeComments
exported-date (an attribute of the en-export element)script実行時刻
createdDATE:はてなには(当時は)timezoneの概念がないので, scriptを実行しているPCのtimezoneだと思ってUTCに変換
updatedDATE:updatedはインポート時刻でどうせ上書きされる. はてなには(当時は)timezoneの概念がないので, scriptを実行しているPCのtimezoneだと思ってUTCに変換
tagCATEGORY:
sourceweb.clip決めうち
source-urlhttp://d.hatena.ne.jp/id/date/
authorempty 決めうち
無視STATUS, ALLOW COMMENTS, CONVERT BREAKS, ALLOW PINGS, EXTENDED BODY, EXCERPT, KEYWORDはてなでは一定値 orいつでも空?

はてなダイアリーでは表示モードを日記モード・見出し別ページにしている場合を想定. 見出しごとに TITLE: が立てられる.

et.py

整合性を確保し, (文書化されてない?)Evernote にインポート可能な文書にする.

  • href attributeの&,#をエスケープ. そうしないと[書式エラー][同期エラー]になる
  • hatena-*などの(Evernoteにとっての)未定義classを削除. そうしないと[書式エラー][同期エラー]になる
  • img element を削除(というか, alt,src attributes で置きかえ). そうしないと[書式エラー][同期エラー]になる
  • <br><br/>に置換. そうしないと[同期エラー]になる

Comments

  • なぜはてな形式(XML)から変換しなかったか? ノート内にはてな記法を残したいならそのほうが楽だっただろう. ここでは, ノート内が, Webページに近く見える状態にしたかったので, じぶんではてな記法parserを実装するようなことはせず, parseされた後のHTML文書が埋め込まれているMovable Type形式を使った.
  • 1エントリずつWebclipしてまわるか, なぜはてなダイアリーにEvernote Site Memoryを設置してクリックしてまわらなかったか? そのほうが図とともにきれいにクリップできるのは確かだが, 樋口のはてなダイアリーはプライベートモードで, 一瞬たりとも公開はできないようなことを書いてるので. (WebclipやSite MemoryはもちろんEvernoteのサーバからアクセスできるページしかクリップできない)
  • 同様に, 公開された Movable Type から Evernote にClipするなら, Clip to Evernoteという公式のプラグインがある.

このサイトのコンテンツ

QRcode to hig3.net

http://hig3.net