table//レンダリング

table//レンダリング

[1] HTML (table 要素) のレンダリングについてです。

[2] 仕様書:

[3] HTML 4 仕様書は、次のようなレンダリング例を挙げています。

UA が1パスで表を表示するためには、を明示し (col), 幅を指定しなければなりません (width)。

表の方向については dir 属性の解説を参照。

推奨配置算法

[4] HTML 4 B.5.2 は、次の配置算法 (レイアウト・アルゴリズム) を推奨しています。

固定配置算法 (fixed layout algorithm) HTML 4 B.5.2.1:

自動配置算法 (autolayout algorithm) HTML 4 B.5.2.2: 表のデータを2パスで処理し、表の大きさを決定します。

1パス目: 行の折り返しは無効にして、各こまの最小・最大の幅を調べます。 最大の幅は最長の行で決まります。折り返しがないので、段落は br が無い限り長い1つの行になります。 最小の幅は最長の文要素 (語、画像など) で決まります (字下げリスト記号も考慮に入れます)。

この処理はこまの中の入れ子の表にも適用します。 中の表のこまの最小・最大幅が表の最小・最大幅に影響し、 ひいては外の表のこまの最小・最大幅に影響します。 (この算法はこまの内容の合計に比例し、入れ子の深さには依存しません。)

文字揃えのこまでは、揃え文字 (charcharoff) の左、揃え文字の右、不揃え部に分けて考えます。例えば最小幅は max (最小 + 最小, 最小不揃え) となります。

次に、こまの最小・最大幅から列の最小・最大幅を決定します。 そして、利用可能な空間を列幅に割り当てます。

複数の列にまたがったこまでは、単純に均分して最小・最大幅を求めます。 またがらないこまの最小・最大幅を使って分割時に重みをつける方法もあります。 実験によれば両者の混合が多くの表に有効のようです。

列幅割当ての際には、表の境界線とこま間の余白を考慮する必要があります。

この幅割当ては、1パス目の最小・最大幅を使って入れ子の表にも繰り返します。 親こまの幅が利用可能な領域になります。

表の幅が width で指定されていれば、 UA はそれに一致するように試みます。 width を採用すると最小幅より小さくなってしまう時は使いません。

col で相対幅が指定されている時は、 その幅になるまで増やします。 col はヒントに過ぎず、 最小幅より小さいときは採用するべきではありません。また、 列を利用可能な空間より広く伸ばすべきでもありません。 相対幅零に指定されていれば、常に最小幅を採用するべきです。

2パス配置算法を使う場合であって、 charoff 属性が明示的に、あるいは継承で指定されていない時には、 alignchar の列のうちの行で、 揃え文字の前後の部分の幅が最大になる行において、 行を中央に揃えることになるであろう位置を選びます。 徐々にレンダリングしていく場合には、既定値を 50% とすることを提案します。同じ行の異なる列のこまを文字で揃える場合は、 既定では、該当するすべてのこまを (揃える文字を問わず) 並べるべきです。 (明示又は暗示による) 揃えの結果データが列に割り当てられた幅を超えてしまう場合には、 物体が大き過ぎる場合と同様に処理します。

[5] 岡部克也's w3m ページ <http://www4.ocn.ne.jp/~okabek/w3m.html#table>

w3mレンダリング算法 (改善版) についての解説。 (名無しさん [sage])

[6]

CSS表レンダリング・モデルとの関係
非デスクトップ視覚媒体におけるレンダリング

(名無しさん [sage])