トップ «前の日記(2007年06月14日(Thu)) 最新 次の日記(2007年06月18日(Mon))» 編集 RSS feed

shinoのときどき日記


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付与を許可してもらえたのでヘッダにライセンスをつけた。
Tags: Code

あわせて読みたい

あわせて読みたい (awasete.com)を入れてみました。


トップ «前の日記(2007年06月14日(Thu)) 最新 次の日記(2007年06月18日(Mon))» 編集 RSS feed
2000|03|
2007|01|03|04|05|06|10|12|
2008|01|02|03|04|05|06|07|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|11|12|
2015|01|02|04|05|09|10|12|
2016|01|03|04|05|08|
2017|01|02|04|05|06|07|08|09|10|
2018|05|06|
2019|08|12|
2020|01|03|04|
2021|01|12|
2022|01|09|11|
2023|01|