2008-11-25

Ruby で iCal データをマージする

興味はありつつなかなか勉強の進まない iCal. とりあえず簡単そうなところで複数のカレンダーを一つにまとめようと考えた。調べてみると、

  1. 一つのカレンダーは BEGIN:VCALENDAR から END:VCALENDAR まで
  2. RFC 2445 的にはこれを複数並べるのは可能っぽい
  3. てことは実は 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

ってできた方が便利なのでそうした。

  1. 初めて gist から貼ってみるよ! 

  2. 実際には一つしか入っていない場合がほとんどなので parse().first で問題ないけど。 

  3. RFC によると 75 octets より長かったら fold すべしと書いてある。伝統的なメールベースでの転送も考えてあるってことかな。 

About

例によって個人のなんちゃらです