mehoriさんの記事を見てから、Evernote文書をマークアップ言語の視点から解析してみようと思っていた。
Evernoteはクラウド上だけでなく手元のパソコンにもデータを保存しているが、これはENML(Evernote Markup Language)という形式のXML文書が主になっている。一つのEvernoteのノートが一つのENML文書になっていると考えてよい。
基本的には、ENMLはHTML/XHTMLをベースにしたマークアップ言語であり、タグセットがほぼHTML/XHTMLのサブセットになっている。極めておおざっぱに言えば、body要素の内容からいくつかのタグを取り除いたものがENML文書になると言える。ただし、XML名前空間によってタグセットが共有されているわけではなく、厳密に言えば、単にタグ名が同じであるに過ぎない。また、一部、ENML独自のタグが導入されている。
Evernoteでは、Webページをクリッピングすると、そのページの内容がテキストベースで取り込まれる。内部的には、この動作は、WebページがUTF-8のXHTML 1.0 Transitionalの文書とENML文書で保存されることに相当している。XHTML 1.0 Transitionalとして妥当でない文書でもHTML5文書でも、クリッピングするとXHTML 1.0 Transitionalになるみたいである。CSSはどうなるかというと、スタイルを保存するために新たなdiv要素やspan要素が追加され、この要素のstyle属性に展開されて、EvernoteのXHTML文書とENML文書の両方に書き込まれている。こういう振る舞いを総合すると、ブラウザ上のDOMをなんらかの方法でシリアライズして保存しているのかな、と想像している。
また、Evernoteからノートを書き出すと、単一のEvernoteエクスポート形式の文書が得られる。これもXMLであり、元々保存されているENML文書の他、ページを構成する画像その他の部品がすべてBase64形式で符号化され、単一パッケージ(単一文書)になったものである。
ENMLではスキーマをどう扱っているか。なんとDTDなのである。これは今に到るまで変わっていない。いったんDTDベースでシステムを構築してしまえば、Relax NGやXML Schemaを導入する必要性がない、ということなのだろうか。あるいはHTML/XHTMLベースなので、XHTMLのDTDをそのまま借用している、ということなのだろうか。このDTDを眺めていると、パラメータ実体や外部パラメータ実体が使われていて、なんだか一昔前にタイムスリップしたような感覚になってくる。
ENMLのDTDは途中で大きく変わっている。ENML 1.0(DTDへのリンク)とENML 2.0(DTDへのリンク)である。切り替わったのがいつか正確には分からないが、ENML 2.0のDTD中にあるCopyright表示が 2007-2009 になっているし、タイムスタンプ(これはCVSのもののように見えるが…)が 2007/10/15 になっているから、この辺に切り替わったのかもしれない。
ENML 1.0の文書モデルはXHTML 1.0 Transitionalの文書モデルと非常に似ている。各要素の内容モデルがDTDレベルで厳密に決められているし、インライン要素やブロックレベル要素など、XHTML 1.0で行われていた要素の分類を引き継いだDTDになっている。一方、ENML 2.0の文書モデルはかなりルーズであり、どの要素の内容にどの要素が出現してもよい。要するにこんな感じである(説明のため、ENML 2.0 DTDの記述を意訳?している):
<!ELEMENT a (#PCDATA | a | abbr | .... | var)*>
ところで、ENML 2.0 DTDの冒頭に面白いコメントが書いてある。
This is based on a subset of XHTML which is intentionally broadened to reject less real-world HTML, to reduce the likelihood of synchronization failures. This means that all attributes are defined as CDATA instead of more-restrictive types, and every HTML element may embed every other HTML element.
現実のHTMLをなるべく排除しないように、またその結果として同期の失敗の可能性を減らすために、内容モデルを広げた、という感じだろうか。
あんさん、そら、アタリマエでんがな。みんながみんな、文書をDTDどおりに書いてくれるなんて、大間違いや。文書のココロが分かってへん。まあ確かに、なんでもタグを許したら収拾つかんようになるさかい、制限したい、ゆーのは分かるんやけど、DTDつこたらあかんわ。well-formed で我慢しとき。
0 comments:
コメントを投稿