Adobe IllustratorのスクリプトをTypeScriptで作成する
とりあえずRollup.jsで作ってみる。
とりあえずaiから書き出したpsdを埋め込んだaiからさらに書き出したpsdを埋め込んだai、からの書き出しをJSONに書かれた順番で行うようなスクリプトを作る。
図をアップデートした。figure.aiの画像を埋め込んだpaper1.aiの画像を埋め込んだoverview.aiがあるとき、figure.aiの更新をoverview.aiに反映させるの面倒だよね、という時のためのスクリプトを作っています。
つまりこういうことという図を作った。
この図もOverview.aiの後にエクスポートするように設定したので自動で書き出される。こうなるとPNG出力機能もつけたくなってくる。
モジュールが難しい。UMDでいいかな。
Rollup.jsもプラグインもりもりで結構ハードル高め。Parcelのシンプルさが懐かしい。
Adobe の公式リファレンスが、なかなか読みづらい。まとまってはいるんだけど。
alert
とか File
とか Folder
みたいな基本的な要素が載っていないのはなんでなんだ。別に共通部分のリファレンスがあるのか。
そしてデバッグログを見たい。フィアル出力するか。
これをやってみる。
普通に動いた。良い。
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "extendscript-debug",
"request": "launch",
"name": "compositely-export-the-document",
"program": "${workspaceFolder}/dist/compositely-export-the-document.jsx",
"stopOnEntry": false
},
{
"type": "extendscript-debug",
"request": "launch",
"name": "compositely-export-all-in-the-directory",
"program": "${workspaceFolder}/dist/compositely-export-all-in-the-directory.jsx",
"stopOnEntry": false
},
{
"type": "extendscript-debug",
"request": "launch",
"name": "Ask for script name",
"program": "${workspaceFolder}/${command:AskForScriptName}",
"stopOnEntry": false
},
]
}
こんな感じで $.writeln
が出力される。
$.writeln
についてはここにリファレンスがある。
document や artboard なんかのメンバが眺められるのとても捗る気がする。スクリプトの妄想が捗る。
プロパティツリーがたどれるのはかどる
Object.keys
がなくてメンバがわからなくて困ってたけど reflection interface
というものを使えばいけるらしい。
なかなか別世界観がある。
document.exportFileAsPsd
でファイルの上書きがあると確認ダイアログが出るのを warnings = false
で止められると思ったら止められないので、事前にアートボードの出力名を出力する関数を作り、そのファイルが存在したら削除する処理を書いたりして、まぁなんか不安が残るスクリプトになってしまった。ファイル削除は暴発が怖いんだな…
いやちょっと、ExportOptionsPSD
と ExportOptionsPNG24
全然違うじゃん…アートボードごとに出せないし、解像度指定できないし…
色々指定すればできそう。インタフェース違いすぎない…?
Rollup についてはこれを見ればwebpack触ったことがある人なら大体わかるでしょうという。
ES3難しい
三項演算子の組み合わせがES3で syntax error になる?
// OK
return result === result ? (remainder ? result - remainder : result) : 0;
// NG
return result === result ? remainder ? result - remainder : result : 0;
ExtendScriptせめてES5に追従してくれよという
lodashを使おうとして出たエラーなので、es5-shimが利用できればこの問題は無視できる。map
や forEach
辺りが使えればlodashは手放せるので。
https://github.com/ExtendScript に色々shimがある
https://github.com/ExtendScript/extendscript-es5-shim を使ってみたい。
多分本体のコードがよばれる前にshimを適用すればいけるはず…
rollupjs で shim を取り込む方法を探しているけどtreeshakingでeide-effect onlyなモジュールが消されるみたいで、どうすればいいのかよくわからない。
素直に gulp で concat しましょうメソッド
gulpの使い方を覚えるのめんどくさい
今はtscのtargetがES3になってるけど、それをES5にして実装はes5-shimを事前に読み込むようにしたい。これで型定義と実装の両面でES5にできるはず。
https://github.com/ExtendScript/extendscript-es5-shim が提供するコードはES module的なモジュールにはなっておらず、単純にグローバルを書き換える処理として書かれているので、動かしたいコードの前に #include
すればいけるけどちょっと気持ち悪い。やっぱりgulpでconcatするのがいいのか。シェルスクリプトでもいけなくはない気はする。
gulp覚えたくないので何かrollupで完結させる方法ないかなとconcat手段を探す。https://www.npmjs.com/package/rollup-plugin-copy-merge というものがあった。
rollup-plugin-shimあたりを使って、コード内でアクセスしたものだけcore-jsあたりから引っ張ってくるようにするのが一番綺麗なのかな。でもExtendScriptとcore-jsの食い合わせ的な問題を引いたら面倒なのでExtendScriptオーガニゼーションのshimを使いたいと言う気持ちがちょっと強い
https://rollupjs.org/guide/en/#plugin-development pluginを定義して乗り込んだほうがgulpを覚えるより楽な可能性を追い求める。