パスの入力

Script Editor でスクリプトのテストを行うときに、代理のファイルを使ってテストを行うことがよくあります。ファイルの中身を操作して、その結果を確認するとか。

この時、テストファイルのパスを入力するのが面倒で面倒で...。たいていの場合、テストファイルをデスクトップに置いて、

Script Editor で開く

set theFile to (path to desktop folder as Unicode text) & "test.txt"

みたいなことを書いていたのです。が、最近気づきました。対象ファイルを Script Editor のドキュメントにドラッグ & ドロップすればいいのだと。

Terminal と同じで、ファイルをドキュメントにドラッグ & ドロップすれば、そのファイルのパスに変わるのですね。全く知りませんでした。何気ないことでしたが、とても便利です。

Script Editor のコード補完

Automator にコンテンツを追加。これで最後にしたいな。Script Editor の補完機能について。

Script Editor には、コード補完機能がついていますね。スクリプトアシスタントという設定です。これ、使っている人いますか?

散々な言われ方をしていますが、私は使っています。もっとも、標準のキーバインドでは使いにくいのですが(標準は、F5)。このキーバインドは、変えることができます。Option + / にしたら使い勝手がよくなりました。

キーバインドは、この辺りを参照してみてください。Cocoa アプリケーションは、キーバインドをいろいろと変えることができますが、Script Editor のコード補完にも適用されるのです。Xcode と Objective-C のコード補完ほど便利ではないです(Script Editor は、大文字、小文字を区別する!)が、使い慣れると長い参照やクラスや命令の入力が格段に楽になりますよ。英単語の補完もしてくれますし。

DefaultKeyBinding.dict の作り方が分からないという方、ここにリンクしておきます。ここからダウンロードして ~/Library/KeyBindings にこのファイルを置いてみてください。Script Editor をいったん終了して再度起動すれば、補完が効くようになると思います。

AppleScript の新機能

Automator に少しコンテンツを追加。アクションの作り方は、そろそろ終わりにしたいな...。

AppleScript の新機能。AppleScript 1.10 なんですね。hours が常に 24 時間表記で使用するようになった。month を数字で設定できるようになった。weekday の定数に数字が使えるようになった。日曜日が 1。文字列定数に quote が加わった。バックスラッシュを付け加えるよう。

Considering/Ignoring 属性に numeric strings が加わった。

Script Editor で開く

ignoring numeric strings
    "version 1.9" is less than "version 1.10"
end ignoring

version で返ってくる値が実数になった。と、いまいち、よくわからない部分もありますが。

Xcode 2.0 の新機能

Xcode 2.0 で新しくなったこと。

Xcode で、コンパイル済みスクリプト(拡張子 scpt)の編集、保存ができるようになった。といっても、隠し機能。デフォルトではこの設定は有効になっていません。リリースノートを見れば分かることですが、なんで環境設定で設定できないの?

Xcode が起動していたらいったん終了し、Terminal で以下のコマンドを実行します。

defaults write com.apple.Xcode ASKAllowEditingOfCompiledScripts YES

再度、Xcode を起動するとコンパイル済みスクリプトの編集、保存ができるようになっています。

System Events の XML サポート

リクエストがあったので、何日か前に書いた 10.4 での新機能 XML のサポートを再掲します。Thanks!河野さん。

XML のサポートは、System Events でされています。といっても、XML のパーサやなんやかやといった便利な機能はありません。パースするにしても自分で行う必要があります。機能を調べるにあたって asahi.com:朝日新聞の速報ニュースサイトRDF を使いました。この RDF をデスクトップにおいておき以下のスクリプトを試しました。

Script Editor で開く

set theFile to (path to desktop folder from user domain as text) & "index.rdf"

tell application "System Events"
    set theData to contents of (XML file theFile)
end tell

まず、これで RDF ファイル内の XML データを取得します。よくわからないのですが、XML file クラスは、ファイルなんですが...ただ、パスでファイルを指定するだけではだめなようです。contents 属性は、XML file クラスのもので XML file の XML data クラスを表します。XML data クラスを見ると text 属性があります。これが、XML ファイル内の文字列になります。ファイルを開いたときに見ることができるデータです。

XML data クラスは、XML elements を要素として持っています。ですので、ここから個々の XML 要素をたどることができます。XML 要素というのは、タグで囲まれたデータのことです。XML は、ツリー構造になっているのでパースするには再帰を使うのが一番簡単です。

Script Editor で開く

set theFile to (path to desktop folder from user domain as text) & "index.rdf"
set theList to {}

tell application "System Events"
    set theData to contents of XML file theFile
    my parseXML(theData, theList)
end tell

theList

on parseXML(xmlData, parseResult)
    tell application "System Events"
        if not (exists XML elements of xmlData) then return

        repeat with thisItem in (XML elements of xmlData)
            set end of parseResult to {name of thisItem, value of thisItem}
            my parseXML(thisItem, parseResult)
        end repeat
    end tell
end parseXML

結構時間がかかりますね...。iTunes の XML データを調べるのにはお勧めできませんね。すべての XML 要素をただ取り出しているだけです。これだけでは何の役にも立ちません。目的の要素を秩序だって取り出すには、RDF や RSS がどのように構成されているかを知る必要があります。この辺りは、The Web Kanzaki が参考になるでしょう。asahi.com の RDF から記事の要素を取り出すだけなら、上記のスクリプトを次のようにすればいいでしょう。

Script Editor で開く

on parseXML(xmlData, parseResult)
    tell application "System Events"
        if not (exists XML elements of xmlData) then return

        repeat with thisItem in (XML elements of xmlData)
            if name of thisItem is "item" then
                set end of parseResult to thisItem
            end if
            my parseXML(thisItem, parseResult)
        end repeat
    end tell
end parseXML

取得できた記事部分の加工としては、XML elements を取り出して値を調べればいいでしょう。しかし、時間がかかる...。アルゴリズムがおかしいのかな?とてもではないですが、RSS リーダーじみたことができないですね。