今回は簡単な話にしたいところやはりメンバーが揃うと難しくなってしまって、そこをきっちり調整していただいた秋葉秀樹さん(WebCreator Extends Designer!?)にはホント感謝です。すごいよね。秋葉さんって
「Scriptをテーマにしたディスカッション」であかねさんのScriptに偉そうにご意見させていただいたのですが、これは仕込まれたネタでもあります。あかねさんはホントはもっと上手に書けるのにわざと初心者っぽく書いてもらっています。
ちくちく日記 大阪DTPの勉強会
僕が指摘させていただいたのは、関数を細かく分けるサブルーチン化と
これでもかとちりばめられた細かなエラー処理、リストが多い。ぐらいです。
細かなエラー処理は( as Unicode textとかset Pict_Frame_list to (every rectangle whose label is equal to Frame_Name))はおそらく現場で苦労されていると見ました。あと、現場との距離もあるんだろうなぁ。
それと僕はダイアログを何度も出すのが嫌いなので1回だけにしています。
せうぞーさんは逆に汎用性がなくなるので細かくユーザに選んでもらうようにしたほうが良いと言われました。
というかせうぞーさんと僕とはスクリプトの作り方が大きく違う部分があって懇親会でも少しお話したのですが、どっちがどっちというのは無いのですが、それもおもしろかったです。
JavaScriptのほうがすごく速いのには驚きましたが。いつのまにこんなスピード差がっ!!!
せうぞーさんの作り直しJavaScriptはこちら
TSV(タブ区切りテキスト)からXMLを簡易生成
TSVからInDesignのXML流し込み
rubyからTwitterへOAuthで投稿す
で僕なりに直したコードをアップしますのでご覧下さい。
読み込むテキストファイルのところに
「ドキュメントフォルダ」「画像フォルダ」「流し込みスクリプト」があるのが前提にしています。
ソースはこちら20100925akane_Script.zip
on run set Drop_Files to (choose file with prompt "テキストファイルを選択してください") as list ---テスト用テキストファイルを指定 my main(Drop_Files) end run on open Drop_Files my main(Drop_Files) end open on main(Drop_Files) repeat with Drop_File in Drop_Files --ドロップされたファイルに繰り返し tell application "Finder" to set Script_Folder to container of Drop_File --スクリプトのあるフォルダーのパス set Script_Folder to Script_Folder as Unicode text set Daishi_File to Script_Folder & "流し込みスクリプト:台紙.indd" --InDesignの台紙ファイルを設定 set Picture_File_Folder to Script_Folder & "画像フォルダ:" --InDesignの台紙ファイルを設定 set Save_Folder to Script_Folder & "ドキュメントフォルダ:" -- set Open_Txt_File to open for access Drop_File --ファイルにアクセス set Read_Txt to read Open_Txt_File --ファイルを読み込む close access Open_Txt_File --ファイルをクローズ --テキストからリストを作成 set DLMT to AppleScript's text item delimiters --現在のデリミタを保存する set AppleScript's text item delimiters to {return} --デリミタを改行に set Documenttext_List to (every text item of Read_Txt) --テキストからリストを作る my inddmain(Documenttext_List, Daishi_File, Picture_File_Folder, Save_Folder) set AppleScript's text item delimiters to {DLMT} --デリミタを元に戻す --display dialog Daishi_File end repeat end main on inddmain(Documenttext_List, Daishi_File, Picture_File_Folder, Save_Folder) --マスターページの指定 set Master_page to 1 --流しこみ項目とラベルのリストを作成 set Label_list to {"商品番号", "商品名", "価格", "賞味期限", "商品内容", "画像"} set Fnc_list to {"T", "T", "T", "T", "T", "P"} set Syohin_no to 1 set Syohin_Name to 2 set Syohin_Kakaku to 3 set Syomi_Kigen to 4 set Syohin_Naiyou to 5 set Syohin_Photo to 1 repeat with Documenttext in Documenttext_List set InDes_Doc to my indd_make_document(Master_page, Daishi_File) set AppleScript's text item delimiters to {tab} --デリミタをタブに set Item_List to (every text item of Documenttext) --テキストからリストを作る --流しこみ項目とラベルのリストを作成 ---項目に対する処理 --価格に"円"をつける if (item Syohin_Kakaku of Item_List) is not equal to "" then set (item Syohin_Kakaku of Item_List) to ((item Syohin_Kakaku of Item_List) & "円") end if --画像ファイルのパスを作成する if (item Syohin_Photo of Item_List) is not equal to "" then set Item_List to Item_List & (Picture_File_Folder & (item Syohin_Photo of Item_List) & ".eps") end if --賞味期限に"賞味期限"を付ける if (item Syomi_Kigen of Item_List) is not equal to "" then set (item Syomi_Kigen of Item_List) to ("賞味期限:" & (item Syomi_Kigen of Item_List)) end if --テキストフレームと内容のリストに繰り返し処理 set repeat_count to count (Label_list) repeat with i from 1 to repeat_count set Frame_Name to item i of Label_list set My_contents to item i of Item_List set Fnc_Name to item i of Fnc_list if Fnc_Name is "T" then my indd_set_text(InDes_Doc, Frame_Name, My_contents) else if Fnc_Name is "P" then my indd_set_picture(InDes_Doc, Frame_Name, My_contents) end if end repeat --ドキュメント保存先の指定 set Save_Path to (Save_Folder & (item Syohin_no of Item_List) & ".indd") my indd_save_document(InDes_Doc, Save_Path) end repeat end inddmain on indd_make_document(Master_page, Daishi_File) tell application "Adobe InDesign CS4" activate --台紙ドキュメントを開く set InDes_Doc to open file Daishi_File --台紙ファイルを開く set InDes_Doc to (a reference to active document) tell InDes_Doc set applied master of page 1 to master spread Master_page --マスターページを適用する override master page items of page 1 destination page page 1 --masterページアイテムを上書きする--編集可能にする end tell end tell return InDes_Doc end indd_make_document on indd_save_document(InDes_Doc, Save_Path) tell application "Adobe InDesign CS4" save InDes_Doc to Save_Path --ドキュメントを別名で保存 close InDes_Doc saving no --ドキュメントを閉じる end tell end indd_save_document on indd_set_text(InDes_Doc, Frame_Name, Text_contents) tell application "Adobe InDesign CS4" tell InDes_Doc tell page 1 --ラベルのついたテキストフレームを探す --set Text_Frame_list to (every text frame whose label is equal to Frame_Name) --set Text_Frame to item 1 of Text_Frame_list tell text frame Frame_Name set contents to Text_contents --テキストフレームにテキストを入れる end tell end tell end tell end tell end indd_set_text on indd_set_picture(InDes_Doc, Frame_Name, Pict_path) tell application "Adobe InDesign CS4" tell InDes_Doc tell page 1 --ラベルのついたグラフィックフレームを探す --set Pict_Frame_list to (every rectangle whose label is equal to Frame_Name) --set Pict_Frame to item 1 of Pict_Frame_list tell rectangle Frame_Name place Pict_path --グラフィックフレームに画像を入れる fit given proportionally --画像を短辺合わせでフレームにおさめる fit given center content --画像をセンターに end tell end tell end tell end tell end indd_set_picture
ところで僕の事を神レベルの人と勘違いされている方が多いのですが、プログラムのスキルむしろ底辺レベルです。ただブログを書いてるだけで僕よりうまい人はいっぱいいます。って信じてくれないんだろうなぁー。
あと、僕のスライドで僕自身あやふやな- 変数名や関数名の付け方
- {の位置
- インデント方法
- 外部関数を読み込むか?
- HPにコードを晒すときの工夫
ですが
変数名や関数名の付け方
大きなソースを書くわけではないので自分の中でわかりやすく。あと予約語とかぶらないように何らかの接頭語をつけるなどしているというぐらいで、なんでも良いのかなという結論。
{の位置ですが
僕が使うのは
for(var i=0 ; i < 10 ; i++){ mycontents = contents_ary[i]; }
たまに本でも見かけるのは
for(var i=0 ; i < 10 ; i++) { mycontents = contents_ary[i]; }
どっち使う?というもので圧倒的に上でした。なんか始まりと終わりが1行ずづでないと気持ち悪いんですよね。秋葉さんは下はActionScriptで見るとおっしゃっていました。
インデント方法
はプログラマーの世界ではTabなんか使って素人かっみたいなのもあるのですが、圧倒的にTabでした。よかったー。(僕もTab派)
外部関数を読み込むか?
会場にひとりだけでした。(同じ会社だけど)でも大きいソース書く時は必要だと思います。僕みたいにフリーウェアでアップするようなものだと外部関数は使わないかな。
HPにコードを晒すときの工夫
はてなの書き方でJavaScriptとかすると勝手にカラーリングしてくれるそうです。いいなぁ。便利。
スライドはこちら20100925.pdf