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を覚えるより楽な可能性を追い求める。