Paepoi

Paepoi » JXA Tips » JXA の基本

JXA の基本

# 最終更新日 2020.06.14

JXA 公式サイト
OS X 10.10 Release Notes

JXA をターミナルで実行
# Apple Script と JXA は同じ osascript コマンドを使用します
# JXA を使うには -l オプションを使います
# 対話形式で JXA を使うには -i オプションを使います
# ~/.zshrc に jxa 等の名前でエイリアスを作っておくと便利
# console.log の戻り値 undefined も表示されることに注意
# 対話を終了するには control+D を押します

osascript -l JavaScript -i
>> console.log('ほげ');
ほげ
=> undefined
>>



# -e オプションで直接 Terminal.app に直接コードが書けます
# -i の対話形式以外では戻り値は表示されません
# 使う人は滅多にいないと思うけど

osascript -l JavaScript -e "console.log('ひげ');"



# オプション無しなら stdin を実行する
# 使う人は絶対にいないと思うけど

echo "console.log('はげ');" | osascript -l JavaScript



# 引数に JXA で書かれたファイルを指定すれば実行される
# 拡張子無しにする場合は -l オプション必須です
# js という拡張子があれば -l オプションは不要

osascript src.js

JXA をファイルから実行
#!/usr/bin/osascript

/**
 * 上記のようにファイル名を指定すれば実行できます
 * 更に一行目にシバンを書けば実行パーミッションだけで実行できます
 * Atom で atom-runner を使えばシバンのとおりに実行されるので便利
 */

console.log('ファイルから実行');

Objective-C Bridge
#!/usr/bin/osascript

ObjC.import('Cocoa');

/**
 * 公式等でみかける上記により Foundation, AppKit の関数が使えます
 * Foundation, AppKit はもちろん個別で指定してもいい
 * 他にも stdio, unistd 等が使えますのでこの Tips で例を書いています
 * 他にも沢山あるので公式の Objective-C Bridge 以下をご覧ください
 */

$.NSLog("%@", $('日本語'));

StandardAdditions
#!/usr/bin/osascript

/*
 * AppleScript は直接 do shell script みたいに書ける
 * JXA で StandardAdditions を使うには下記のようにする
 * StandardAdditions については ScriptEditor.app で
 * command+shift+L から参照してください
 */

let app = Application.currentApplication();
app.includeStandardAdditions = true;

app.doShellScript('ls', {alteringLineEndings: false});

app.displayAlert('日本語も問題無し');

stdin, stdout
#!/usr/bin/osascript

/*
 * stdout は console.log() でいいです
 * ただし最後に必ず改行が入るのでまとめて出力するなどする
 * stdin は readline が普通に使えます
 */

ObjC.import('readline');

let s = $.readline('>> ');
console.log(`入力されたのは ${s} です`);

ファイルの読み書き
#!/usr/bin/osascript

/*
 * UTF-8 になる前の各国毎 Locale かつ改行は CR になるコード
 * 具体的には日本語環境では MacJapanese になる
 * https://ja.wikipedia.org/wiki/MacJapanese
 */

let app = Application.currentApplication();
app.includeStandardAdditions = true;

const lines = `読み書きはできるけど MacJapanese になる例
AppleScript の «class utf8» を使う裏技は JXA では使えない
http://piyocast.com/as/archives/432
そもそもこの手段も Apple 公式では公開されていないマジ裏技
素直に NSString や下記の cat を使いましょう`;

let path = Path('/Users/sasakima-nao/_output.txt');
let w = app.openForAccess(path, {
    writePermission: true
});
try {
    app.write(lines, {to: w, as: 'text'});
}
finally {
    app.closeAccess(w);
}

let r = app.openForAccess(path);
try {
    let s = app.read(r);
    console.log(s);
}
finally {
    app.closeAccess(r);
}

シェルスクリプトの実行
#!/usr/bin/osascript

/*
 * 下記のようにすると出力が戻る、パイプも当然のように使える
 * この cat の出力は UTF-8 のまま戻ってくるので上記の心配は無い
 * ただし alteringLineEndings を指定しないと戻り値の改行が CR に変換される
 * それで問題ない場合以外は必ず指定するように
 */

let app = Application.currentApplication();
app.includeStandardAdditions = true;

let s = app.doShellScript('cat aaa.js | grep let', {alteringLineEndings: false});
let lines = s.split('\n');
let num = 0;
for (line of lines) {
    num++;
    let head = num.toString().padStart(4, '0');
    console.log(`${head} ${line}`);
}

Copyright(C) sasakima-nao All rights reserved 2002 --- 2020.