Sunday, April 18, 2010
HTMLのテーブルをそのまま ExtendScript 経由で自動組版しようと思っている。当然 colspan, rowspan がガンガンにはいっている。CSSで指定されているボーダーにも対応しなければならない。
よくありがちなセル結合のサンプルコードは、非常に単純な例しか載っていない。実践ではその程度では対応できない。
もっとも説明用のサンプルコードが複雑だと理解できないから、単純な例しか載っていないのは仕方ないのかもしれないが。
セルのマージで一番問題になるのは、複数箇所でセルをマージしていくとき、先にマージしたことにより、列・行の値が変化してしまうのだ。
このことに気づいていないとはまる。(気づいていたとしてもいまのところ、スマートな解決コードを思いついてないが。)
まず列や行オブジェクトを信用するのはやめること。通常 InDesign のオブジェクトモデルは
var aCellObj = aTableObj.rows.item( 行インデックス ).cells.item( 列インデックス ) ;
のようにアクセスできるのだが、セルの結合を行うと、この行列のインデックスが当初の状態から変化してしまうのだ。
いまのところ、それなりにうまく機能している方法は、セル結合を行う前に、まずはすべてのセルオブジェクトを取得しておく。 (セルオブジェクトである点に注意、行オブジェクトや列オブジェクトではない。) 次にマージしたいセルを計算しておいて、順にマージする。
ポイントはこの マージ順 。 テーブルの左上から右下に向かってマージを行うと問題がおきやすい。(というか複雑なセルマージがあれば確実に問題がおきる。) そうではなく、右下から左上に向かって順にマージしていく。そうすれば行・列のインデックス値の変化がおきにくくなるので、うまくマージできる。(いまのところはこの方法でうまくいっている)
HTMLのテーブルの td 要素におけるボーダーのスタイル指定では、top,bottom,left,right のボーダーをどうするか(線の太さ/線のタイプ/色)を指定する。しかし、上下に並んだセルの間にあるボーダーは、上のセルの bottom であると同時に、下のセルの top でもあるので、これらでコンフリクトするようなボーダー設定がされていた場合にどちらを優先するのか?
... という問題。