[1] 研究上、やむを得ず身に付いていくIT関連技術 ( ( 版)) <http://www.cbrc.jp/~tominaga/tips/>
[2] >>1 の i2d (iCal → Desknet's) だと微妙にうまく動かなかったので差分:
--- i2d.orig 2004-02-12 20:01:59.000000000 +0900 +++ i2d.pl 2005-09-10 20:33:52.000000000 +0900 @@ -1,5 +1,6 @@ #!/usr/local/bin/perl -$iCalCalendar = "Library/Calendars/official.ics"; # $HOME 以下の場所 +my $iCalCalendar = shift; +#$iCalCalendar = "Library/Calendars/official.ics"; # $HOME 以下の場所 # # iCal (by Apple, Sep. 2002) の出力(vCalendar形式)をNeoJapanのDesknet'sが使う # CSVの形式に変換するフィルタ @@ -71,6 +72,8 @@ # とりあえず全部読み込んで、Unicode にして配列 @reserved に入れておく # 1行目は各フィールドの説明、2行目にだけユーザーIDとユーザー名が書いてある +=pod + $dnetCalendar = $ARGV[0]; # 第一引数で指定されていなければならない。 if (open(DNET, $dnetCalendar)) { @@ -88,13 +91,15 @@ chop($UserSystemID); chop($UserName); } +=cut + # iCal Calendar からのイベント情報抽出と整形 ################################## # イベント抽出、イベント整形を1セットにして繰り返す # 抽出したイベント情報は、desknet's の形式にして1イベント1行にまとめて、 # @events に入れる # iCal のカレンダーファイルをまずオープン。ここから読みとる。 -$iCalCalendar = $ENV{'HOME'} . "/" . $iCalCalendar; +#$iCalCalendar = $ENV{'HOME'} . "/" . $iCalCalendar; open(ICAL, $iCalCalendar) || die("iCal calendar? ->" . $iCalCalendar . "\n"); while (<ICAL>) { @@ -102,7 +107,7 @@ $content = $sdate = $edate = $comment = ""; # まずイベント抽出(イベントの内容を変数に格納する) while (<ICAL>) { - s|\n$||; # 入力行の行末の改行を削除 + tr|\x0D\x0A||d; # 入力行の行末の改行を削除 # 入力行のチェック if (/^END:VEVENT/) { last; } # イベント定義終了、次のイベント定義を探す @@ -135,7 +140,7 @@ $sdate =~ /^[0-9]{4}([0-9]{2})/; $m = $1; # 月の抽出 20020920 -> 09 $sdate =~ /^[0-9]{6}([0-9]{2})/; $d = $1; # 日の抽出 20020920 -> 20 # 時刻の指定があった場合 - if ($sdate =~ /T([0-9]{2})([0-9]{2})..$/) { $stime = $1.":".$2; } + if ($sdate =~ /T([0-9]{2})([0-9])[0-9]..$/) { $stime = $1.":".$2."0"; } else { $stime = ""; } $sdate = $y . "/" . $m . "/" . $d; # -> 2002/09/20 @@ -143,7 +148,7 @@ $edate =~ /^([0-9]{4})/; $y = $1; $edate =~ /^[0-9]{4}([0-9]{2})/; $m = $1; $edate =~ /^[0-9]{6}([0-9]{2})/; $d = $1; - if ($edate =~ /T([0-9]{2})([0-9]{2})..$/) { $etime = $1.":".$2; } + if ($edate =~ /T([0-9]{2})([0-9]{2})..$/) { $etime = $1.":".sprintf("%02d", int($2 * 0.1)*10); } else { $etime = ""; } # 終日イベントの処理 if ($stime eq "") { $edate = $sdate; } # 時刻の指定がないとき @@ -242,6 +247,7 @@ $comstr = ""; @clist = split(m|\\n|, $comment); # 文字列 \n で分割 foreach (@clist) { + tr/\x0D\x0A//d; s|\n$||; # 行末の改行を削除 if (/^$/) { next; } # 元々空行のところだったらスキップ s|\\"|"|g; # \" をただの " に置き換え