Paepoi

Paepoi » macOS Tips » macOS アプリを JXA (AppleScript) で拡張

macOS アプリを JXA (AppleScript) で拡張

# 最終更新日 2019.10.13

Catalina での動作確認、及び 72dpi 変換をクイックアクションから移動。
ZIP 作成でキャンセルしても zip ファイルが作成されていたのを修正。

概要
拡張スクリプトを有効にするには Script Editor.app の設定から
[メニューバーにスクリプトメニューを表示] にチェックを入れます。

img/se.png

メニューに表示されたアイコンをクリックするとスクリプトメニューが出る。
[スクリプトフォルダを開く] で開いたディレクトリに *.scpt か *.js を入れます。
ちなみにパスは以下です。
# 最後の Finder 等がアプリ名
~/Library/Scripts/Applications/Finder

img/sm02.png

*.js の場合はシバンと実行パーミッションを忘れずに。
*.scpt なら実行パーミッションは不要です。

Finder での例
Retina Display ではスクリーンショットが 144dpi になる。
72dpi に変換し '72dpi-' の接頭子を付けて別名保存する (sh)
#!/usr/bin/osascript

// change72dpi.js

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

let selections = Application('Finder').selection();
for (let item of selections) {
    if (item.nameExtension() === 'png') {
        let fullPath = decodeURI(item.url()).slice(7);
        let pos = fullPath.lastIndexOf('/');
        let path = fullPath.substr(0, pos);
        let name = item.name();
        app.doShellScript(`cd '${path}'
        src_width=$(sips -g pixelWidth '${name}' | cut -s -d ':' -f 2 | cut -c 2-)
        width=$(($src_width / 2))
        sips -s dpiHeight 72.0 -s dpiWidth 72.0 -Z $width '${name}' --out '72dpi-${name}'`);
	}
};

端末を使わずに選択ファイルに実行パーミッションを付ける。
#!/usr/bin/osascript

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

let selections = Application('Finder').selection();
for (let item of selections) {
    let path = decodeURI(item.url()).slice(7);
    app.doShellScript(`chmod +x ${path}`);
};

__MACOSX の無い ZIP アーカイブの作成
プロンプトを出してアーカイブ名を決められるオマケ付き
#!/usr/bin/osascript

// create_zip.js (JXA Finder Script)
// Zip compress without '__MACOSX'
// and Ask ZIPFILE name prompt

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

// get pwd
let finder = Application('Finder');
let uri = finder.finderWindows()[0].target().url();
let pwd = decodeURI(uri).slice(7, uri.length-1);

// get dirname
let dir = pwd.slice(pwd.lastIndexOf('/')+1);

// ask Archive Name (Default: DirName)
let name = app.displayDialog('Archive Name ?', {
    defaultAnswer:`${dir}`
}).textReturned;

// create command line
if (name != "") {
    // let sh = `tar -zcvf ${name}.tar.gz`; // tar.gz
    let sh = `zip -r ${name}.zip`;
    let selections = finder.selection();
    for (let item of selections) {
        sh += ` ${item.name()}`;
    };

    app.doShellScript(`cd ${pwd}
    ${sh}`);
}

デジカメからコピーした画像等のファイル名を全部小文字に変更
#!/usr/bin/osascript

let selections = Application("Finder").selection();
for (let item of selections) {
    // Get Property
    let s = item.name();
    // Set Property
    item.name = s.toLowerCase();
};

現在 Finder で開いているディレクトリから端末を開始
#!/usr/bin/osascript

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

let uri = Application('Finder').finderWindows()[0].target().url();
let path = decodeURI(uri).slice(7);
app.doShellScript(`open -a Terminal "${path}"`);

Windows の「送る」のように使う(Atom.app での例)
#!/usr/bin/osascript

let selections = Application('Finder').selection();
let fullpath = decodeURI(selections[0].url()).slice(7);

let app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript(`open -a Atom ${fullpath}`);

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