Illustrator上のテキスト(mm単位で表記された数字)を異なる単位系(今回はinch)に変換したい、という話がTwitterでたまたま流れてきました。 ただ、後々の話からどうやらIllustratorだけでの動作ではない(別のアプリケーションに経由させる?)のかなと思って、僕はAutomatorを利用したJXAによるテキスト置換を提案しました。
今回はワークフローの作り方から書いてみますが、とっととコードが見たい、という方は記事末尾まで飛ばしてください。 サービスメニューに登録できる、一連の処理をまとめたスクリプトのようなものです。 という流れで作成できます。 ご自身でゼロから開発する場合は、デバッグに少し癖がありますので気をつけてください(今回はコードを全文掲載するので割愛します)。 デフォルト状態で 以上がコード全文の解説です。 この画像のように、テキストを選択し、コンテクストメニューから実行させてください。 AdobeのアプリケーションからはAutomatorのサービスメニューが表示されないので実行できないです。 コンテクストメニュー>サービスとたどってクイックアクションがずらっと表示されますが、増えてくると選ぶのが大変ですよね。 サービスメニューの管理は、サービスが呼び出せるアプリケーション(Finder、CotEditor、Automatorなどいろいろ)のメニューから、「"サービス"環境設定...」を開きます。 そうするとシステム環境設定のダイアログが開きますので、そこから図のような管理が可能です。
ちなみに、Automatorで作ったクイックアクション(サービス)は一部のアプリケーションからは実行できないようになっています(Adobeのアプリケーションはたいていできない)。 Automatorで作ったワークフローであれば、右クリックからAutomatorで開いたり、保存場所をFinderで開いたりすることもできます。 以上、ちょっとAutomatorの取り扱いも含めて記事にしてみました。事の経緯
元の話だとクリップボードに取り込んだテキストの処理ということだったので、ajabon師匠がAppleScriptを経由したスクリプトでの解決策を提示されていました*1。
ご覧の通り、テキストを選択してコンテクストメニューを開き、サービスからAutomatorのクイックアクションを実行させます。こうすればAdobeのアプリケーションに限らず利用できるツールになります。Automatorクイックアクションの作り方
Automatorというアプリから作成します。
コード
解説
run()
関数が設定されていて、これの引数が2つあります。
第一引数のinput
はその名の通り、ワークフローが受け取る項目(今回はテキスト)です。
形としては配列になっているので、input[0]
として取り出せます。
小数点を含んだ数字の文字列を想定しているので、JavaScriptの組み込みメソッドであるparseFloat()
*2でNumber型に変換します。return
文では、mm単位からinch単位への換算を行っています。頭から見ていきましょう。
計算結果を四捨五入するために、Math.round()
という静的メソッド*3を利用しました。
1 inch ≒ 25.4 mm なので、入力された値を単純に25.4で除算したいところですが、JavaScriptは浮動小数点の計算に誤差を生みやすいため、このような計算式としました。
小数点以下第二位まで欲しいという話だったのでMath.round(input * 100 / 25.4) / 100
とすれば求める結果になるのですが、小数点以下の計算をさせないように、あえてMath.round(input * 1000 / 254) / 100
としました。
最後についてる+ ""
ですが、実はテキストを置き換えるタイプのクイックアクションは、戻り値もしっかりString型に変換しておかないとうまく置き換わりません。
なので末尾に空の文字列を加算するという簡便な方法で対応しました。使い方
もしAdobeのアプリケーションで同じものを、となれば普通にスクリプトとして開発になるかもしれません。サービスメニューの管理
なのでショートカットキーを登録したり、使わなくなったものは非表示にするなどしてしまうと便利です。
他にもいろいろAutomatorを利用したJavaScriptの処理については記事を書いていますので、右のカテゴリーカラムからAutomator、JXAなどをぜひご覧ください。