kdoc - AppleScript

  • 作成日:2006-08-02 15:06:04
  • 修正日:2009-10-16 14:16:29

AppleScript Studio

↑ページトップへ

クラス継承関係

Xcode

↑ページトップへ

順番

  1. 新規プロジェクト作成。
    • AppleScript Application
    • AppleScript Document-based Application
    • AppleScript Droplet
  2. Info.plistの中身をいぢくる。

ヘルプを作る

リンク

AppleScript

↑ページトップへ

サンプル

--cmd+space
tell application "System Events"
 keystroke "" using command down
end tell
--アプリケーションの起動チェック
tell application "System Events"
 if application process "iPhoto" exists then
  display dialog "yes"
 else
  display dialog "no"
 end if
end tell
--appパッケージ内のResourceフォルダのパス
set rscDir to resource path of main bundle as stirng

iPhoto

↑ページトップへ

アルバムか写真か

set _theseItems to the selection
if class of item 1 of _theseItems is album then
 --album
else if class of item 1 of _theseItems is photo then
 --photo
else
 --???
end if

写真プロパティ

{
 dimensions:{480.0, 640.0},
 image filename:"06-07-24_17-02.jpg",
 image path:"/Users/XXXXX/Pictures/iPhoto Library/2006/07/24/06-07-24_17-02.jpg",
 date:"2006-07-24 17:02:00 +0900",
 title:"06-07-24_17-02",
 class:photo,
 height:640.0,
 thumbnail path:"/Users/XXXXX/Pictures/iPhoto Library/2006/07/24/Thumbs/10753.jpg",
 name:"06-07-24_17-02",
 thumbnail filename:"10753.jpg",
 comment:"",
 width:480.0,
 id:4.294978049E+9
}

もろもろ

tell appliction "iPhoto"
 --最後のロール
 select last import album
 --現在のアルバムの1枚目の写真
 select photo 1 of current album
end

リンク

その他

↑ページトップへ

do shell script

do shell script plain text -- the command or shell script to execute. Examples are "ls" or "/bin/ps -auxwww"
[administrator privileges boolean] -- execute the command as the administrator
[password plain text] -- use this administrator password to avoid a password dialog
[Result: plain text] -- the command output

キーチェーン

PackageMaker

Xcode+AppleScript+Perl、作ってみる(2009-10-08)

↑ページトップへ

環境: Mac OS X 10.4.11 / Xcode 2.2.1 / Interface Builder 2.5.3

アプリ名称を仮に「AppName」とする。

  • 新規プロジェクトで「AppleScript Application」でスタート。
  • Perlソースファイル(001.pl)は、UTF-8/LF。
  • AppleScriptソースファイル(AppName.applescript)は、エンコーディング: Unicode (UTF-8)、行末コードは「指定なし」。
    • (普通は 「日本語 (Mac OS)」にしないとダメって書いてあるのだけど)
  • Perlソースは、Xcodeのウィンドウの左欄「グループとファイル」の「Resources」へドラッグ&ドロップした。
    • 「デスティネーショングループのフォルダに項目をコピーする」にチェック(チェックしないとプロジェクト内にコピーされない)。
    • 「追記したフォルダに再起的にグループを作成する」にチェック(よく分からない)。
  • Perl Module(モジュール/ライブラリ)は、「lib」フォルダにまとめて(別にlibという名称じゃなくてもいいけど)、同様にXcodeのウィンドウの左欄「グループとファイル」の「Resources」へドラッグ&ドロップ。
    • 「デスティネーショングループのフォルダに項目をコピーする」にチェック(チェックしないとプロジェクト内にコピーされない)。
    • この場合は「追加したフォルダにフォルダ参照を作成する」にチェック(じゃないと階層が崩れる?)。

※AppleScriptソースファイルの文字コードをどうするかは、よく分からない(10.3、10.4、10.5でそれぞれ違う?)。
そもそも、AppleScript Studio環境では、ソースファイルの中に日本語は一切使わない方がいいらしい。
display dialog等、使いたいところがあれば、ローカライズファイルで対応(面倒…)。

