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)を入れてみました。
[ツッコミを入れる]
