AppleScript → JavaScript: первый опыт

В Mac OS X Yosemite помимо кошмарного AppleScript добавлена поддержка JavaScript. Теперь для написания различной автоматизации наконец можно воспользоваться более-менее вменяемым языком программирования: из JavaScript будет доступно все то, что раньше было доступно из AppleScript.

Одно «но»: документирован джаваскриптовый API пока практически никак — на сайте Apple есть единственная страничка с довольно скудным описанием. И готовых скриптов в сети пока что очень мало.

Восполним этот пробел несколькими примерами, на которых хорошо видно некоторые неочевидные вещи.

Проверка: существует ли файл или папка

function file_exists(name) {
    try {
        return Application('System Events').files.byName(name).exists()
    } catch (e) {
        return false;
    }
}

function folder_exists(name) {
    try {
        return Application('System Events').folders.byName(name).exists()
    } catch (e) {
        return false;
    }
}

file_exists('~/Desktop/exists.txt');    // true
file_exists('~/Desktop/no-exists.txt'); // false
folder_exists('/Library');              // true
folder_exists('/somethingelse');        // false

Гист на гитхабе.

Особенность вызовов files.byName и folders.byName в том, что если вместо файла окажется существующий каталог (или наоборот: файл вместо каталога), то будет сгенерирована ошибка. Поэтому вызовы обернуты в try {} catch(e) {}.

Диалоговые окна

var result,
    my_app = Application.currentApplication();

my_app.includeStandardAdditions = true;

result = my_app.displayDialog(
    'What is your name',
    {
        defaultAnswer: 'John Doe'
    }
);

my_app.displayNotification (
    'Nice to see you',
    {
        withTitle: 'Cool script',
        subtitle: 'Hello, ' + result.textReturned + '!'
    }
);

result = my_app.displayDialog(
    'Choose Red or Blue (10 seconds to answer)',
    {
        buttons: ['Red', 'Blue'],
        defaultButton: 'Red',
        givingUpAfter: 10
    }
);

my_app.say('You choose ' + (result.buttonReturned === '' ? 'Red' : result.buttonReturned));

Гист на гитхабе.

Две особенности. Во-первых доступиться к самому себе скрипт может через Application.currentApplication().

Во вторых, чтобы заработали диалоговые окна и прочее необходимо установить свойство приложения includeStandardAdditions = true. Подробное описание библиотеки StandardAdditions доступно в Script Editor, меню File > Open Dictionary или Cmd+Shift+O.

Вывести ссылки на основные библиотеки можно через меню Window > Library или с клавиатуры Cmd+Shift+L.

Работа с iTunes

var my_app = Application.currentApplication(),
    itunes = new Application('iTunes'),
    selection;

my_app.includeStandardAdditions = true;
itunes.includeStandardAdditions = true;
selection = itunes.selection();

if (selection.length > 0) {
    for (var i in selection) {
        itunes.play(selection[i]);
        my_app.displayNotification (
            selection[i].artist() + ' is my favorite artist',
            {
                withTitle: 'Cool jukebox',
                subtitle: 'Now playing: ' + selection[i].name()
            }
        );
        delay(7);
    }
} else {
    itunes.activate();
    itunes.displayDialog('Please select a few tracks in iTunes and try again!');
}

Гист на гитхабе.

Настройка Script Editor

Указать язык можно в правом верхнем углу редактора:

Switch  AppleScript to JavaScript

Либо в настройках Script Editor указать JavaScript в качестве Default Language.