InDesignの索引をCSVに書き出す(CS2〜CS4)
駆け込み寺の掲示板でこんなスレがあって……
InDesign の索引作成について - DTP駆け込み寺 新掲示板 (リニューアル後のページにリンクしてます)
索引の生成時に、入力した読みがなを一緒に書き出せないかという要望でした。
ちょうど索引あたりをいじりまわす勉強中だったので、ごにょっとスクリプト書いて貼り付けてみるなどしたのですが、グループ化したオブジェクトや入れ子になってるテキストフレームに索引マーカーがある可能性を完全に忘れ去っていました(;´д`)ゴメンネ スレ主
というわけでリベンジなのです
(function(){ var sepChar = "," // CSV用セル区切り文字(任意) var pageNumSepChar = " "; // ページ番号の区切り文字(任意、2文字以上でもOK) var tmpIndex = app.activeDocument.indexes[0]; tmpIndex.update(); // 一度索引を更新してページ数などをソート var str = ""; // 書き出すテキスト // 索引項目すべてについて処理 for (var i = 0, t_len = tmpIndex.topics.length; i < t_len; i++) { var tmpTopic = tmpIndex.topics[i]; str += tmpTopic.name + sepChar; str += tmpTopic.sortOrder + sepChar; // 参照先すべてのページ番号を取得していく for (var j = 0, ref_len = tmpTopic.pageReferences.length; j < ref_len; j++) { // とりあえずマーカーのあるテキストフレームの親を取得してみる var tmpObj = tmpTopic.pageReferences[j].sourceText.parentTextFrames[0].parent; // PageオブジェクトじゃなかったらPageオブジェクトが得られるまでさかのぼる // グループ化したオブジェクトや入れ子のテキストフレームに対応するため while (tmpObj.constructor.name != "Page") { if (tmpObj.parent.constructor.name != "Story") { tmpObj = tmpObj.parent; } else { tmpObj = tmpObj.parentTextFrames[0].parent; } } str += tmpObj.name; // 参照先がまだ残っていたらページ番号区切り文字を入れる str += (j != ref_len-1) ? pageNumSepChar : ""; } str += "\n"; // 改行 } // 項目ループここまで // テキスト書き出し(ファイル名を指定して保存) var file = File.saveDialog("ファイル書き出し","CSVファイル:*.csv"); if (file) { file.open("w"); file.write(str); file.close(); } return; })();
Windows XP SP2、InDesign CS4でのみ確認。CS2〜CS4までは動くと思います。たぶん。CSは索引関係かなり違うので無理です。
グループ化とか、入れ子とか、表とかもこれで大丈夫なはず。たぶん。whileがちょっと怖いので、万が一使うときはESTK上で動かしたほうがいいかも(無限ループになっても止められるから)。
しかし、なんていうか……変数名ってみんなどうやって決めてるのかなー?
ページ数が倒せない
「あるオブジェクトが配置されているページ」を得るのが結構たいへんなのですね。なんでだろう。
テキストフレームのparentプロパティがPageオブジェクトになるということがわかったので、索引マーカーのあるinsertionPointを含むテキストフレームを探して一つずつループしています。
参考にしたのはこちら(CS用っぽい)。試行錯誤したあとで発見したのだけど、よく見たらまんまだわ……。
(DTPtechNote:1253) [AS Indesign CS] print-current-page.as
そーいえば
Fileオブジェクトまわりはまた今度まとめよう、とか言ったきりなのを思い出した(;´д`)
ていうか私の環境がCS4に移りつつあってやる気が、その、そのうち……。