今作業中の個人的メモ。
iCalデータ構造を解説したサイト。
Cocoaな覚書
iCalendar仕様
OyajinAppointmentのデータをエクスポートした時の繰り返しデータのフォーマット。
“Repeat Status”
“Daily 2006/11/13 2006/11/20 1 Date 11/13 Mon 2nd Nov”
“Weekly 2006/11/6 2006/12/31 1 Date 11/6 Mon 1st Nov”
“Monthly 2006/11/8 2007/8/8 1 Pos 11/8 Wed 2nd Nov”
“Yearly 2006/11/10 2007/11/10 1 Pos 11/10 Fri 2nd Nov”
という感じ。
パラメータの意味は、
1 繰り返し種別(毎日、毎週、毎月、毎年)
2 開始日
3 終了日
4 間隔
5 繰り返し基準(Date:日 Pos:曜日)
6 月日
7 曜日
8 第?
9 月名(Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec)
というところ。
Oyajinでは、繰り返しデータを変更した場合、その変更を繰り返しデータ全体に行うか、そのアイテムのみに適用するのかを選択する事ができる。
例えば、繰り返しデータを残しつつ、1つのアイテムのみを削除することができるのだ。が、エクスポートのデータにはその変更は反映されない。
iCalendarのデータ形式のうち繰り返し部分(上記サイトを参考)
FREQ
繰り返し種別。Valueとして、DAILY、WEEKLY、MONTHLY、YEARLY。
UNTIL
繰り返し期限。Valueとして日付データ(NSCalendarDateの形式でいえば例えば、%Y%m%dT%H%M%S)をとる。
COUNT
そのイベントが繰り返される回数。UNTILかこのCOUNTのどちらかで期限を設定する。どっちも記述がない場合は、無期限。Valueは自然数。
INTERVAL
繰り返し間隔。Valueとして自然数をとって、FREQとの組み合わせで何日毎、何週間毎などが設定できる。
BYDAY
曜日指定(日曜=SU、月曜=MO、火曜=TU、水曜=WE、木曜=TH、金曜=FR、土曜=SA)前に付加される数字は第?曜日かを示す。
具体的には、
RRULE:FREQ=DAILY;COUNT=3;INTERVAL=1
これだと「毎日の繰り返しを三回」
RRULE:FREQ=DAILY;UNTIL=20030210T145959;INTERVAL=2
「二日ごとの繰り返しを2003年2月10日まで」
RRULE:FREQ=WEEKLY;UNTIL=20030210T145959;INTERVAL=2;BYDAY=FR
「2週おきの金曜日を2003年2月10日まで」
RRULE:FREQ=MONTHLY;COUNT=2;INTERVAL=1;BYMONTHDAY=10
「毎月10日を2回」
ULE:FREQ=MONTHLY;COUNT=2;INTERVAL=1;BYDAY=2FR
「毎月第二金曜日を2回」
いずれにしても、データ表現が異なるので、全てを再現することは不可能。
iCalのデータをOyajin用データに変換する場合、
例えば、”Daily 2006/11/13 2006/11/20 1 Date 11/13 Mon 2nd Nov”というデータを組むには、
まず、FREQで種別を取得、開始日は当該イベントの日付でOK。
終了日はUNTILがあればその日付、無ければ、COUNTから求める(開始日+INTERVAL*(7or30or365))。UNTILもCOUNTも無ければ、iCalでは無限に繰り返すことになるが、Oyajinの場合は、無限の期限設定は無いので、開始日から1年後などに設定する。
INTERVALはデフォルトを1とする。
繰り返し基準は、BYDAYがあればPosであり、BYMONTHDAYがあればDateとなる。
これ以降のデータは、当該イベントの日付データをセットすればよい。
繰り返しデータの1つのイベントのみを削除すると、その日のイベントの項目の中に「RECURRENCE-ID」というパラメータが追加される。
「RECURRENCE-ID」が含まれるデータは繰り返しデータからのぞかれることになるようだ。
しかしこれらルールをすっきりと処理する事はできるのだろうか。