2007年06月15日(Fri)
■ (gcal2text.pl改変) Tie::iCalでGoogle Calendarのデータ利用(2)
昨日に引き続き、塚本さんが作成されたgcal2text.plを改変してみました。
今回はデータに対して、日付の範囲指定を有効にしました。
使い方
>gcal2text.pl ics_filename [YYYYMMDD [YYYYMMDD]]
- 第一パラメータ
- iCal形式ファイルです。
- 第二パラメータ
- 開始日付(省略可)
- 第三パラメータ
- 終了日付(省略可)
コマンド発行例
1.データに対する抽出開始、終了の日付を指定してデータをテキスト変換する
>gcal2text.pl hogehoge.ics 20070610 20070616
この場合、hogehoge.icsにある、2007/06/10から2007/06/16までに開始日が設定されてるスケジュールを抽出し、テキストに変換します。
2.データに対する抽出開始日付を指定してデータをテキスト変換する
>gcal2text.pl hogehoge.ics 20070610
この場合、hogehoge.icsにある、2007/06/10以降に開始日が設定されているスケジュールを抽出し、テキストに変換します。
3.全データをテキスト変換する
>gcal2text.pl hogehoge.ics
日付指定が省略されていれば、hogehoge.icsに記述されている全スケジュールをテキスト変換します。
ソース
# # gcal2text.pl version:0.302 # # Copyright (C) 2006, Makio Tsukamoto <tsukamoto@gmail.com> # Copyright (C) 2007, shino <shino@freedomcat.com> # You can redistribute it and/or modify it under GPL2. use Date::Manip; use Tie::iCal; use Jcode; sub get_time; sub date_cmp; # 出力文字コードの指定 my $jcode = 'utf-8'; #my $jcode = 'sjis'; # ファイルの読み込み my $file = $ARGV[0]; my $param_start = $ARGV[1]; my $param_end = $ARGV[2]; #print "\$file=$file \$param_start=$param_start \$param_end=$param_end\n"; my %events; tie %events, 'Tie::iCal', $file || die qq(Can't read "$file".); my @items = map { $events{$_}->[1] } keys(%events); untie(%events); # ソート、テキストへの変換 @items = sort { $a->{'DTSTART'}->[1] cmp $b->{'DTSTART'}->[1] } @items; $jcode = undef unless (Jcode->can($jcode)); my @texts; foreach my $item (@items) { if( ($param_start ne '') ){ if( &date_cmp( $item->{'DTSTART'}->[1] ) ){ #print "$item->{'DTSTART'}->[1] データを飛ばします\n"; next; } } my $time = &get_time($item->{'DTSTART'}->[1],$item->{'DTEND'}->[1]); my $subj = $item->{'SUMMARY'}; my $desc = $item->{'DESCRIPTION'}; $desc = '' if (ref($desc) eq 'ARRAY' and @{$desc} == 0); $desc =~ s/\\n/\n/g if (not ref($desc)); $desc =~ s/(^\n+|\n+$)//gs; my $text = "■ $subj ($time)\n\n$desc\n\n"; $text = jcode($text)->$jcode if ($jcode); $text =~ s/\s+\n\n$/\n\n/s; push(@texts, $text); } # 出力 print @texts; sub get_time{ my ($start,$end) = @_; my $time; my $from_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($start =~ /^(\d{4})(\d{2})(\d{2})/); my $till_date = sprintf("%04d/%02d/%02d", $1, $2, $3) if ($end =~ /^(\d{4})(\d{2})(\d{2})/); my $from_time = sprintf(" %02d:%02d", $1, $2, $3) if ($start =~ /T(\d{2})(\d{2})(\d{2})/); my $till_time = sprintf(" %02d:%02d", $1, $2, $3) if ($end =~ /T(\d{2})(\d{2})(\d{2})/); if( $from_date eq $till_date ){ #同じ日の予定(YYYY/MM/DD HH:MM - HH:MM) $time = "$from_date $from_time - $till_time"; #終日予定 } elsif(($from_time eq '') && ($till_time eq '')) { $from = ParseDate($from_date); $till = ParseDate($till_date); $till = DateCalc($till, "-1 days"); $flg = Date_Cmp($from, $till); if($flg<0){ $till_date = sprintf("%04d/%02d/%02d",$1, $2, $3) if( $till =~ /^(\d{4})(\d{2})(\d{2})/); #複数日終日予定 (YYYY/MM/DD - YYYY/MM/DD) $time = "$from_date - $till_date"; } elsif($flg==0) { #1日のみの終日予定(YYYY/MM/DD) $time = "$from_date"; } } else { #複数日予定(YYYY/MM/DD HH:MM - YYYY/MM/DD HH:MM) $time = "$from_date $from_time - $till_date $till_time"; } $time =~ s/ +/ /g; return $time; } sub date_cmp { my ($start) = @_; my $flg; my $ret; $start_date = ParseDate($start); $ps_date = ParseDate($param_start); $ps_date = Date_SetTime($ps_date,"00","00","00"); $pe_date = ParseDate($param_end); $pe_date = Date_SetTime($pe_date,"23","59","59"); # データ日付とパラメータ開始日の比較 $flg = Date_Cmp($start_date, $ps_date); if( $flg < 0 ){ # print "パラメータ開始日よりも前:該当しない\n"; $ret = 1; }elsif( $flg==0){ # print "パラメータ開始日と同じ :該当する\n"; $ret = 0; }else { # print "データ日付がパラメータ開始日よりも後\n"; if( $param_end eq '' ){ # print "終了日付が指定なし :該当する\n"; $ret = 0; } else { $flg = Date_Cmp($start_date, $pe_date); if( $flg < 0 ){ # print "パラメータ終了日よりも前:該当する\n"; $ret = 0; }elsif( $flg==0 ){ # print "パラメータ終了日と同じ :該当する\n"; $ret = 0; }else{ # print "パラメータ終了日よりも後:該当しない\n"; $ret = 1; } } } return $ret; }
マイナーバージョンアップ
- 0.300
- バージョン0.3初回掲載
- 0.301
- 開始日がパラメータでした終了日の場合、AM00:00以外のデータが抽出できない件に対応
$ps_date = ParseDate($param_start); $pe_date = ParseDate($param_end);
↓
$ps_date = ParseDate($param_start); $ps_date = Date_SetTime($ps_date,"00","00","00"); $pe_date = ParseDate($param_end); $pe_date = Date_SetTime($pe_date,"23","59","59");
- 0.302
- 塚本さんからコードに対するGPL2付与を許可してもらえたのでヘッダにライセンスをつけた。
■ あわせて読みたい
あわせて読みたい (awasete.com)を入れてみました。