mt2en - Movable Type (or はてなダイアリー) to Evernote Converter
見出しのクリックで本文の表示/非表示が切り替わります
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
How to Use and Possible Errors
- 引越元のサービスからMovable Type形式でデータを書き出して, exporeted_mt.txtとして保存. はてなダイアリーなら,
- シェル(ターミナル)で
shell% cat exported.txt | python mt2en.py | python et.py > archive.enex
- Evernote Desktopで, archive.enexを選択. タグをインポートにチェック で
- ノートブック Import archiveが新規に作られ, その中にノートが作られる. 何かよくないことが起きても, このノートブックを消せば, ノートブックの外に被害が及ぶことはないはず.
- [インポートエラー]インポートの過程でエラーダイアログ《インポートに失敗しました: Evernoteは, ファイル'%@'からノートをインポートできませんでした》が出ないか観察する
- [書式エラー]インポートに成功したら, ノート内が空白になってしまってるものがないか確認する
- [同期エラー]同期する. 同期に失敗したら, 未同期のノートを観察する(回転矢印のフィールドでソートするといい). 最悪でも, これらのノートを消去すれば, 既存のノート, 未同期でないノートは正常に同期される. あるいは, [個別対応]これらのノートを手で編集して, 同期できるようになるまで怪しいところをとりのぞく.
ちなみに樋口の場合, 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.py
Evernote ML にかなり整合するXML (almost?)整形式にする.
ファイル全体を1個のen-export elementに対応させる.
1個の TITLE: を1個のノート(note element in Evernote ML)に対応させる.
Evernote MLの各フィールドの意味はEvernote API: Module: Typesで説明されている.
Evernote ML | Movable Type | 値 | Comments |
---|---|---|---|
exported-date (an attribute of the en-export element) | script実行時刻 | ||
created | DATE: | はてなには(当時は)timezoneの概念がないので, scriptを実行しているPCのtimezoneだと思ってUTCに変換 | |
updated | DATE: | updatedはインポート時刻でどうせ上書きされる. はてなには(当時は)timezoneの概念がないので, scriptを実行しているPCのtimezoneだと思ってUTCに変換 | |
tag | CATEGORY: | ||
source | web.clip決めうち | ||
source-url | http://d.hatena.ne.jp/id/date / | ||
author | empty 決めうち | ||
無視 | 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という公式のプラグインがある.