HTML5

ちょっと必要があってHTML5rubyの仕様を読んだ。

rubyの仕様



HTMLはSGMLの系統だったので「機械的に存在が分かる要素のタグは省略して良い」という仕様があった。*1
でも、後継と言っていいXMLでは「タグの省略」という仕様はなくなった。



HTML5ruby仕様を読んでいまもHTML5には「当然推定される構造は機械が補うので省略して良い」という思想がある事がはっきり分かった。

rubyの説明で「実際にはDOMがこのようになっているわけではないが、これは次のものと等しい」というのがあって、推定されるrb要素、rtc要素が省略されている様子が示されている。

<ruby>
  &#9829;<rt>Heart<rtc lang=fr>C&#339;ur</rtc>
  &#9752;<rt>Shamrock<rtc lang=fr>Tr&#232;fle</rtc>
  &#10038;<rt>Star<rtc lang=fr>&#201;toile
</ruby>

上記の記述は以下のものと意味の上では同等だと書いてある。

<ruby>
  <rb>&#9829;</rb><rtc><rt>Heart</rt></rtc><rtc lang=fr><rt>C&#339;ur</rt></rtc>
  <rb>&#9752;</rb><rtc><rt>Shamrock</rt></rtc><rtc lang=fr><rt>Tr&#232;fle</rt></rtc>
  <rb>&#10038;</rb><rtc><rt>Star</rt></rtc><rtc lang=fr><rt>&#201;toile</rt></rtc>
</ruby>


(タグが見えるように引用したら、ハートマーク等も数値文字参照になってしまったのでちょっとみにくい。)


つまりrubyの中に突然文字が来たらそれはrb(親文字)のはずだし、いきなりrt(ルビテキスト)が来たらrtc(ルビテキストのコンテナ)に含まれているはずだ、という事。二つ目以降のrtcはそもそも省略できないが、rtc内でrtは省略できる、という規則。また、ほとんどのエレメントが包含関係にないので、エレメントの開始タグは多くの場合に前のエレメントの終了タグを暗示している。


しかし実際にブラウザが表示を作成するためには後者の形になっていないと処理が難しいと思うのだが。


で、その次に前者の表記になっているrubyを正しく解釈するためのアルゴリズムが延々と書かれている…

いや、その負荷が重くなるっていうんでXMLではタグの省略みたいなのはやめましょう、という事になったと思うんだがなぁ。



さらにSGMLではあくまで「タグの表記を省略している」という事だったので、パーサーで処理するとタグの省略は解除されて、「処理済みの重くないもの」が準備できていた。しかしHTML5ではどうもそうではないらしい。英文をまともに読めているかどうかは分からないのだが、省略されているのではなくそれで正しいな記述だという事になっている感じ。そもそもコンテントモデルが「See prose.」になってる。個人的にはいまいちな仕様である。

*1:但し文書型で省略可能であると定義しないと駄目。