Safari で文字列を URL エンコード

JavaScript の話題ばかりだと愛想つかされてしまいそうです。そもそも、その成果がこのサイトに現れていないのはなぜ?とも思います。

実際には、サイトに JavaScript 関連の HTML をあげています。リンクをしていないだけで。Ajax は、ローカルだとテストできないんですね。そんなわけで色々とアップロードしてテストしているのですが、まぁ、人様に見せるほどのものではないし、JavaScript のサンプルだってあちこちに同じようなものがありますし。そのうち、Google 検索でひっかかるようになるかもしれません。

これだけだとなんですので、Safari で JavaScript を使ってエンコードをするスクリプトなんかを。

Script Editor で開く

set weekdayList to {"日", "月", "火", "水", "木", "金", "土"}
set theList to {}

repeat with i in weekdayList
    set end of theList to encodeWithJS(i)
end repeat

theList

on encodeWithJS(str)
    tell application "Safari"
        if exists front document then
            return do JavaScript "encodeURI('" & str & "')" in front document
        end if
        return str
    end tell
end encodeWithJS

on decodeWithJS(str)
    tell application "Safari"
        if exists front document then
            return do JavaScript "decodeURI('" & str & "')" in front document
        end if
        return str
    end tell
end decodeWithJS

このスクリプトを利用した結果がなにを意味しているか分からない、という人にはほとんど価値のないスクリプト。Ajax なんかで文字化けを回避するために文字列をエンコードしておきたいときがあるので、そんなときに使います。それ以外でも使えますが。Safari は、AppleScript から利用できる JavaScript 実行エンジンですね。

なんとなく、カレンダー

あいかわらず、AppleScript をほったらかしで JavaScript や XHTML、CSS、PHP に熱中しています。というか、AppleScript Studio でビューツールバーアイテムがやっぱり使えなくて意気消沈してしまいました。

Script factory さんは、時々チェックしているサイトさんなのですが、ついに、FilterScripts for mi が Objective-C で書き直されたようです。このアプリケーションが公開されたとき、刺激されて同じようなコンセプトのアプリケーションを AppleScript Studio で作成したのです。まぁ、その昔あった Script Runner のようなものですが。

Objective-C を導入する気持ち、非常によく分かります...。個人的には、Cocoa/Objective-C でアプリケーションを作成して Objective-C からAppleScript を呼び出すという方向で開発を行っています。なので、AppleScript Studio を使うのはある意味苦痛だったりします。あれもできない、これもできない、という感じで。

AppleScript Studio には、それなりにいいところがあるんですけどね。あるのかな?そう信じたい...。そんな AppleScript の最近の成果は、カレンダーです。それほど珍しいものでもないのですが、ちょっと、月ごとのカレンダーを簡単に参照したくて作ってみました。

Script Editor で開く

on run
    set calendarList to getCalendar(current date)
    set beginning of calendarList to {"日", "月", "火", "水", "木", "金", "土"}

    set calendarText to ""
    repeat with thisItem in calendarList
        set calendarText to calendarText & listToText(thisItem, tab) & return
    end repeat
    set calendarText to (date string of (current date)) & return & return & calendarText

    display dialog calendarText with icon 1 buttons {"OK"} default button 1 giving up after 15
end run

