DTPab

DTPにまつわるあれこれ

InDesign 15.0.2 コミュニティスクリプトを紐解く 3

今回はカーソル(キャレット)位置に任意の文字をUnicodeInjectorスクリプトについてです。
これらの記事の続きになります。

InDesign 2020(15.0.2)で追加されたコミュニティスクリプト - DTPab

InDesign 15.0.2 コミュニティスクリプトを紐解く 1 - DTPab

InDesign 15.0.2 コミュニティスクリプトを紐解く 2 - DTPab

はじめに

Adobeのヘルプだけでは心許ないので、中身をざっと解読してみました。その上でなるべく条件を整理してみたものです。間違いがあればご指摘ください。

UnicodeInjector.jsx

機能の説明

カーソル(キャレット)の位置に特定の文字列を挿入します。
挿入する文字列はファイル名に記述しておきます(後述)。

前提条件

テキストを選択せず、カーソルをテキストフレーム内に挿入した状態で実行します。
また、挿入したい文字列をファイル名に入れておきます。このとき、InDesignに挿入したい文字列を先頭から順に記述します。
記述方法は下記のとおりです(NNNN部分に任意の文字列が入ります)。

  1. U+NNNN:文字のコードポイント(16進数で1〜4桁)指定。InDesignで文字を選択した状態で情報パネルに表示される表記方法です。
  2. 0xNNNN:文字のコードポイント(16進数で1〜4桁)指定。NNNN部分はU+の場合と同じになります。
  3. 0dNNNN:文字のコードポイント(10進数)指定。

例えば、大文字の F を入力する場合、下記3つの記述方法でファイル名に入れます。

  1. U+46ないしU+0046(ファイル名としては U+0046_Insert F.jsx など)
  2. 0x46ないし0x0046(同様に 0x0046_Insert F.jsx など)
  3. 0d70(同様に 0d70_Insert F.jsx など)

1や2の記述方法がInDesignとも表記が重なるので使いやすいと思います。

f:id:uske_S:20200305213206p:plain
情報パネルの Unicode と表示される部分と同じ
ファイル名を変えて使うことになるので、Comunityフォルダに置いたまま複製すると、アクセス権の都合でその度にパスワードの入力を求められるかもしれません。なのでもし使うならユーザーフォルダ側に移動してしまったほうが使いやすいでしょう。
f:id:uske_S:20200305213804p:plain
ユーザーフォルダを右クリックして表示させる
Finder(エクスプローラー)で表示させるとそこにScript Panelというフォルダがあると思うので、その中に複製するといいと思います。

余談ですが、ESTK(ExtendScript Toolkit)やVScode(ES debugger for VSCode)のから実行すると、スクリプト内に記述されているサンプルが参照されます。 58行目にその文字列がありますので、デバッグツールで書き換えながら使いたいという場合は下記の部分を手直ししながら使えます。

const kDebugSampleScriptName = "U+0061 U+0062 Insert Unicode chars.jsx";

注意点

例えばバリエーションセレクターである U+E0101 とかは正しく入力されません*1
これは受け付けている桁数の問題だけでなく、スクリプトの内部で利用しているString.fromCharCode()メソッドの仕様にも関係します。
InDesignの情報パネルでコードポイントを確認した際に、基本的に5桁以上のものは正しく入力されない可能性が高いです*2

UnicodeInjectorへの雑感

よく使うけど入力が面倒くさい文字列、みたいなものを用意しておくといいのかなと思います。例えばですが、

  • U+2776 insert ❶.jsx
  • U+2777 insert ❷.jsx

とかで黒丸数字が簡単に入力できます*3。使い方はアイディア次第って感じですね。

ただ……辞書ツールなどで使いやすいように読みを登録した単語を叩いたほうが早いのでは…という思いが強いですw
それはこのスクリプトが挿入点にしか文字を挿入しない仕様であるということとも関係しています。
せっかくスクリプトなので、例えば選択したすべてのテキストフレームの先頭に同じ文字列を挿入できるとか、そういうふうにカスタマイズしたほうが使い勝手がよさそうだなと思いました。

コードに関しては、エラー処理を最後にまとめているのが面白いと思いました。ただこれエラーで対応する状況を増やせば増やすほど、変数とcaseが増えていくのはちょっといただけないですね。
自分なら連想配列を使って状態管理しますかね。そのあたりは本筋ではないのでまた別の機会に。
それと全体をdo/while文で実行しているのもちょっと気になりました。中にtry/catch文とif文とぐっちゃぐちゃになっていて、メンテ大変だな〜って印象です。
コード自体はあまり長くないので、リファクタリングしてみたり、好みの動作を盛り込んだりしてみても勉強になるし面白そうだなと思いました。

*1:この例では U+E010 として入力されます

*2:コミュニティスクリプトはプリインストールと同じでいつ書き換えられたり更新されたりするかわからないので、中身を書き換えるということは想定していません

*3:この記事などを参照 uske-s.hatenablog.com