InDesignで配置実行前にデフォルトの文字スタイルを[なし]にする(CS3〜)

お久しぶりですこんばんは。主にやる気の問題でご無沙汰しておりました。

InDesignのタグ付きテキスト配置にありがちなこと

タグ付きテキストを[配置]で流し込むとき、タグで指定していないはずのスタイルが適用されてしまうことがあります。デフォルト状態(アプリケーション上で何も選択していない状態)のときにパネルで選んでおいたスタイルが、タグでスタイルを明示していない部分のテキストに適用されるためです。
うまく使えば便利なときもあるかもしれませんが、うっかりやらかしたときはがっくり来ますorz
……ありがちとか言ったけど、私だけだったらどうしよう。まあいい。

うっかり防止隊をつくろう

というわけで、やらかしそうになったときにInDesignが防止してくれるスクリプトを作りました。
具体的には、[配置]を(メニューからでも、ショートカットからでも)実行するときに、デフォルトの文字スタイルを[なし]に設定してくれるというものです*1 *2
メニューやイベントを使っているため、InDesign CS3以降でしか動きません。いつものことですが、動作確認はWindows XP(SP3)、InDesign CS4でのみ行っています。

// 配置前にデフォルト文字スタイルを[なし]にする

#targetengine "noDefaultCharaStyle"

(function(){

  // [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定
  app.menuActions.item("$ID/Place...").addEventListener("beforeInvoke", function(event){

    // ドキュメントはイベント発生時に都度確認する
    var actDoc = app.activeDocument;

    // すでにデフォルト文字スタイルが[なし]のときは何もせず終了
    if( actDoc.textDefaults.appliedCharacterStyle.index == 0 ){ return; }

    // デフォルト文字スタイルを[なし]に変更
    actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles[0];

  }); // イベントハンドラ設定ここまで

})();

だいたいコメントの通りですが、[配置]が選択されて実行される直前(beforeInvoke)に毎回デフォルトの文字スタイルを確認し、[なし]になっていなかったら変更する処理を行うよう設定します。
このスクリプトを実行しただけでは何も起きません(起きたように見えません)が、InDesign側ではうっかり防止隊が結成されています。Scriptsフォルダの下のStartup Scriptsフォルダ(なかったら自分で作る必要あり)に入れておいて、InDesignの起動時に毎回実行されるようにしておくと便利かもしれません。
そうそう、このスクリプトExtendScript Toolkitから実行すると動きませんので、使うときはファイルに保存してスクリプトパネル上から実行する必要があります*3

うっかり防止隊はInDesignが終了した時に解散になります。InDesignを終了させずにこの設定を解除したいときは、

// 配置実行前の処理を消去する

#targetengine "noDefaultCharaStyle"

(function(){
    var listeners = app.menuActions.item("$ID/Place...").eventListeners;
    for( var i = listeners.length -1; i > -1; i-- ){
        if( listeners[i].eventType == "beforeInvoke" ){ listeners[i].remove(); }
    }
})();

これを実行すればOKです*4

うっかり防止隊をちょっと親切にしてみる

最初のスクリプトだと、文字スタイルで[なし]以外を選んだまま配置したいときには一度設定を解除しなければなりません。それはそれで、逆うっかりをやらかす可能性があります。
なので少し改良して、配置するときに文字スタイルを[なし]にするかどうか訪ねるダイアログが出せるようにしてみました。

// 配置前にデフォルト文字スタイルを[なし]にする

#targetengine "noDefaultCharaStyle"

(function(){

// ★変更前に毎回確認のダイアログを出すかどうか設定する
// (true:確認する false:確認しない)
// ----------------------------------

  var askBefore = true;

// ----------------------------------


  // [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定
  app.menuActions.item("$ID/Place...").addEventListener("beforeInvoke", function(event){

    // ドキュメントはイベント発生時に都度確認する
    var actDoc = app.activeDocument;

    // すでにデフォルト文字スタイルが[なし]のときは何もせず終了
    if( actDoc.textDefaults.appliedCharacterStyle.index == 0 ){ return; }

    // 毎回確認する設定(askBeforeがtrue)ならダイアログを出す
    if( askBefore ){
      var dlg = new Window("dialog", "うっかりしてませんか!");
      dlg.add("statictext", undefined, "デフォルト文字スタイルを[なし]にしますか?");
      dlg.bGroup = dlg.add("group");
      dlg.bGroup.orientation = "row";
      dlg.bGroup.add("button", undefined, "はい", {name:"OK"});
      dlg.bGroup.add("button", undefined, "いいえ", {name:"Cancel"});
      if( dlg.show() != 1 ){ return; } // 「はい」ボタン以外なら何もせず終了
    }

    // デフォルト文字スタイルを[なし]に変更
    actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles[0];

  }); // イベントハンドラ設定ここまで

})();

★のところの変数askBeforeをtrueにしておくと、配置ダイアログが出る前に文字スタイルを変更するかどうかのダイアログが出るようになります。こんなの↓

falseにすれば確認なしで変更します。
もちろん、確認ダイアログが出るのは[なし]以外の文字スタイルが選択されているときだけです。うっかり防止を名乗るならこうでなくてはね!
なお、これを解除したいときにもさっきの削除用スクリプトが使えます。

これさえあれば

タグ付きテキストの配置で延々待たされたあげくに「見つからない字形の保護」とか言われて orz ってなることもなくなるはずだっ!

*1:配置するのがテキストかどうかは判定しない(できない)ので、画像を配置したいときにも処理が行われます

*2:段落スタイルをタグで明示しないことはあんまりないと思うので、今回は無視しています

*3:tergetengineの指定が必要なだけなので、正確に言えば初回だけファイルから起動すればInDesignの再起動まではESTK上からでも動きますが……ていうか名前がてきとうすぎる

*4:ただしこれだと[配置]のbeforeInvokeイベントハンドラが全部消えます、手抜きです