興味はありつつなかなか勉強の進まない iCal. とりあえず簡単そうなところで複数のカレンダーを一つにまとめようと考えた。調べてみると、
- 一つのカレンダーは BEGIN:VCALENDAR から END:VCALENDAR まで
- RFC 2445 的にはこれを複数並べるのは可能っぽい
- てことは実は cat するだけで ok ?
cat したファイルを読み込ませた結果は、
Sunbird も Apple製iCal も最初のカレンダーしか認識できなかった。
うーむ、そういうことか。やっぱ一つ一つのイベントを一つのカレンダー上に作成していかないとダメか。ということで書いてみたのは以下のコード1。
引数を与えなければオプションの与え方が表示されるので、それ見てなんとなく想像して使うよろし。
Usage: icat [options] ICS_FILES
-l, --list-from-file FILE
基本的に cat として使えるようにした。当然パイプから受け取ることはできないけど。
url の解釈には open_uri を使っているので http か ftp, あるいはファイルのパスを与えることができる。
書いてみて思ったけど、Ruby の Icalendar ライブラリも Vpim::Icalender も複数のカレンダーを認識できるっぽい。少なくとも Icalendar.parse() の結果は複数のカレンダーが含まれる形になっている。2ということはやっぱ仕様的には複数カレンダーを一つの .ics に含むのは ok なんだよね? 単に GUI アプリに対応しているのが少ないってことなのかな。
[2008-11-26 追記]
最初 Icalendar 1.0.2 を利用して動かしたら to_ical で folding の際にマルチバイト文字が壊れてしまったので Vpim::Icalendar 1.1 に差し替えました3。文字化けは解消しましたが、なんか fold してないだけのような気も…。中は読んでいないので確証はないですけど、これはこれで相互運用性に問題あるなぁ。
ところで gist を使うと貼付けたコードも履歴を取れるのがよいですね。いつか github.com がサービス停止したらコードが返ってこないという危険性はありますが。
[2008-12-03 追記]
スクリプトと同じ場所にある特定の名前の YAML からしか設定を与えられないとかアホかっちゅー仕様だったので、オプションの与え方を大幅に変えました。
[2008-12-04 追記]
さらに ics ファイルの与え方を変更。
icat *.ics > dest
ってできた方が便利なのでそうした。