AppleScriptソース内で、ダブルクオートのエスケープ(通常はバックスラッシュ)がなぜかうまくいかないので、以下で対応。

set dq to ASCII character 34

Perlソースの場所は、自分自身の場所から「Contents/Resources/」へ辿る。

set myPackagePath to POSIX path of (path to me) --このアプリの場所
set myResourcesPath to myPackagePath & "Contents/Resources/" --リソースの場所
set perl001Path to myResourcesPath & "001.pl"
  • Perl(UTF-8)から標準出力へ吐いたものをAppleScriptで受け取り、そのままdisplay dialogして、OK(化けない)。
    • 「lib」を参照する関係で、いちどcdしてからperlを実行。
    • 標準入力にUTF-8フラグをたてるため、perl実行時に「-CA」オプション付加。
set arg1 to "1"
set arg2 to "2"
set dq to ASCII character 34
set results to do shell script "cd " & myResourcesPath & ";" & "perl -CA " & dq & perl001Path & dq & " " & dq & arg1 & dq & " " & dq & arg2 & dq

Perlソースの先頭は、以下な感じ。

#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use Encode;
use lib './lib';
use Text::Iconv;

このPerlからテキストファイルの読み書きをするなら、通常のPerlの文字コード指定に従って指定すればよい。

#入出力がutf8の場合
use open IO => ":utf8";
#INだけ指定
use open IN => ":utf8";
#OUTだけ指定
use open OUT => ":utf8";
#Shift_JISの場合
use open IO => ":encoding(shift_jis)";
#WindowsなShift_JISなら
use open IO => ":encoding(cp932)";

あるいは、ファイルを開く際に、

open TEMP, ">:utf8", $out_path or die $!;
open TEMP, ">:encoding(cp932)", $out_path or die $!;

といった感じで毎回指定するとか。

AppleScriptからファイルやフォルダのパスをもらった場合

AppleScriptからdo shell scriptでperlの引数(@ARGV)として、パスを受け取る際の処理。

  • AppleScript内で、TextFieldから取得したパス文字列は、そのまま@ARGVへ渡す。
    • as unicode textしなくてもよい。
    • スペースが入ってたりするので、前後にダブルクオートするのを忘れずに。
    • Perl実行時に「-CA」オプションをつけているので、Perlの中に入ってきた時点で、UTF-8フラグがたってる。

Perl側で@ARGVで受け取ったパス文字列は、open/opendirしたりする場合は、そのまま使えばでOK

my $in_path = $ARGV[0];
my $in_dir = $ARGV[1];

open IN, "<:utf8", $in_path or die $!;
close IN;

opendir DIR, $in_dir or die $!;
closedir DIR;

ただし、パス文字列から、何かしら日本語を抜き出す場合は、以下の処理が必要。
(例えば、パスからフォルダ名を取得するとか)

use lib './lib';
use Encode;
use Text::Iconv;

my $in_dir = $ARGV[0];

my $in_dir_nfc = Encode::decode('UTF-8', Text::Iconv->new('UTF-8-MAC', 'UTF-8')->convert($in_dir));

Text::Iconvで、「MAC版NFD」から「普通のNFC」へ変換し、でもそうするとなぜかUTF-8フラグが落ちてしまったので、改めてEncode::decodeでUTF-8フラグをたててる。

丁寧に書くと、以下。

use lib './lib';
use Encode;
use Text::Iconv;

my $in_dir = $ARGV[0];

my $in_dir_nfc = Text::Iconv->new('UTF-8-MAC', 'UTF-8')->convert($in_dir)
my $in_dir_nfc_utf8flagged = Encode::decode('UTF-8', $in_dir_nfc);

以上でとりあえず動いた(最初に書いた環境下で)。
OSやその他の環境のバージョンが変わったら、このあたりのルールも変わっちゃうんだろうか。
以上、2009-10-16に書きました。