on getCalendar(selectedDate)
    set theList to {{}, {}, {}, {}, {}, {}}
    set numDaysInMonth to {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

    set currentYear to year of selectedDate
    set currentMonth to month of selectedDate as number

    set day of selectedDate to 1
    set time of selectedDate to 0

    copy selectedDate to firstOfMonth
    set startOffset to weekday of firstOfMonth as number

    set daysInMonth to item currentMonth of numDaysInMonth
    if ((currentMonth is 2) and (isLeap(currentYear))) then set daysInMonth to daysInMonth + 1

    set dayLabel to 1
    set num to 0
    repeat with i from 1 to 6
        set currentWeek to item i of theList
        repeat with j from 1 to 7
            set num to num + 1
            if (num is less than startOffset or num is greater than or equal to (daysInMonth + startOffset)) then
                set end of currentWeek to ""
            else
                set end of currentWeek to dayLabel
                set dayLabel to dayLabel + 1
            end if
        end repeat
    end repeat
    return theList
end getCalendar

on isLeap(theYear)
    return (((theYear mod 4) is 0 and ((theYear mod 100) is not 0)) or (theYear mod 400) is 0)
end isLeap

on listToText(theList, delimStr)
    set the AppleScript's text item delimiters to delimStr
    set theText to theList as text
    set the AppleScript's text item delimiters to ""
    return theText
end listToText

細かい部分を気にせずに作っているので実際に使うには不都合があると思いますが。getCalendar に date 値を渡せばその月のカレンダーをリストで返します。月によっては利用しないリストも含まれているのですが、それは気にしない。ダイアログで見る限りは、特に困らない。

AppleScript Studio でツールバーを使ってみる (2)

さて、何はともあれツールバーを使ってみましょう。AppleScript Studio では、Objective-C でデリゲートメソッドとして用意されているメソッドが toolbar クラスの属性として用意されています。AppleScript Studio ではこれらの属性を使ってツールバーを作成します。

ツールバーを利用するには、

  1. ウィンドウにつけるツールバーを作成
  2. ツールバーで利用出来るツールバーアイテムを登録
  3. デフォルトのツールバーアイテムを設定する
  4. ウィンドウに接続する

というステップを踏まなくてはいけません。これらのステップは、ツールバーを利用する上での最低限必要なものです。

それぞれのステップを具体的に見ていきます。

ツールバーは、ウィンドウに付加するものなのでウィンドウの awake from nib イベントハンドラを利用するのが手軽だと思います。まずは、プロジェクトを作成しウィンドウに awake from nib イベントハンドラを接続します。awake from nib ハンドラ内で上記のステップを行います。最初にツールバーを作成します。

set theToolbar to make new toolbar at end with properties {name:"new toolbar", identifier:"new toolbar", allows customization:true, display mode:default display mode, size mode:default size mode, auto sizes cells:true}

ツールバーの作成は make 命令で行います。ここで属性をまとめて設定しています。

name -- AppleScript がオブジェクトを判別するための名前
identifier -- ツールバーの一意の識別子
allows customization -- ツールバーのカスタマイズが行えるかどうか
display mode -- ツールバーアイテムの表示形式。アイコンのみか、アイコンとラベルか等
size mode -- ツールバーアイテムの表示サイズ
auto sizes cells -- ツールバーアイテムを自動で保存するか

これら以外にも属性はありますが、それらは後ほど。ところで、これらの属性の中の auto sizes cells ですが、これは auto saves configuration 属性のことです。この属性は、ユーザーがカスタマイズしたツールバーアイテム(ツールバーに表示される個々のオブジェクト)を自動で保存するかどうかの属性ですが、構文確認を行うとなぜか auto sizes cells になってしまいます。しかし、動作自体は正しく行われているようです。auto sizes cells は、matrix クラスの属性です。

ツールバーの作成が出来たら次にツールバーで利用出来るツールバーアイテムの登録を行います。Objective-C では、toolbarAllowedItemIdentifiers: というデリゲートメソッドで行いますが、AppleScript Studio では、toolbar クラスの allowed identifiers 属性を利用します。ツールバーは、ここに登録したツールバーアイテムのみが利用出来るようになります。ツールバーは、ツールバーアイテムの識別子を利用して個々のオブジェクトを判別します。AppleScript Studio は多くの場合、name 属性を利用して個々のオブジェクトを判別しますが、ツールバーでは name 属性ではなく identifier(識別子)を多用します。

ツールバーアイテムには、フレームワーク側が標準で用意しているツールバーアイテムがあります。

print item identifier -- 印刷
show colors item identifier -- カラーパネル表示
show fonts item identifier -- フォントパネル表示
customize toolbar item identifer -- ツールバーカスタマイズ
space item identifier -- スペース
flexible space item identifier -- 伸張可能なスペース
separator item identifier -- 区切り

いろんなアプリケーションがツールバーを利用していますが、どのアプリケーションでも共通しているツールバーアイテムがあります。それらはこういった標準で用意されているツールバーアイテムを利用しているのです。これら標準で用意されているものを使ってみます。

set allowed identifiers of theToolbar to {"print item identifier", "show colors item identifier", "show fonts item identifier", "customize toolbar item identifer", "space item identifier", "flexible space item identifier", "separator item identifier"}

ツールバーで利用出来るツールバーアイテムをここで設定します。繰り返しますが、ここでは name 属性ではなく identifier 属性を利用します。

次にデフォルトのツールバーアイテムを設定します。これまた、Objective-C では toolbarDefaultItemIdentifiers: として用意されているデリゲートメソッドが toolbar クラスの属性として用意されています。default identifiers 属性は、最初にツールバーに表示されるツールバーアイテムを設定する属性です。

set default identifiers of theToolbar to {"print item identifier", "customize toolbar item identifer"}

ここでもツールバーアイテムの identifier 属性をまとめたリストを指定します。最後にウィンドウにツールバーを設定します。

set toolbar of theObject to theToolbar

スクリプトの全体は以下のようになります。

on awake from nib theObject
    if name of theObject is "main" then
        set theToolbar to make new toolbar at end with properties {name:"new toolbar", identifier:"new toolbar", allows customization:true, display mode:default display mode, size mode:default size mode, auto sizes cells:true}

        set allowed identifiers of theToolbar to {"print item identifier", "show colors item identifier", "show fonts item identifier", "customize toolbar item identifer", "space item identifier", "flexible space item identifier", "separator item identifier"}
        set default identifiers of theToolbar to {"print item identifier", "customize toolbar item identifer"}

        set toolbar of theObject to theToolbar
    end if
end awake from nib

これでビルドして実行するとツールバーがついたウィンドウが表示されます。ツールバーをカスタマイズしてからアプリケーションを終了し、再度起動させるとカスタマイズされたツールバーが表示されます。この自動保存が先ほどの auto saves configuration 属性になります。

ざっと駆け足でしたが、ツールバーの詳しいことは次回。

AppleScript Studio でツールバーを使ってみる (1)

やっとと言うかなんと言うか...、AppleScript Studio 1.4 においてようやくツールバーがサポートされました(それを言うならやっとこのサイトで取り上げたですね)。AppleScript Studio 1.4 のリリースノートやサンプルプロジェクトを眺めてみて...これは、Objective-C で行う場合をそのまま AppleScript 的に書いているだけですね。

もっと、楽に実装できるのかと思いました。Objective-C の方も相変わらずコードの方からでないとツールバーを制御することができないわけですが。しかし、用意されているイベントハンドラが代表的なものだけしかないので細かい制御となると Objective-C で行わないといけません。この辺りがいかんともしがたいのですね。AppleScript Studio...。

サンプルとクラスの属性を見ただけですが、画像でのツールバーしか使えない?ポップアップメニューやテキストフィールドとかの UI を利用したツールバーは作れないのでしょうか?そういえば、AppleScript Studio で NSView を操作するのって出来なかったような。アプリケーション実行中にウィンドウの NSView を張り替えようと思って試してみて出来なかった記憶があります。試してみる前から暗雲が。。。

もし、UI を使ったツールバーが利用できないなら、いまいちですね。検索用のテキストフィールドをつけることすら出来ないのですから。

ともあれ、今月は AppleScript Studio を久しぶりにいじってみます。