Automatorにはあらかじめ様々なアクションが用意されていますが、自分の必要とするアクションがあるとは限りません。
そんな時は自分でアクションを作成する必要があります。
アクションはXcodeを使って開発することができます。
XcodeはMac App Storeから無料でダウンロードできます。
この記事ではmacOS 10.12.5、Xcode 8.3.3を使用しています。
目次
Automatorアクションのプロジェクト作成
メニューから File > New > Project... を選択し新規プロジェクトを作成します。
プロジェクトのテンプレートはmacOS > Automator Actionを選択。
今回のアクションの名前"Replace Strings"を入れてTypeはCocoaにします。
言語としてAppleScriptを利用する時はCocoa-AppleScript、シェルスクリプトはShell Scriptになります。
プロジェクトの設定
Automatorのアクションを開発する上で何を受け取って何を出力するかという部分が重要になります。
OS標準のAutomatorのアクションとしては、ファイルの選択はありますが、ファイルを開いてテキストを取り出すアクションがありません。
また、受け取ったテキストをファイルに保存するアクションはあるので、今回のアクションの入力はファイルのパスとし、出力はテキストとします。
入力のファイルのパスはプロジェクト作成後のデフォルトで"com.apple.cocoa.path"が入っているため変更の必要はありません。
出力については設定がないため、"com.apple.cocoa.string"を追加します。
Automator InfoのCategoryをTextにしておけば、Automatorのアクションの分類がテキストになり、Automatorのアクションのリストで見た時にテキストの項目に入ります。
その他の入力/出力のタイプの一覧はこちらにあります。
Automator Action Property Reference
https://developer.apple.com/library/content/documentation/AppleApplications/Conceptual/AutomatorConcepts/Articles/AutomatorPropRef.html
ユーザーインタフェース(GUI)の作成
Automatorのアクションをフローに加えた時に表示されるGUIはmain.xibで定義します。
今回は置換前の文字列と置換後の文字列をユーザーから入力してもらうためのTextFieldを配置しました。
ここに入力された文字列を実行されるコードの方に受け渡すためにBindingという機能を使用します。
Bindingを使用するとAutomatorのアクションのクラスであるAMBundleAction内のparameters(NSMutableDictionary)に、GUI上で入力された内容が自動的に反映されます。
XcodeではDictionaryで使用するKey値を設定します。
今回は置換対象文字列のKey値としてtargetString, 置換後の文字列のKey値としてreplaceStringとしました。
配置したTextFieldを選択し、Bindings Inspectorを表示しValueのBind toを有効にして"Model Key Path"に"targetString"を入れます。
同様に置換後の文字列の方も設定します。
さらに、ParametersオブジェクトのObject ControllerのKeysにも同じ文字列を入れます。
詳しいBindingの説明はこちらにあります。
Establishing Bindings
https://developer.apple.com/library/content/documentation/AppleApplications/Conceptual/AutomatorTutorialAppleScript/EstablishBindings/EstablishBindings.html
コードの入力
1 2 3 4 5 6 7 |
#import <Automator/AMBundleAction.h> @interface Replace_Strings : AMBundleAction - (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#import "Replace_Strings.h" @implementation Replace_Strings //Finderでファイルを選択した時には、inputはファイルのパスが入ったNSArrayとなる - (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo { //置換対象となる文字列と置換後の文字列をUIから取得 NSString *targetString = [[self parameters] objectForKey:@"targetString"]; NSString *replaceString = [[self parameters] objectForKey:@"replaceString"]; //NSArrayからテキストファイルのパスを取り出す NSString *tmpInput = [input objectAtIndex:0]; NSError *error = nil; //テキストファイルから文字列を読み込む NSString *inputText = [NSString stringWithContentsOfFile:tmpInput encoding:NSUTF8StringEncoding error:&error]; //文字列を置換 NSString *resultString = [inputText stringByReplacingOccurrencesOfString:targetString withString:replaceString]; //置換後の文字列を次のアクションに渡す return resultString; } @end |
InfoPlist.stringsでアクションの説明を追加
InfoPlistの内容を変更すれば、Automatorでアクションを選択した時に表示される説明文を変更できます。
ビルドと実行
ビルドはメニューの Product > Build (Cmd+B)から実行できます。
ビルドされたら出来上がったアクションのファイルを
/Library/Automator/
もしくは
~/Library/Automator/
に入れます。
入れた後にAutomatorを立ち上げると今回作成したアクションが追加されています。
アクションが正しく動作するかどうか確かめて見ます。
デスクトップに「このファイルは置換前のテキストです。」と入力したテキストファイル"text.txt"を用意します。
Automatorでフローを作成して、置換対象の文字列に「前」、置換後の文字列に「後」を入れます。
実際に実行してデスクトップに生成されたファイルを確認すると文字が置換されていました。
その他
今回はテキストファイルを開いて置換を行うアクションを作成しましたが、
テキストファイルを開く
テキストを置換する
という2つの動作を行っており、より柔軟にフローを作成できるようにするためにはそれぞれを別のアクションとして開発した方が良いです。