The means justifies the ends
return unless $freq && exists $FREQUENCY{$freq};
$this->{frequency} = $FREQUENCY{$freq};
$this->{frequency_value} = $param{freq_value} || 0;
という部分を
return unless $freq && (exists $FREQUENCY{$freq} || $freq =~ /^[1-5]$/);
if ($freq =~ /^[1-5]$/) {
$this->{frequency} = 'MONTHLY';
my @week_str = ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
$this->{frequency_value} = $freq . $week_str[$param{freq_value}];
} else {
$this->{frequency} = $FREQUENCY{$freq};
$this->{frequency_value} = $param{freq_value} || 0;
}
に変更。これは、月の第何週の何曜日という指定形式もちゃんと変換するようにする変更。
my %rrules = $freq ne 'WEEKDAYS' ?
( FREQ => $freq, WKST => 'SU' ) :
( FREQ => 'WEEKLY', WKST => 'SU', BYDAY => 'MO,TU,WE,TH,FR' );
$rrules{UNTIL} = to_icaldate($item->until, $item->is_full_day)
if $item->until;
$args{rrule} = join ';', map { $_ . '=' . $rrules{$_} } keys %rrules;
という部分を、
my @rrules = $freq ne 'WEEKDAYS' ?
("FREQ=$freq") :
('FREQ=WEEKLY', 'BYDAY=MO,TU,WE,TH,FR');
if($item->frequency_value =~ /^\d(SU|MO|TU|WE|TH|FR|SA)$/) {
push @rrules, 'BYDAY=' . $item->frequency_value;
push @rrules, 'INTERVAL=1';
}
push @rrules, 'UNTIL=' . to_icaldate($item->until, $item->is_full_day)
if $item->until;
$args{rrule} = join ';', @rrules;
と、大胆に変更。これは、先日の改造でもちょっとひっかかった、RRULEの中の指定順序によってiCalがうまく読み込んでくれないのを回避するための変更。これによって、かならずFREQ=xxxから始まって、UNTIL=xxxxで終わるようになります(ハッシュテーブルだと順番がどうなるか分からないんだよね)。
(o)さんのコメント:
http://code.as-is.net/publi...