InDesign MY-NOTEBOOK

Sunday, April 18, 2010

InDesign , ExtendScript(JavaScript)で表を作成するときの覚え書き

HTMLのテーブルをそのまま ExtendScript 経由で自動組版しようと思っている。当然 colspan, rowspan がガンガンにはいっている。CSSで指定されているボーダーにも対応しなければならない。

問題その1 セルのマージ

よくありがちなセル結合のサンプルコードは、非常に単純な例しか載っていない。実践ではその程度では対応できない。

もっとも説明用のサンプルコードが複雑だと理解できないから、単純な例しか載っていないのは仕方ないのかもしれないが。

セルのマージで一番問題になるのは、複数箇所でセルをマージしていくとき、先にマージしたことにより、列・行の値が変化してしまうのだ。
このことに気づいていないとはまる。(気づいていたとしてもいまのところ、スマートな解決コードを思いついてないが。)

対処方法

まず列や行オブジェクトを信用するのはやめること。通常 InDesign のオブジェクトモデルは


var aCellObj = aTableObj.rows.item( 行インデックス ).cells.item( 列インデックス ) ;

のようにアクセスできるのだが、セルの結合を行うと、この行列のインデックスが当初の状態から変化してしまうのだ。

いまのところ、それなりにうまく機能している方法は、セル結合を行う前に、まずはすべてのセルオブジェクトを取得しておく。 (セルオブジェクトである点に注意、行オブジェクトや列オブジェクトではない。) 次にマージしたいセルを計算しておいて、順にマージする。

ポイントはこの マージ順 。 テーブルの左上から右下に向かってマージを行うと問題がおきやすい。(というか複雑なセルマージがあれば確実に問題がおきる。) そうではなく、右下から左上に向かって順にマージしていく。そうすれば行・列のインデックス値の変化がおきにくくなるので、うまくマージできる。(いまのところはこの方法でうまくいっている)

問題その2 ボーダー競合

HTMLのテーブルの td 要素におけるボーダーのスタイル指定では、top,bottom,left,right のボーダーをどうするか(線の太さ/線のタイプ/色)を指定する。しかし、上下に並んだセルの間にあるボーダーは、上のセルの bottom であると同時に、下のセルの top でもあるので、これらでコンフリクトするようなボーダー設定がされていた場合にどちらを優先するのか?

... という問題。