Changeset 504 for cybozu2ical/trunk/lib
- Timestamp:
- 08/28/08 02:04:02 (4 months ago)
- Location:
- cybozu2ical/trunk/lib/WWW
- Files:
-
- 2 modified
-
CybozuOffice6/Calendar.pm (modified) (12 diffs)
-
CybozuOffice7/Calendar.pm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
cybozu2ical/trunk/lib/WWW/CybozuOffice6/Calendar.pm
r503 r504 14 14 15 15 sub new { 16 my ($class, %param) = @_;17 $param{url} ||= delete $param{cybozu_url};18 $param{host} ||= URI->new( $param{url})->host;19 $param{ua} ||= LWP::UserAgent->new();16 my ( $class, %param ) = @_; 17 $param{url} ||= delete $param{cybozu_url}; 18 $param{host} ||= URI->new( $param{url} )->host; 19 $param{ua} ||= LWP::UserAgent->new(); 20 20 bless \%param, $class; 21 21 } 22 22 23 sub url { shift->_accessor('url', @_) } 24 sub host { shift->_accessor('host', @_) } 25 sub username { shift->_accessor('username', @_) } 26 sub userid { shift->_accessor('userid', @_) } 27 sub password { shift->_accessor('password', @_) } 28 sub ua { shift->_accessor('ua', @_) } 29 sub input_encoding { shift->_accessor('input_encoding', @_) } 23 sub url { shift->_accessor( 'url', @_ ) } 24 sub host { shift->_accessor( 'host', @_ ) } 25 sub username { shift->_accessor( 'username', @_ ) } 26 sub userid { shift->_accessor( 'userid', @_ ) } 27 sub password { shift->_accessor( 'password', @_ ) } 28 sub ua { shift->_accessor( 'ua', @_ ) } 29 sub input_encoding { shift->_accessor( 'input_encoding', @_ ) } 30 30 31 sub _accessor { 31 32 my $this = shift; 32 my $key = shift;33 my $key = shift; 33 34 $this->{$key} = shift if @_; 34 35 $this->{$key}; … … 38 39 my $this = shift; 39 40 40 my $res = $this->{ua}->post($this->{url} . '?page=SyncCalendar', { 41 _System => 'login', 42 _Login => 1, 43 csv => 1, 44 notimecard => 1, 45 defined $this->{username} ? (_Account => $this->{username}) : (), 46 defined $this->{userid} ? (_Id => $this->{userid} ) : (), 47 Password => $this->{password} || '', 48 }); 41 my $res = $this->{ua}->post( 42 $this->{url} . '?page=SyncCalendar', 43 { 44 _System => 'login', 45 _Login => 1, 46 csv => 1, 47 notimecard => 1, 48 defined $this->{username} ? ( _Account => $this->{username} ) : (), 49 defined $this->{userid} ? ( _Id => $this->{userid} ) : (), 50 Password => $this->{password} || '', 51 } 52 ); 49 53 confess 'Failed to access Cybozu Office 6: ' . $res->status_line 50 unless $res->is_success;54 unless $res->is_success; 51 55 52 56 my $content = $res->content; 53 from_to( $content, $this->{input_encoding} || 'shiftjis', 'utf8');54 my @lines = grep /^\d+,ts\.\d+,/, split( /\r?\n/, $content);57 from_to( $content, $this->{input_encoding} || 'shiftjis', 'utf8' ); 58 my @lines = grep /^\d+,ts\.\d+,/, split( /\r?\n/, $content ); 55 59 $this->{response} = \@lines; 56 60 … … 65 69 my @lines; 66 70 while (<FH>) { 67 chomp; push @lines, $_; 71 chomp; 72 push @lines, $_; 68 73 } 69 74 close(FH); … … 82 87 83 88 my $csv; 84 if (eval('require Text::CSV_XS')) { 85 $csv = Text::CSV_XS->new({ binary => 1 }); 86 } elsif (eval('require Text::CSV')) { 87 $csv = Text::CSV->new(); 88 } else { 89 confess 'Text::CSV_XS or Text::CSV package is required'; 89 if ( eval('require Text::CSV_XS') ) { 90 $csv = Text::CSV_XS->new( { binary => 1 } ); 91 } 92 elsif ( eval('require Text::CSV') ) { 93 $csv = Text::CSV->new(); 94 } 95 else { 96 confess 'Text::CSV_XS or Text::CSV package is required'; 90 97 } 91 98 92 99 my @items; 93 for my $line ($this->response) { 94 $csv->parse($line) 95 or confess 'Failed to parse CSV input'; 96 my @fields = $csv->fields; 97 my $num_fields = @fields - 1; 98 next if $num_fields < 13; 99 $fields[1] =~ s/^ts\.//; # remove rubbish 100 101 # Cybozu Calendar CSV Format 102 # GENERIC | RECCURENT 103 # [ 0] id? | id? 104 # [ 1] created | created 105 # [ 2] <BLANK> x start_date / end_date 106 # [ 3] start_date x initial start_date? 107 # [ 4] end_date x until_date 108 # [ 5] start_time | start_time 109 # [ 6] end_time | end_time 110 # [ 7] <BLANK> | freq 111 # [ 8] <BLANK> | freq_value 112 # [ 9] ??? | ??? 113 # [10] ??? | ??? 114 # [11] abbrev | abbrev 115 # [12] summary | summary 116 # [13] description | description 117 118 my %param; 119 @param{qw(id created start_time end_time freq freq_value abbrev summary description)} = @fields[0,1,5..8,11..13]; 120 $param{time_zone} = $this->{time_zone} || 'Asia/Tokyo'; 121 122 my $item; 123 if (!$param{freq}) { 124 @param{qw(start_date end_date)} = @fields[3,4]; 125 $item = WWW::CybozuOffice6::Calendar::Event->new(%param); 126 } else { 127 @param{qw(start_date end_date until_date)} = @fields[2,2,4]; 128 if ($num_fields > 13) { 129 my @exdates = @fields[14..$num_fields]; 130 $param{exdates} = \@exdates; 131 } 132 my $freq = $param{freq}; 133 if ($freq =~ /^[1-5]$/) { 134 $param{freq} = 'm'; 135 my @week_str = ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); 136 $param{freq_value} = $freq . $week_str[$param{freq_value}]; 137 } 138 $item = WWW::CybozuOffice6::Calendar::RecurrentEvent->new(%param); 139 } 140 141 next unless $item; 142 $item->comment($line); # save the CSV line as for debug info. 143 push @items, $item; 100 for my $line ( $this->response ) { 101 $csv->parse($line) 102 or confess 'Failed to parse CSV input'; 103 my @fields = $csv->fields; 104 my $num_fields = @fields - 1; 105 next if $num_fields < 13; 106 $fields[1] =~ s/^ts\.//; # remove rubbish 107 108 # Cybozu Calendar CSV Format 109 # GENERIC | RECCURENT 110 # [ 0] id? | id? 111 # [ 1] created | created 112 # [ 2] <BLANK> x start_date / end_date 113 # [ 3] start_date x initial start_date? 114 # [ 4] end_date x until_date 115 # [ 5] start_time | start_time 116 # [ 6] end_time | end_time 117 # [ 7] <BLANK> | freq 118 # [ 8] <BLANK> | freq_value 119 # [ 9] ??? | ??? 120 # [10] ??? | ??? 121 # [11] abbrev | abbrev 122 # [12] summary | summary 123 # [13] description | description 124 125 my %param; 126 @param{ 127 qw(id created start_time end_time freq freq_value abbrev summary description) 128 } = @fields[ 0, 1, 5 .. 8, 11 .. 13 ]; 129 $param{time_zone} = $this->{time_zone} || 'Asia/Tokyo'; 130 131 my $item; 132 if ( !$param{freq} ) { 133 @param{qw(start_date end_date)} = @fields[ 3, 4 ]; 134 $item = WWW::CybozuOffice6::Calendar::Event->new(%param); 135 } 136 else { 137 @param{qw(start_date end_date until_date)} = @fields[ 2, 2, 4 ]; 138 if ( $num_fields > 13 ) { 139 my @exdates = @fields[ 14 .. $num_fields ]; 140 $param{exdates} = \@exdates; 141 } 142 my $freq = $param{freq}; 143 if ( $freq =~ /^[1-5]$/ ) { 144 $param{freq} = 'm'; 145 my @week_str = ( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' ); 146 $param{freq_value} = $freq . $week_str[ $param{freq_value} ]; 147 } 148 $item = WWW::CybozuOffice6::Calendar::RecurrentEvent->new(%param); 149 } 150 151 next unless $item; 152 $item->comment($line); # save the CSV line as for debug info. 153 push @items, $item; 144 154 } 145 155 wantarray ? @items : $items[0]; … … 150 160 sub new { 151 161 my $class = shift; 152 my $self = {153 is_full_day => 0,154 modified=> DateTime->now,162 my $self = { 163 is_full_day => 0, 164 modified => DateTime->now, 155 165 }; 156 166 bless $self, $class; … … 159 169 } 160 170 161 sub id { shift->_accessor('id', @_) } 162 sub start { shift->_accessor('start', @_) } 163 sub end { shift->_accessor('end', @_) } 164 sub summary { shift->_accessor('summary', @_) } 165 sub description { shift->_accessor('description', @_) } 166 sub created { shift->_accessor('created', @_) } 167 sub modified { shift->_accessor('modified', @_) } 168 sub is_full_day { shift->_accessor('is_full_day', @_) } 169 sub comment { shift->_accessor('comment', @_) } 171 sub id { shift->_accessor( 'id', @_ ) } 172 sub start { shift->_accessor( 'start', @_ ) } 173 sub end { shift->_accessor( 'end', @_ ) } 174 sub summary { shift->_accessor( 'summary', @_ ) } 175 sub description { shift->_accessor( 'description', @_ ) } 176 sub created { shift->_accessor( 'created', @_ ) } 177 sub modified { shift->_accessor( 'modified', @_ ) } 178 sub is_full_day { shift->_accessor( 'is_full_day', @_ ) } 179 sub comment { shift->_accessor( 'comment', @_ ) } 180 170 181 sub _accessor { 171 182 my $this = shift; 172 my $key = shift;183 my $key = shift; 173 184 $this->{$key} = shift if @_; 174 185 $this->{$key}; … … 176 187 177 188 sub parse { 178 my ($this, %param) = @_;179 180 $this->{id} = $param{id}|| '0';189 my ( $this, %param ) = @_; 190 191 $this->{id} = $param{id} || '0'; 181 192 $this->{time_zone} = $param{time_zone} || 'Asia/Tokyo'; 182 193 183 my $start = $this->to_datetime( $param{start_date}, $param{start_time});184 my $end = $this->to_datetime( $param{end_date}, $param{end_time});194 my $start = $this->to_datetime( $param{start_date}, $param{start_time} ); 195 my $end = $this->to_datetime( $param{end_date}, $param{end_time} ); 185 196 return unless $start && $end; 186 197 187 198 # (start_time == empty) => A full-day event 188 199 # (start_time != empty) && (end_time == empty) => A malformed event 189 if ($param{start_time} eq ':') { 190 $start = $start->truncate(to => 'day'); 191 $end = $end->add(days => 1)->truncate(to => 'day'); 192 $this->{is_full_day} = 1; 193 } elsif ($param{end_time} eq ':') { 194 $end = $start->clone->add(minutes => 10); 200 if ( $param{start_time} eq ':' ) { 201 $start = $start->truncate( to => 'day' ); 202 $end = $end->add( days => 1 )->truncate( to => 'day' ); 203 $this->{is_full_day} = 1; 204 } 205 elsif ( $param{end_time} eq ':' ) { 206 $end = $start->clone->add( minutes => 10 ); 195 207 } 196 208 $this->{start} = $start; 197 209 $this->{end} = $end; 198 210 199 $this->{created} = DateTime->from_epoch(epoch => $param{created} || 0); 200 201 my $summary = ($param{abbrev} ? $param{abbrev} . ': ' : '') . $param{summary}; 211 $this->{created} = DateTime->from_epoch( epoch => $param{created} || 0 ); 212 213 my $summary = 214 ( $param{abbrev} ? $param{abbrev} . ': ' : '' ) . $param{summary}; 202 215 $this->{summary} = $summary; 203 216 $this->{description} = $param{description} || $summary; … … 208 221 sub to_datetime { 209 222 my $this = shift; 210 my ($ymd, $hms) = @_;223 my ( $ymd, $hms ) = @_; 211 224 212 225 my %args; 213 return unless $ymd && ($ymd =~ m!^(\d+)/(\d+)/(\d+)$! || $ymd =~ m!^da\.(\d+)\.(\d+)\.(\d+)$!); 214 @args{qw(year month day)} = ($1, $2, $3); 215 216 if ($hms && $hms ne ':') { 217 return unless $hms =~ m!^(\d+):(\d+)(?:\:?(\d+)?)$!; 218 @args{qw(hour minute second)} = ($1, $2, $3 || 0); 219 @args{qw(hour minute second)} = (23, 59, 59) if $args{hour} > 23; 220 } else { 221 @args{qw(hour minute second)} = (0, 0, 0); 226 return 227 unless $ymd 228 && ( $ymd =~ m!^(\d+)/(\d+)/(\d+)$! 229 || $ymd =~ m!^da\.(\d+)\.(\d+)\.(\d+)$! ); 230 @args{qw(year month day)} = ( $1, $2, $3 ); 231 232 if ( $hms && $hms ne ':' ) { 233 return unless $hms =~ m!^(\d+):(\d+)(?:\:?(\d+)?)$!; 234 @args{qw(hour minute second)} = ( $1, $2, $3 || 0 ); 235 @args{qw(hour minute second)} = ( 23, 59, 59 ) if $args{hour} > 23; 236 } 237 else { 238 @args{qw(hour minute second)} = ( 0, 0, 0 ); 222 239 } 223 240 … … 231 248 use base qw( WWW::CybozuOffice6::Calendar::Event ); 232 249 233 sub rrule { shift->_accessor('rrule', @_) } 250 sub rrule { shift->_accessor( 'rrule', @_ ) } 251 234 252 # for compatibility 235 sub frequency { shift->_accessor('frequency', @_) }236 sub frequency_value { shift->_accessor('frequency_value', @_) }237 sub until { shift->_accessor('until', @_) }253 sub frequency { shift->_accessor( 'frequency', @_ ) } 254 sub frequency_value { shift->_accessor( 'frequency_value', @_ ) } 255 sub until { shift->_accessor( 'until', @_ ) } 238 256 239 257 sub exdates { … … 244 262 } 245 263 246 our %FREQUENCY = ( y => 'YEARLY', m => 'MONTHLY', w => 'WEEKLY', 247 d => 'DAILY', n => 'WEEKDAYS' ); 264 our %FREQUENCY = ( 265 y => 'YEARLY', 266 m => 'MONTHLY', 267 w => 'WEEKLY', 268 d => 'DAILY', 269 n => 'WEEKDAYS' 270 ); 271 248 272 sub parse { 249 my ($this, %param) = @_;273 my ( $this, %param ) = @_; 250 274 $this->SUPER::parse(%param); 251 275 … … 256 280 # rrule 257 281 my %rrule = (); 258 if ($FREQUENCY{$freq} eq 'WEEKDAYS') { 259 %rrule = ( FREQ => 'WEEKLY', BYDAY => 'MO,TU,WE,TH,FR' ); 260 } else { 261 %rrule = ( FREQ => $FREQUENCY{$freq} ); 262 } 263 if ($param{freq_value} =~ /^\d(SU|MO|TU|WE|TH|FR|SA)$/) { 264 $rrule{BYDAY} = $param{freq_value}; 265 $rrule{INTERVAL} = 1; 282 if ( $FREQUENCY{$freq} eq 'WEEKDAYS' ) { 283 %rrule = ( FREQ => 'WEEKLY', BYDAY => 'MO,TU,WE,TH,FR' ); 284 } 285 else { 286 %rrule = ( FREQ => $FREQUENCY{$freq} ); 287 } 288 if ( $param{freq_value} =~ /^\d(SU|MO|TU|WE|TH|FR|SA)$/ ) { 289 $rrule{BYDAY} = $param{freq_value}; 290 $rrule{INTERVAL} = 1; 266 291 } 267 292 268 293 # until 269 if ($param{until_date} =~ m!^(\d+)/(\d+)/(\d+)$! || $param{until_date} =~ m!^da\.(\d+)\.(\d+)\.(\d+)$!) { 270 my %args = (year => $1, month => $2, day => $3); 271 my $until; 272 if ($this->{is_full_day}) { 273 $until = $this->to_datetime($param{until_date}, ':'); 274 } else { 275 $until = $this->{end}->clone->set(%args); 276 $until->set_time_zone('UTC'); # timezone must be UTC 277 } 278 $rrule{UNTIL} = $until; 294 if ( $param{until_date} =~ m!^(\d+)/(\d+)/(\d+)$! 295 || $param{until_date} =~ m!^da\.(\d+)\.(\d+)\.(\d+)$! ) 296 { 297 my %args = ( year => $1, month => $2, day => $3 ); 298 my $until; 299 if ( $this->{is_full_day} ) { 300 $until = $this->to_datetime( $param{until_date}, ':' ); 301 } 302 else { 303 $until = $this->{end}->clone->set(%args); 304 $until->set_time_zone('UTC'); # timezone must be UTC 305 } 306 $rrule{UNTIL} = $until; 279 307 } 280 308 … … 282 310 283 311 # exdates 284 if ( defined $param{exdates}) {285 my @exdates;286 for (@{$param{exdates}}) {287 push @exdates, $this->to_datetime($_, $param{start_time});288 }289 $this->{exdates} = \@exdates;312 if ( defined $param{exdates} ) { 313 my @exdates; 314 for ( @{ $param{exdates} } ) { 315 push @exdates, $this->to_datetime( $_, $param{start_time} ); 316 } 317 $this->{exdates} = \@exdates; 290 318 } 291 319 -
cybozu2ical/trunk/lib/WWW/CybozuOffice7/Calendar.pm
r503 r504 20 20 21 21 my $now = DateTime->now; 22 my $setdate = $now->clone->subtract(days => $date_range)->strftime('da.%Y.%m.%d'); 23 my $enddate = $now->clone->add(days => $date_range)->strftime('da.%Y.%m.%d'); 22 my $setdate = 23 $now->clone->subtract( days => $date_range )->strftime('da.%Y.%m.%d'); 24 my $enddate = 25 $now->clone->add( days => $date_range )->strftime('da.%Y.%m.%d'); 24 26 25 27 my $params = { 26 _System=> 'login',27 _Login=> 1,28 defined $this->{username} ? (_Account => $this->{username}) : (),29 defined $this->{userid} ? (_Id => $this->{userid} ): (),30 Password => $this->{password} || '',28 _System => 'login', 29 _Login => 1, 30 defined $this->{username} ? ( _Account => $this->{username} ) : (), 31 defined $this->{userid} ? ( _Id => $this->{userid} ) : (), 32 Password => $this->{password} || '', 31 33 }; 32 34 33 35 # First, get a list of EID 34 my $res = $this->{ua}->post($this->{url} . '?page=ApiCalendar', { 35 %$params, 36 SetDate => $setdate, 37 EndDate => $enddate, 38 }); 36 my $res = $this->{ua}->post( 37 $this->{url} . '?page=ApiCalendar', 38 { 39 %$params, 40 SetDate => $setdate, 41 EndDate => $enddate, 42 } 43 ); 39 44 confess 'Failed to access Cybozu Office 7: ' . $res->status_line 40 unless $res->is_success;45 unless $res->is_success; 41 46 42 47 my @lines; 43 for my $line (split(/\r?\n/, $res->content)) { 44 next unless $line =~ /^ts\.\d+,(\d+),(da\..+$)/; 45 46 # Second, get a complete event from EID 47 my $res = $this->{ua}->post($this->{url} . '?page=ApiCalendar', { 48 %$params, 49 EID => $1, 50 Date => $2, 51 }); 52 unless ($res->is_success) { 53 carp 'Failed to access Cybozu Office 7: ' . $res->status_line; 54 next; 55 } 56 57 my $content = $res->content; 58 from_to($content, $this->{input_encoding} || 'shiftjis', 'utf8'); 59 my $line = (split(/\r?\n/, $content))[0]; 60 $line .= '"' if $line !~ /\"$/; # Cybozu bug: may produce broken CSV lines 61 push @lines, $line; 48 for my $line ( split( /\r?\n/, $res->content ) ) { 49 next unless $line =~ /^ts\.\d+,(\d+),(da\..+$)/; 50 51 # Second, get a complete event from EID 52 my $res = $this->{ua}->post( 53 $this->{url} . '?page=ApiCalendar', 54 { 55 %$params, 56 EID => $1, 57 Date => $2, 58 } 59 ); 60 unless ( $res->is_success ) { 61 carp 'Failed to access Cybozu Office 7: ' . $res->status_line; 62 next; 63 } 64 65 my $content = $res->content; 66 from_to( $content, $this->{input_encoding} || 'shiftjis', 'utf8' ); 67 my $line = ( split( /\r?\n/, $content ) )[0]; 68 69 # Cybozu bug: may produce broken CSV lines 70 $line .= '"' if $line !~ /\"$/; 71 push @lines, $line; 62 72 } 63 73 … … 70 80 71 81 my $csv; 72 if (eval('require Text::CSV_XS')) { 73 $csv = Text::CSV_XS->new({ binary => 1 }); 74 } elsif (eval('require Text::CSV')) { 75 $csv = Text::CSV->new(); 76 } else { 77 confess 'Text::CSV_XS or Text::CSV package is required'; 82 if ( eval('require Text::CSV_XS') ) { 83 $csv = Text::CSV_XS->new( { binary => 1 } ); 84 } 85 elsif ( eval('require Text::CSV') ) { 86 $csv = Text::CSV->new(); 87 } 88 else { 89 confess 'Text::CSV_XS or Text::CSV package is required'; 78 90 } 79 91 80 92 my @items; 81 for my $line ($this->response) { 82 $csv->parse($line) 83 or confess 'Failed to parse CSV input'; 84 my @fields = $csv->fields; 85 my $num_fields = @fields - 1; 86 next if $num_fields < 14; 87 $fields[1] =~ s/^ts\.//; # remove rubbish 88 89 # Cybozu Calendar CSV Format 90 # [ 0] $Item.ID 91 # [ 1] $TimeStamp 92 # [ 2] $s 93 # [ 3] $Date 94 # [ 4] $Item.TypeOmit 95 # [ 5] $Item.Day 96 # [ 6] $Item.Private 97 # [ 7] $Item.Banner 98 # [ 8] $Item.SetDate || $Item.SetTime.Date 99 # [ 9] $Item.EndDate || $Item.EndTime.Date 100 # [10] $Item.SetTime.Hour00:$Item.SetTime.Minute00 101 # [11] $Item.EndTime.Hour00:$Item.EndTime.Minute00 102 # [12] $Item.Event 103 # [13] $Item.Detail 104 # [14] $Item.Memo 105 106 my %param; 107 @param{qw(id created freq freq_value start_date end_date start_time end_time abbrev summary description)} = @fields[0,1,4,5,8..11,12..14]; 108 109 $param{time_zone} = $this->{time_zone} || 'Asia/Tokyo'; 110 111 my $item; 112 if (!$param{freq}) { 113 $item = WWW::CybozuOffice6::Calendar::Event->new(%param); 114 } 115 else { 116 @param{qw(end_date until_date)} = @fields[8,9]; 117 if ($num_fields > 14) { 118 my @exdates = @fields[14..$num_fields]; 119 $param{exdates} = \@exdates; 120 } 121 my $freq = $param{freq}; 122 if ($freq =~ /^[1-5]$/) { 123 $param{freq} = 'm'; 124 my @week_str = ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); 125 $param{freq_value} = $freq . $week_str[$param{freq_value}]; 126 } 127 $item = WWW::CybozuOffice6::Calendar::RecurrentEvent->new(%param); 128 } 129 130 next unless $item; 131 $item->comment($line); # save the CSV line as for debug info. 132 push @items, $item; 93 for my $line ( $this->response ) { 94 $csv->parse($line) 95 or confess 'Failed to parse CSV input'; 96 my @fields = $csv->fields; 97 my $num_fields = @fields - 1; 98 next if $num_fields < 14; 99 $fields[1] =~ s/^ts\.//; # remove rubbish 100 101 # Cybozu Calendar CSV Format 102 # [ 0] $Item.ID 103 # [ 1] $TimeStamp 104 # [ 2] $s 105 # [ 3] $Date 106 # [ 4] $Item.TypeOmit 107 # [ 5] $Item.Day 108 # [ 6] $Item.Private 109 # [ 7] $Item.Banner 110 # [ 8] $Item.SetDate || $Item.SetTime.Date 111 # [ 9] $Item.EndDate || $Item.EndTime.Date 112 # [10] $Item.SetTime.Hour00:$Item.SetTime.Minute00 113 # [11] $Item.EndTime.Hour00:$Item.EndTime.Minute00 114 # [12] $Item.Event 115 # [13] $Item.Detail 116 # [14] $Item.Memo 117 118 my %param; 119 @param{ 120 qw(id created freq freq_value start_date end_date start_time end_time abbrev summary description) 121 } = @fields[ 0, 1, 4, 5, 8 .. 11, 12 .. 14 ]; 122 123 $param{time_zone} = $this->{time_zone} || 'Asia/Tokyo'; 124 125 my $item; 126 if ( !$param{freq} ) { 127 $item = WWW::CybozuOffice6::Calendar::Event->new(%param); 128 } 129 else { 130 @param{qw(end_date until_date)} = @fields[ 8, 9 ]; 131 if ( $num_fields > 14 ) { 132 my @exdates = @fields[ 14 .. $num_fields ]; 133 $param{exdates} = \@exdates; 134 } 135 my $freq = $param{freq}; 136 if ( $freq =~ /^[1-5]$/ ) { 137 $param{freq} = 'm'; 138 my @week_str = ( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' ); 139 $param{freq_value} = $freq . $week_str[ $param{freq_value} ]; 140 } 141 $item = WWW::CybozuOffice6::Calendar::RecurrentEvent->new(%param); 142 } 143 144 next unless $item; 145 $item->comment($line); # save the CSV line as for debug info. 146 push @items, $item; 133 147 } 134 148 wantarray ? @items : $items[0];
![(please configure the [header_logo] section in trac.ini)](/public/chrome/common/trac_banner.png)