InDesign CS で選択中のテキストを索引に登録する JavaScript(修正版)

InDesign CS で選択中のテキストを索引に登録する JavaScript
にセルフ突っ込み。

topicsオブジェクトのaddメソッド

topicsオブジェクトのaddメソッドは第二引数に読み仮名をとれる。
(読み仮名というか、並び替えの順番を入れるんだけど……)

add(name,[sortBy])
  name   : 見出し文字列
  sortBy : 読み仮名(オプション)

ので、わざわざsubtopicオブジェクトのsortOrderとかに入れなくてもいい。と気づきました。

ついでにエラー回避してみる

修正前のは

  • ドキュメントを一つも開いてない場合
  • その文書でまだ索引を登録してない場合

にエラーになる。(手を抜いたからだけど)

それぞれ、documents.lengthとindexes.lengthが0じゃないかどうか確かめればおk。

ということで修正版

// ドキュメントが開いてるときだけ
if(app.documents.length != 0) {

  // なにか選択状態のときだけ
  if(app.selection[0] != undefined) {

    // 選択中のオブジェクトを取得
    var selectedObj = app.selection[0];
    // アクティブになってるドキュメントオブジェクトを取得
    var activeDoc = app.activeDocument;

    // 選択中のオブジェクトがテキストのときだけ
    if(selectedObj.constructor.name == "Text") {

      // 索引オブジェクトがまだなかったら作る
      if(activeDoc.indexes.length == 0) {
        activeDoc.indexes.add();
      }

      // 選択文字列を取得
      var str = selectedObj.contents;
      // 読み仮名を設定
      var sortBy = prompt("よみがなにゅうりょく","");

      // 文字列を見出し語に追加する
      var tmpTopic = activeDoc.indexes[0].topics.add(str, sortBy);
      // 参照先を追加する
      tmpTopic.pageReferences.add(selectedObj.parent, selectedObj.insertionPoints[0]);
    }

  }
  else {
    alert("テキストを選択してから!");
  }

}
else {
  alert("ドキュメントを開いてから!");
}

あいかわらず読み仮名あたりやる気ない感じです。
変数名が変わってるけど気にしない。

あとこないだ書き忘れたけど、Windows XP(SP2)でのみ動作確認。

CS2以降だと動かない

CS2で索引まわりのオブジェクトがいろいろ変更になってるので、このままだと動きません。
(pageReferences.add()の引数にtextオブジェクトがそのまま取れたりする。insertionPointとかややこしいの考えなくていい)

ていうかCS2にはバグがあるらしいので、そもそもこの方法は使えないかもしれない。
VBだけ?)

InDesignファイルに表があり、表の後の文字列を選択して登録しようとすると索引マーカーが選択文字列の先頭文字よりも後ろにずれて挿入されてしまうという現象が置きました。

米国の InDesign Scripting フォーラムで問い合わせたところ、どうやらInDesignのバグであることが分かりました。

メディア・イフェクツ-DTPスクリプト開発

CS+JSとCS+VBで試してみたけど、表があっても大丈夫だった。
CS3以降はどうなのかわかりません。環境がないので……