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