後追いでたけうちとおるさんの"DTP Booster 13のお題"をば
なんだよー楽しそうじゃんよーとせっかくの後追いなのでちょっとひねってやってみた.しかもほろ酔いでw
あ,ちなみに"インなんとか"って見たことも触ったこともありません.東急インなら泊ったことがありますが.
オトナの事情でこの手の話が書けなかったってのもおそらく幻覚かなんかなんでしょう.もし小言をいわれたり怒られたりしても職権乱用すればいいのでだいじょぶだと思います.
お題としてはこんなかんじ.
・書き出されるPDFはドキュメントと同じファイル名で(拡張子が.pdfになる)同一階層に保存されるとします。
・PDF書き出しプリセットは「PDFx/1-a」です。
・PDFを書き出したドキュメントは保存せずに閉じます。
・20行以内で出来ると思います。
・多少のエラー処理はしなくて結構です。
でもってじぶんがほろ酔いで書いたのはこんなん.うごかした環境はCS4 6.0.5です.
#target InDesign //処理queue var funcs = []; //Documentオブジェクトごとの処理 var func = function(doc){ try{ var pdf = new File(doc.fullName.toString().replace(/\.indd$/,".pdf")); return function(){ try{ doc.exportFile(ExportFormat.PDF_TYPE,pdf,false,'[PDF/X-1a:2001 (日本)]'); doc.close(SaveOptions.NO); }catch(e){alert(e);}} }catch(e){alert(e);}}; //ドキュメントごとの処理をつくって処理queueにつっこむ var docs = app.documents; for(var i=0; i<docs.length; i++){ funcs.push(func(docs[i]));} //処理queueの実行 for(var i=0; i<funcs.length; i++){ funcs[i]();}
ムダなことしてるので20行以上になってますけど,後追いだし"インなんとか"を見たことも触ったこともないのでご勘弁ください.
で,ポイントはDocumentオブジェクトごとにレキシカルクロージャをつかって処理をつくって,さいごにドスンとうごかしてるとこです.これによって"ドキュメントごとになにかしたい"ってはなしになった場合にレキシカルクロージャを生成するfunctionだけ書きかえれば使いまわしもきくわけです.
このやりかたって一見ムダなことに思えるのですが,たとえばドキュメントじゃなくてテキストフレームにテキストを流しこんでる途中で文字列の判断とかで途中になんらかの処理をはさんだりしたい場合にinsertionPointsをレキシカル変数(スナップショットとかいうとわかりやすいかもですね)としておいて,テキストの流しこみが終ったあとにスナップショットとして保存されているinsertionPointsに対してなにかの処理をかませたりみたいなことができるようになるわけです.あふれ対応とかは別にしてですけどね.
ただこういった"レキシカルクロージャ生成からのあとからドスンと処理"みたいなかんじで考えると,"インなんとか"が起動したときに決まったディレクトリの複数のスクリプトファイルを読みこんで処理を組み立てられるという,"モジュラースクリプティング"が可能になるってことが容易に想像できるわけです.つまりInDesignでMVC的な発想もできるのかと.これなら「内製したい」とかいうお客さんに切り売りもできるってわけですね.クロージャ単位で売りまっせみたいなw
ちなみにレキシカルクロージャじゃなくて,Documentオブジェクトを引数にしたfunctionをうごかすっていう方法もあるんですけど,これだとfunctionがうごくごとにオブジェクトの評価が入るのでレキシカルクロージャをつかうやりかたよりも動作速度が若干遅くなるとおもいます.もっと正確にいうとオブジェクト操作のコスト自体はかわらないものの,直接InDesignを動かすという重い操作を最小限にすることができるだろうっていう発想です.けどちゃんと検証してないのであくまで理論的なはなしだし.このあたりの話になるとちょっとややこしくなるのでとりあえずやめておきますw こんな話,誰が得するんだっていう…
あ,あんまりこの内容はホンキにしないでくださいね.なんたってじぶんは"インなんとか"を見たことも触ったこともないのですから.
ちなみにこんなイベントにいけることになりましたよ.夜は田舎のスタジオにお呼ばれしてるので,本編だけになってしまうんですけど…