「マイクロフォーマット(microformats)の蹉跌と希望」において、マイクロフォーマット(microformats)のデータモデルもマークアップも曖昧すぎて、どうもダメな感じだと指摘しました。しかしそれでも、次の点はマイクロフォーマットの優位点だと僕は思います:
- 今ある技術だけですぐさま出来る、新しいナニカを必要としない。
- CSSデザインとの相性がよい。
- hCard、hCalendarなどのスキーマが既に存在する。
特に最後の「スキーマのレパートリーがある」という点はとても大きな魅力です。もっとも、スキーマ記述言語がない(しいて言えば自然言語)ので、スキーマって概念も曖昧な状態ではありますが。
「マイクロフォーマット(microformats)の蹉跌と希望」のコメント欄にて、神崎正英さんより「microdataはどうか」というヒントをいただきました。Kuwataさんも「microdataのほうがいいぞ」と言ってます。そこで、マイクロフォーマットとマイクロデータ(microdata)を比較してみます。
僕の気持ちとしては、マークアップ方式は別にどっちでもいいのです。キチンと決まったマークアップ方式があって、その方式でマークアップされたHTMLインスタンスがプログラムで容易に取り扱えればいいのです。その観点から、マイクロフォーマットとマイクロデータを見ていきます。両者を使い分ける、あるいは併用することも視野に入れます。
- 参考:マイクロデータの仕様: http://www.w3.org/TR/html5/microdata.html
ご注意:「マイクロフォーマット」と「マイクロデータ」は字面が似ているので、注意してないとドッチのことを話題にしているかわかんなくなります。「フォーマット」と「データ」を区別して読んでください。
内容:
データモデル
マイクロフォーマットのデータモデルに関しては、「しょうがないので、マイクロフォーマットのデータモデルを僕が考えた」で述べました。マイクロデータのデータモデルもほとんど同じです。用語は次のように対応します。
マイクロフォーマット | マイクロデータ | 意味 |
---|---|---|
プロパティ | プロパティ | 名前-値のペア |
プロパティセット*1 | アイテム | プロパティの集合 |
プロパティは名前・値ペア(nama-value pair)です。マイクロデータでは、プロパティの集まりを「アイテム」と呼ぶのは語感的に違和感があります(「アイテム」は集まりよりはメンバーの感じ)。が、それは言ってもしょうがない。マイクロデータのアイテムとは、集合(セット)、グループ、コレクションとかのことですからご注意を。
2つのデータモデルの違いは:
- マイクロフォーマットでは、プロパティありき。プロパティの値がプロパティセットでもよい。
- マイクロデータでは、アイテムありき。アイテムに名前が付いてなくてもよい。
「しょうがないので、マイクロフォーマットのデータモデルを僕が考えた」で使った記法をまた使うとして; 次はマイクロデータのアイテムの抽象的表現です。名前-値ペアの集合です。
{ ("fn" : "檜山 正幸"), ("email" : "hiyama{AT}chimaira{DOT}org"), ("url" : "http://www.chimaira.org/"), ("url" : "http://d.hatena.ne.jp/m-hiyama/") }
マイクロフォーマットでは、名前が付いてないプロパティセットは認めないので、次のようにする必要があります。
("vcard" : { ("fn" : "檜山 正幸"), ("email" : "hiyama{AT}chimaira{DOT}org"), ("url" : "http://www.chimaira.org/"), ("url" : "http://d.hatena.ne.jp/m-hiyama/") } )
上のデータを再びマイクロデータで表現したらどうなるでしょうか? マイクロデータでは単独のプロパティが認められないので*2、そのデータだけを含む単元集合とします。次がマイクロデータで認められるデータです。
{ ("vcard" : { ("fn" : "檜山 正幸"), ("email" : "hiyama{AT}chimaira{DOT}org"), ("url" : "http://www.chimaira.org/"), ("url" : "http://d.hatena.ne.jp/m-hiyama/") } ) }
マークアップ
マイクロフォーマットのマークアップは、class属性をベースにします。それについては既に説明しました。(「カジュアル過ぎるmicroformatsを少しだけ厳密に」と「マイクロフォーマット(microformats)の蹉跌と希望」を参照。)次が実例です。
<div class="vcard"> <div class="fn">檜山 正幸</div> <ul class="email-list"> <li class="email">hiyama{AT}chimaira{DOT}org</li> </ul> <ul class="url-list"> <li><a class="url" href="http://www.chimaira.org/">http://www.chimaira.org/</a> </li> <li><a class="url" href="http://d.hatena.ne.jp/m-hiyama/">http://d.hatena.ne.jp/m-hiyama/</a> </li> </ul> </div>
マイクロデータなら次のようです。
<div itemscope itemprop="vcard"> <div itemprop="fn">檜山 正幸</div> <ul class="email-list"> <li itemprop="email">hiyama{AT}chimaira{DOT}org</li> </ul> <ul class="url-list"> <li><a itemprop="url" href="http://www.chimaira.org/">http://www.chimaira.org/</a> </li> <li><a itemprop="url" href="http://d.hatena.ne.jp/m-hiyama/">http://d.hatena.ne.jp/m-hiyama/</a> </li> </ul> </div>
マイクロフォーマットとマイクロデータの属性は次のように対応します。
マイクロフォーマット | マイクロデータ | 意味 |
---|---|---|
(なし) | itemscope | プロパティの集合を囲む |
class="vcard" | itemprop="vcard" | プロパティ名を指定 |
マイクロデータでは、itemscopeが付いた要素がアイテム(プロパティの集合)を囲むラッパー要素となります。プロパティ名はitemprop属性の値として指定して、通常は当該要素の内容がプロパティ値になります。
デュアル・マークアップ
マイクロフォーマットとマイクロデータは、それほど大きな違いはないので、両方に適合するようなマークアップができます。
<div itemscope itemprop="vcard" class="vcard"> <div itemprop="fn" class="fn">檜山 正幸</div> <ul class="email-list"> <li itemprop="email" class="email">hiyama{AT}chimaira{DOT}org</li> </ul> <ul class="url-list"> <li><a itemprop="url" class="url" href="http://www.chimaira.org/">http://www.chimaira.org/</a> </li> <li><a itemprop="url" class="url" href="http://d.hatena.ne.jp/m-hiyama/">http://d.hatena.ne.jp/m-hiyama/</a> </li> </ul> </div>
itempropの値とclassの値(のひとつのトークン)を一致させるばいいのです。マイクロデータでは名前なしのプロパティセットを認めないので、itemscopeとitempropを必ず一緒に指定します。
手作業でこのマークアップをするのは煩雑ですが、ソフトウェアでマークアップするなら問題はないでしょう。
スキーマまたはボキャブラリ
マイクロフォーマットでスキーマと呼んでいるものを、マイクロデータではボキャブラリと呼びます。マイクロデータの非常に大きなメリットは、ボキャブラリを示すURIを、属性itemtypeに指摘できることでしょう。これはソフトウェアにとってはものすごくありがたい。
マイクロフォーマットの場合だと、microformats.orgに書いてある仕様を読んで、それに対応する全機能をソフトウェアに組み込みで用意するしかありませんでした。まともなモジューラー化が全然できない。それに、「microformats.orgに書いてある仕様を読んで」もよく分からないので、相互運用性は絶望的です。
一方のマイクロデータなら、特定のボキャブラリURIに対応する処理系をプラグインとして提供すればいいので、とても楽です。この差は、マイクロフォーマットにとっては致命的かもしれません。
マイクロデータは実装者への配慮がしてある
その他に、マイクロデータ仕様では次の点も記述してあります。
- プロパティ名を複数指定したときの解釈
- プロパティ値を要素のどの部分(内容 or 属性)から取るか
- アイテムリストのJSONへの変換
まだ若干曖昧なところもありますが、かなりハッキリと実装のイメージを描けます。なかでも特筆すべきは次の点でしょう。
- DOM API の定義がある。
もし、ブラウザが microdata DOM API を実装すれば、JavaScriptでかなり面白いことができるでしょう。ブラウザに頼らなくても、がんばればJavaScriptだけでmicrodataライブラリを作れます。サーバーサイドでもDOM APIの応用は色々あるでしょうしね。
DOM APIはマイクロフォーマットにとっても重要です。というのも、マイクロフォーマットとマイクロデータのデータモデルがほとんど同じなので、マイクロフォーマット方式のマークアップでも、マイクロデータと同じDOM APIでデータへのアクセスと操作が可能だからです(実装はマイクロフォーマットのほうが困難ですが*3)。つまり、DOM APIによりマークアップの詳細を隠蔽することができます。プログラマは抽象化されたデータモデルに従ったデータ操作を意識すればいいのです。
マイクロフォーマット/マイクロデータ共通のデータモデルとAPIの詳細に関しては、また次の機会に述べるつもりです。