Perl で iCalendar を生成する

Posted by
ぴろり
Posted at
2016/03/08 01:55
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 スケジュールの標準フォーマットである iCalendar を利用して、スケジュール データを様々なアプリケーション間で連携・活用できます。例えば、Web アプリケーションなどがわざわざ自前でカレンダー機能を実装提供せずとも、iCalendar を出力できるようにさえしておけば、Google Calendar や Microsoft Outlook、Mozilla Thunderbird など、iCalendar を読込める既存のクライアントを自由に選択して使ってもらえるので、ユーザにとってもメリットが大きいです。今回、Perl で組んだ Web アプリケーションにおいて iCalendar を生成する機会があったので、その覚書き。

このエントリーをはてなブックマークに追加  

イベント(予定)の生成と登録

 ドキュメントにあるサンプルとほとんど同じですが、掲載しないのもアレなので。Web サーバ上に CGI として動作できるようにしておき、その URL を Mozilla Thundebird や Microsoft Outlook などに登録してやれば OK。予定を一方的に吐き出すだけなので、予定の追加などはできませんが、閲覧できるだけでもかなり便利です。

use utf8;
use Data::ICal;
use Data::ICal::Entry::Event;

my $calendar = Data::ICal->new;
{
    my $new_event = Data::ICal::Entry::Event->new();
    $new_event->add_properties(
        summary => '大事な予定',
        dtstart => '2015-12-31', # 終日の予定
        description => "説明文\r\n改行もできるよ\r\n改行もできるよ",
    );
    $calendar->add_entry( $new_event );
}
print "Content-type: text/calendar; charset=utf8\n\n";
print $calendar->as_string;

解説

5 行目
Data::ICal でコンテナを作って…
8~11 行目
イベント(予定)のプロパティを設定して…
13 行目
コンテナにイベントを追加して…
16 行目
最後に as_string で出力。
9 行目
utf-8 で書けば日本語も使えます
15 行目
MIME type は text/calendar で出力します。必要であれば charset も指定すれば OK。

イベントにアラーム(通知)を追加

use utf8;
use Data::ICal;
use Data::ICal::Entry::Event;

my $calendar = Data::ICal->new;
{
    my $new_event = Data::ICal::Entry::Event->new();
    $new_event->add_properties(
        summary => '大事な予定',
        dtstart => '2015-12-31', # 終日の予定
        description => "説明文\r\n改行もできるよ\r\n改行もできるよ",
    );
    { ### イベントに通知を追加する
        my $valarm = Data::ICal::Entry::Alarm::Display->new();
        $valarm->add_properties(
            description => '!通知メッセージ!',
            trigger => [ dt2offset( '2015-12-31', -3 ), { value => 'DATE-TIME' } ],
        );
        $new_event->add_entry( $valarm );
    }
    $calendar->add_entry( $new_event );
}
print "Content-type: text/calendar; charset=utf8\n\n";
print $calendar->as_string;

sub dt2offset { ... }

解説

14 行目
通知オブジェクトを作って…
19 行目
イベントに追加します。
17 行目
ここでは、前回作った dt2offset 関数を利用して、3 営業日前に通知するよう指定しています。

iCalendar データの検証

 生成された iCalendar 形式のデータが RFC [5545][2446] の仕様通りであるか validation できる Web サービスがあります。実際、Mozilla Thunderbird の Lightning アドオンや Microsoft Outlook では取り込めても、Google Calendar で取り込めない、といった現象に遭遇したことがあります。

このエントリーをはてなブックマークに追加  


更新履歴

Updated at
2016/07/28 11:49
更新メモ
r8 iCalendar validator を追記

この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:mixi 予定表の予定一覧を iCal 形式に変換する:mixi2iCal

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。