Upgrade to Pro — share decks privately, control downloads, hide ads and more …

品質を担保するInDesignスクリプト

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →
Yusuke S.
October 21, 2017

 品質を担保するInDesignスクリプト

2017年10月に東京のDTP勉強会で登壇した際のセッションスライド。

Yusuke S.

October 21, 2017

Transcript

53 slides
  1. 11 イベントについて イベントに割り当てるスクリプトは自動的に (目的のイベントが発生し たときに) 実行される点が異なります。 =スクリプトパネルからダブルクリ ックしなく てよい イベントにスクリプトを割り当てるには、

    eventListenerというスクリプ トオブジェクトを使用します。 =eventListenerに登録すれば、 イベントの度に呼び出されるスクリプ トになる 〔Adobe InDesign CS6 スクリプティ ングガイド p.126より引用〕
  2. 12 #targetengine スクリプトを動作させるレイヤーのようなもの (必須) 。 何も指定しない場合は 「main」 になるが、 eventListenerは 「main」

    で は動作しない。 addEventListener ( [イベントタイプ] , [関数or File] ) eventListenerを仕込むメソ ッ ド (必須) 。 どんなイベン トで発動させたいか、 発動した場合はどんな処理を行うか を記述する。 イベントについて
  3. 17 afterOpen_versionCheck1.jsx 1 #targetengine "versionChecker" 2 app.addEventListener("afterOpen", function (ev){ 3

    if (parseInt(app.version, 10) >= 7 && 4 ev.target.constructor.name === "Document") return; 5 var curDoc = ev.target.parent; 6 var createdVer = curDoc.metadataPreferences.creator; 7 alert("保存バージョン:"+createdVer+"\rアプリバージョン:"+app. version); 8 }); 基本形はこんな感じ。 これだとち ょ っと使いづらい。 保存バージョンのチェック
  4. 23 afterOpen_versionCheck2.jsx … 保存バージョンのチェック ver2 switch文でメタデータから取得した文字列を分岐し、 配列に代入。 case "メタデータから抽出した文字列 " :

    myVerLib = ["表示させたいバージョン表記 ", バージョンの値 ]; break; 今後のバージョンに合わせて上記書式でdefault文の前に書き足す。
  5. 24 afterOpen_versionCheck2.jsx 保存バージョンのチェック ver2 以下の条件分岐を条件 (三項) 演算子で1行に記述している。 if (parseFloat(app.version) === 7.5)

    var appVer = 7.5; else var appVer = parseInt(app.version, 10); ※このような半端なバージョンが登場したら追加する必要があるかも? parseFloat (文字列) …文字列を数値型 (浮動小数点) に変換する。 parseIntと違って、 基数は指定する必要はない。
  6. 25 afterOpen_versionCheck2.jsx ドキュメントの保存バージョンとアプリケーションが一致しない場合に 警告を表示する。 また、 2つめのif文 if (myVerLib[1] !== 0)

    で、 表示する文字列を変えている (先のswitch文でどのケースにも当て はまらなかった場合) 。 保存バージョンのチェック ver2
  7. 34 exportLogFile.jsx main関数の内部 afterExportイベン トが呼ばれたときのオプション。 event.format…書き出しフ ォーマッ ト decodeURI (event.fullName)

    …書き出し先のフルパス もしイベン トを増やしてオプションを追加したい場合は、 else if (event.eventType === " [イベント] "){ … } とする。 ログファイル書き出し
  8. 35 exportLogFile.jsx main関数の内部 末尾にあるexportLog関数を呼んでいる。 引数は順に [ログのフルパス] , [ログに書き出す内容] , [区切り文字]

    作業者単位でログを書き分けたい場合は、 exportLog ("~/desktop/saegusa.txt", myLogText, "\t"); などとすると、 作業者別にログを分けることが可能。 ログファイル書き出し
  9. 36 exportLogFile.jsx myRound関数 小数第2位で四捨五入する関数。 Math.round (値) …値を四捨五入して、 最も近似の整数を返す Math.roundメソ ッ

    ドは整数しか返さないので、 2桁スライド (*100) して 四捨五入し、 改めて桁数を戻している。 value = Math.round (value*100) 100 ログファイル書き出し
  10. 37 exportLogFile.jsx exportLog関数 new File ( [ファイルパス] ) …新し く

    ファイルオブジェク トを作成 File.open ( [モード] ) …r、 w、 e、 aの4種類から指定 r:read (読み込みのみ) 、 w:write (新規書き込み) 、 e:edit (読み書き) a:append (読み書き、 ファイルの最後にカレン トポジションが移る) 今回はファイルの最後に書き加えたいのでappendとした。 ログファイル書き出し
  11. 43 注意点 InDesign CS4以降でしか機能しない。 ファイルメニューの 「書き出し」 コマンドを監視しているため、 PDF書き 出しプリセッ トからプリセッ

    トを直接選んで書き出す場合には対応でき ない。 カスタマイズ スクリプト自体はほとんどカスタマイズする余地なし。 リス トとして読み込むtxtファイルの名前は任意に変更可能。 ////////ファイル名 var listFile = "checklist.txt"; //←ここを変更 書き出し前チェックリスト
  12. 44 myCheckList.jsx 25 ev.preventDefault(); //イベントを強制中断させるメソッド 26 27 //リストの読み込み 28 var

    listAry = []; 29 var myList = tgtListFile.open('r'); 30 while (!tgtListFile.eof) listAry.push(tgtListFile.readln()); 31 tgtListFile.close(); リス トファイルを開き、 listAryに1行ずつ配列として追加していく。 File.eofは、 ファイルを読み込んでいるカレントポジションがファイルの 末尾に来るとtrueを返す。 File.readln()メソ ッ ドは、 ファイルを1行ずつ読み出す。 書き出し前チェックリスト
  13. 45 myCheckList.jsx 40 for (var i=0; i<listAry.length; i++) myDlgItems.push (add('checkbox',undefined,listAry[i]));

    41 myDlgItems.push (add ('button', undefined, "書き出し")); … 44 myDlgItems[myDlgItems.length-1].onClick = function (){ … } myDlgItemsには、 ダイアログの子要素を格納している。 一番最後にボタンを追加しているので、 myDlgItems.length-1がそのボ タン。 これのonClickプロパティに関数を与えてボタン動作を実装。 書き出し前チェックリスト
  14. 46 myCheckList.jsx 45 var checkFlag = 0; 46 for (var

    i=0; i<myDlgItems.length-1; i++) checkFlag += (0+myDlgItems[i].value); 47 if (checkFlag === (myDlgItems.length-1)){ … } リス トが全てチェックされたかどうかを判別する。 真偽値を数式に入れると (0+myDlgItems[i].value) 、 trueであれば1、 falseであれば0を返すことを利用している。 最後の条件文では、 myDlgItems.length-1 (この1はボタンの分) と、 リ ストのtrueの合計値を比較している。 書き出し前チェックリスト
  15. 47 myCheckList.jsx 49 app.menuActions.itemByName ("$ID/Export...").eventListeners. itemByName("myCheckList").remove(); 50 app.menuActions.itemByName ("$ID/Export...").invoke(); 51

    var myEv = app.menuActions.itemByName ("$ID/Export..."). addEventListener ("beforeInvoke", myCheckList); 52 myEv.name = "myCheckList"; myCheckListという名前のイベントリスナーを一旦消し (remove) 、 改 めて書き出しコマンドを実行する (invoke) 。 その上でもう一度イベン トリスナーを登録し直す。 消して登録し直すという一見回り くどい方法を採っているが、 そうしない とinvokeした時点で改めてチェックリストが呼ばれてしまう。 書き出し前チェックリスト
  16. 50 yourName.jsx 1 #targetengine "yourName" 2 app.addEventListener ("afterOpen", function (ev){

    3 alert("瀧くん…"); 4 }); afterOpenイベン トをそのまま利用するだけだと2回実行される。 イベントリスナー afterOpen ち ょ っぴりデモンストレーション
  17. 52 yourNameAtOnce.jsx 1 #targetengine "yourName" 2 app.addEventListener ("afterOpen", function (ev){

    3 if (parseInt(app.version, 10) >= 7 && 4 ev.target.constructor.name === "Document") return; 5 alert("瀧くん…"); 6 }); parseInt(app.version, 10) >= 7 …InDesignのバージョンがCS5以上の場合 ev.target.constructor.name === "Document" …開かれた対象がDocumentの場合   (ちなみに、 2回目はLayoutWindowで呼ばれている) 1 度だけ実行する afterOpen イベント

More Decks by Yusuke S.

Other Decks in Technology