なんとなく、カレンダー

あいかわらず、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 値を渡せばその月のカレンダーをリストで返します。月によっては利用しないリストも含まれているのですが、それは気にしない。ダイアログで見る限りは、特に困らない。

0 件のコメント :

コメントを投稿