iOS版TextExpanderのJavaScriptスニペットについて

日本語情報が少なかったのでまとめました。
https://itunes.apple.com/jp/app/textexpander-3-+-custom-keyboard/id917416298?mt=8&uo=4&at=11lqq9

JavaScriptスニペット利用方法

  1. 通常のスニペット登録画面を開き「Content: (Plain)」内でホールドしてコピーメニューを出します。
  2. コピーメニュー(の一番右)から「JavaScript」を選択すると見出しが「Content: (JavaScript)」に変化します。
  3. JavaScriptソースコードを登録すると、通常のスニペットと同様の方法でJavaScriptの実行結果を展開できます。

ソースコードの書き方

基本的には最後に書いた文が展開されます。

"Java" + "Script" + " result"; // JavaScript result

TextExpander.appendOutput()を使うと複数回に分けて出力結果に追加できます。

TextExpander.appendOutput("Java");
TextExpander.appendOutput("Script");
TextExpander.appendOutput(" result"); // JavaScript result

マクロとの併用

JavaScriptの実行結果にマクロ(%を使ったスニペット)が含まれていればマクロも実行されます。

'%Y.%m.%d'; // 2015.01.01(※展開した時点の日付)

日時に関するマクロの参考:https://smilesoftware.com/help/TextExpander/datetime.html

JavaScriptとfill-inを併用した場合、展開した際に入力欄を伴ったソースコードが表示されます。
入力欄に値を入力してOKボタンを押すと入力後の状態のソースコードが実行されます。
(後述のTextExpander.filledValuesも参照)

a = '%filltext:name=hoge%'; // 「a = '入力欄に入力した値';」が実行される

発展的なマクロ(クリップボード、fill-in、カーソル位置、カーソル操作、展開時デリミタ要否設定、タブキーなど)の参考:https://smilesoftware.com/help/TextExpander/specials.html

TextExpanderオブジェクトのプロパティ

TextExpanderオブジェクトにはappendOutputの他にもプロパティがあります。*1
参考:Working With AppleScript and Shell Script Snippets – TextExpander

appendOutput

先述の通り、出力結果に追加します。

ignoreOutput

出力結果に何も出力したくない場合trueを設定します(初期値はfalse)。
例えば時刻を設定するだけのスニペットを作りたい場合などに使えます。

TextExpander.ignoreOutput = true // 出力結果なし
triggeringAbbreviation

Abbreviation(スニペット名、スニペット編集画面の上側に入力する展開元文字列)を取得します。

TextExpander.triggeringAbbreviation; // Abbreviationで指定した文字列
baseDate

展開した時点での日時を取得します。

TextExpander.baseDate; // Thu Jan 01 2015 12:34:56 GMT+0900 (JST)

またDate型のメソッドが使えます。

TextExpander.baseDate.getFullYear(); // 2015
adjustedDate

マクロの日時を設定します(初期値はbaseDate)

TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める
'%Y.%m.%d'; // 2015.01.04

またスニペットのネストを利用すると他のスニペットで利用できます。

// スニペット名:3Dadd
TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める
TextExpander.ignoreOutput = true; // 出力結果なし

として他のスニペット

%snippet:3Dadd% %Y.%m.%d 

を登録すると展開結果が2015.01.04となります。

pasteboardText

ペーストボードの文字列を取得します。

TextExpander.pasteboardText; // ペーストボードの文字列
expansionContext

スニペットが展開されたアプリケーションのbundle identifierを取得します。

TextExpander.expansionContext;
// スニペットプレビュー画面で展開した場合、com.textexpander.preview
// 他のアプリ上でTextExpanderキーボードで展開した場合、group.com.smileonmymac.tetouch
filledValues

fill-inで入力された値を取得します。

a = '%filltext:name=hoge%';
TextExpander.filledValues['hoge']; // hogeの入力欄に入力した値

使用可能なオブジェクト

Working With AppleScript and Shell Script Snippets – TextExpanderによると、OS XではJavaScriptを拡張したJavaScript for Automation (JSA)が使えますが、iOSではPlain old JavaScriptだけだそうです。
具体的にどんなオブジェクトが使えるか判然としなかった調べました。

Object.getOwnPropertyNames(this).sort();
Array,ArrayBuffer,Boolean,DataView,Date,Error,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,JSON,Map,Math,NaN,Number,Object,Promise,RangeError,ReferenceError,RegExp,Set,String,SyntaxError,TextExpander,TypeError,URIError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,WeakMap,console,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,escape,eval,isFinite,isNaN,parseFloat,parseInt,undefined,unescape

文字列操作、数学関数、正規表現、URLエンコードなどローカルで行いたい処理はおおよそ可能です。
一方、windowやXMLHttpRequestなどWEB系のオブジェクトは使えないので外部との通信を行うのは無理そうです。

おわりに

Sample JavaScripts for TextExpander 5.0 / TextExpander touch 3.5 - Smileでは

の流れのサンプル(BMI計算、給料計算、簡易計算機、PHQ-9うつ病テスト)が紹介されています。

この他にペーストボードを使えることを利用して

の流れも考えられますね。

ただキーボード切り替えが日本語環境ではかなり面倒なので対応アプリと標準キーボードの組み合わせが良さそうです。
参考:TextExpander-Enhanced Apps – TextExpander

*1:紹介されているもの以外で隠しプロパティがあるんじゃないかと探ってみましたが特に見つかりませんでした。参考:JavaScript のオブジェクトのプロパティ一覧を取得する方法とオブジェクトが指定の名前のプロパティをもっているか検査する方法 - ひだまりソケットは壊れない