diff options
author | jwangen <jwangen> | 2002-10-25 06:49:26 +0000 |
---|---|---|
committer | jwangen <jwangen> | 2002-10-25 06:49:26 +0000 |
commit | 2866867f12f1a8a8b58e305ba3be9c5dd08ba958 (patch) | |
tree | aae0896bd88e142ee1dd4add3ff43b4f2ef58193 | |
parent | 83508e2f18660eb68a46de17dfa3ee13a39c724a (diff) | |
download | phpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.tar.gz phpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.tar.bz2 phpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.zip |
Added support for changes to single events in a recurring set
-rwxr-xr-x | calendars/Jareds32Classes.ics | 149 | ||||
-rw-r--r-- | functions/ical_parser.php | 88 |
2 files changed, 209 insertions, 28 deletions
diff --git a/calendars/Jareds32Classes.ics b/calendars/Jareds32Classes.ics index d2c02e0..0da93c0 100755 --- a/calendars/Jareds32Classes.ics +++ b/calendars/Jareds32Classes.ics @@ -1,74 +1,95 @@ BEGIN:VCALENDAR CALSCALE:GREGORIAN +X-WR-TIMEZONE;VALUE=TEXT:US/Central PRODID:-//Apple Computer\, Inc//iCal 1.0//EN X-WR-CALNAME;VALUE=TEXT:Jareds Classes -X-WR-TIMEZONE;VALUE=TEXT:US/Central -X-WR-RELCALID;VALUE=TEXT:C80EA507-D43F-11D6-966A-0050E4E60429 +X-WR-RELCALID;VALUE=TEXT:D573561C-E7AB-11D6-8111-0050E4E60429 VERSION:2.0 BEGIN:VEVENT -UID:C80E5AE0-D43F-11D6-966A-0050E4E60429 -DTSTAMP:20020919T031210Z +UID:D572BB91-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235007Z SUMMARY:Computer Organization +EXDATE;TZID=US/Central:20021112T080000 +EXDATE;TZID=US/Central:20021018T080000 +EXDATE;TZID=US/Central:20021010T080000 +EXDATE;TZID=US/Central:20021128T080000 +EXDATE;TZID=US/Central:20021002T080000 +EXDATE;TZID=US/Central:20021001T080000 +EXDATE;TZID=US/Central:20021129T080000 +EXDATE;TZID=US/Central:20021021T080000 DTSTART;TZID=US/Central:20020904T080000 DTEND;TZID=US/Central:20020904T090000 RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR END:VEVENT BEGIN:VEVENT -UID:C80E668E-D43F-11D6-966A-0050E4E60429 -DTSTAMP:20020919T031631Z +UID:D572C871-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235010Z SUMMARY:Linguistics +EXDATE;TZID=US/Central:20021018T090000 +EXDATE;TZID=US/Central:20021002T090000 +EXDATE;TZID=US/Central:20021129T090000 +EXDATE;TZID=US/Central:20021021T090000 DTSTART;TZID=US/Central:20020904T090000 DTEND;TZID=US/Central:20020904T100000 RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE,FR END:VEVENT BEGIN:VEVENT -UID:C80E6C16-D43F-11D6-966A-0050E4E60429 -DTSTAMP:20020919T031607Z +UID:D572CE54-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T233307Z SUMMARY:First Aid & CPR +EXDATE;TZID=US/Central:20021021T103000 +EXDATE;TZID=US/Central:20021002T103000 DTSTART;TZID=US/Central:20020904T103000 DTEND;TZID=US/Central:20020904T113000 -RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE,FR +RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE END:VEVENT BEGIN:VEVENT -UID:C80E7112-D43F-11D6-966A-0050E4E60429 -DTSTAMP:20020924T125113Z +UID:D572D3AC-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235015Z SUMMARY:Japanese +EXDATE;TZID=US/Central:20021018T133000 +EXDATE;TZID=US/Central:20021002T133000 +EXDATE;TZID=US/Central:20021021T133000 +EXDATE;TZID=US/Central:20021129T133000 +EXDATE;TZID=US/Central:20021001T133000 DTSTART;TZID=US/Central:20020904T133000 DTEND;TZID=US/Central:20020904T143000 RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,TU,WE,FR END:VEVENT BEGIN:VEVENT -UID:C80E75E7-D43F-11D6-966A-0050E4E60429 -DTSTAMP:20020919T031625Z +UID:D572D90B-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235202Z SUMMARY:The Bible +EXDATE;TZID=US/Central:20021001T143000 +EXDATE;TZID=US/Central:20021128T143000 DTSTART;TZID=US/Central:20020905T143000 DTEND;TZID=US/Central:20020905T163000 -RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=TU,TH +RRULE:FREQ=WEEKLY;UNTIL=20021216T055959;INTERVAL=1;BYDAY=TU,TH END:VEVENT BEGIN:VEVENT DTEND;TZID=US/Central:20020910T163000 RECURRENCE-ID;TZID=US/Central:20020910T143000 DTSTAMP:20020911T125000Z +UID:D572D90B-E7AB-11D6-8111-0050E4E60429 DTSTART;TZID=US/Central:20020910T143000 -UID:C80E75E7-D43F-11D6-966A-0050E4E60429 END:VEVENT BEGIN:VEVENT DTEND;TZID=US/Central:20020916T090000 RECURRENCE-ID;TZID=US/Central:20020916T080000 DTSTAMP:20020926T035105Z DTSTART;TZID=US/Central:20020916T080000 -UID:C80E5AE0-D43F-11D6-966A-0050E4E60429 +UID:D572BB91-E7AB-11D6-8111-0050E4E60429 DURATION:PT1H END:VEVENT BEGIN:VEVENT -UID:C80E7FF8-D43F-11D6-966A-0050E4E60429 +UID:D572E418-E7AB-11D6-8111-0050E4E60429 DTSTAMP:20020919T031814Z SUMMARY:Reading Day DTSTART;VALUE=DATE:20021214 DTEND;VALUE=DATE:20021215 END:VEVENT BEGIN:VEVENT -UID:C80E8557-D43F-11D6-966A-0050E4E60429 +UID:D572E99A-E7AB-11D6-8111-0050E4E60429 DTSTAMP:20020919T042240Z SUMMARY:Japanese Final DTSTART;TZID=US/Central:20021219T153000 @@ -79,7 +100,7 @@ END:VEVENT BEGIN:VEVENT DTSTAMP:20020919T041543Z SUMMARY:The Bible Final -UID:C80E8A4E-D43F-11D6-966A-0050E4E60429 +UID:D572EEED-E7AB-11D6-8111-0050E4E60429 ORGANIZER;CN=Jared Wangen:mailto:jwangen@gac.edu DTSTART;TZID=US/Central:20021217T103000 DURATION:PT2H @@ -88,7 +109,7 @@ END:VEVENT BEGIN:VEVENT DTSTAMP:20020919T033447Z SUMMARY:Computer Organization Final -UID:C80E8F0C-D43F-11D6-966A-0050E4E60429 +UID:D572F42C-E7AB-11D6-8111-0050E4E60429 DTSTART;TZID=US/Central:20021218T080000 DURATION:PT2H DESCRIPTION:Olin 321 (Classroom) @@ -96,7 +117,7 @@ END:VEVENT BEGIN:VEVENT DTSTAMP:20020919T033454Z SUMMARY:Linguistics Final -UID:C80E9392-D43F-11D6-966A-0050E4E60429 +UID:D572F976-E7AB-11D6-8111-0050E4E60429 DTSTART;TZID=US/Central:20021217T130000 DURATION:PT2H DESCRIPTION:VH 202 (Classroom) @@ -104,9 +125,93 @@ END:VEVENT BEGIN:VEVENT DTSTAMP:20020919T033438Z SUMMARY:CPR & First Aid Final -UID:C80E98B9-D43F-11D6-966A-0050E4E60429 +UID:D572FEBA-E7AB-11D6-8111-0050E4E60429 DTSTART;TZID=US/Central:20021217T080000 DURATION:PT2H DESCRIPTION:Lund 109 (Classroom) END:VEVENT +BEGIN:VEVENT +UID:D573040D-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T233220Z +SUMMARY:Fall Break +DTSTART;VALUE=DATE:20021018 +DTEND;VALUE=DATE:20021022 +END:VEVENT +BEGIN:VEVENT +UID:D5730958-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T233332Z +SUMMARY:Nobel Conference +DTSTART;VALUE=DATE:20021001 +DTEND;VALUE=DATE:20021003 +END:VEVENT +BEGIN:VEVENT +UID:D5730F2B-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T234504Z +SUMMARY:CS - Lab 1 Due +DTSTART;VALUE=DATE:20021003 +DTEND;VALUE=DATE:20021004 +END:VEVENT +BEGIN:VEVENT +UID:D573147E-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T234552Z +SUMMARY:CS - HW Ch 1-4\,A\,B Due +DTSTART;VALUE=DATE:20021008 +DTEND;VALUE=DATE:20021009 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20021024T234631Z +SUMMARY:Computer Organization Test 1 +DTEND;TZID=US/Central:20021010T203000 +UID:D57319BE-E7AB-11D6-8111-0050E4E60429 +DTSTART;TZID=US/Central:20021010T190000 +END:VEVENT +BEGIN:VEVENT +UID:D5731EE8-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T234720Z +SUMMARY:CS - Lab 2 Due +DTSTART;VALUE=DATE:20021101 +DTEND;VALUE=DATE:20021102 +END:VEVENT +BEGIN:VEVENT +UID:D573241A-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T234754Z +SUMMARY:CS - HW Ch 5-6 Due +DTSTART;VALUE=DATE:20021111 +DTEND;VALUE=DATE:20021112 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20021024T234841Z +SUMMARY:Computer Organization Test 2 +DTEND;TZID=US/Central:20021112T203000 +UID:D573294C-E7AB-11D6-8111-0050E4E60429 +DTSTART;TZID=US/Central:20021112T190000 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20021024T234904Z +SUMMARY:CS - Lab 3 Due +UID:D5733204-E7AB-11D6-8111-0050E4E60429 +DTSTART;TZID=US/Central:20021118T150000 +DURATION:PT1H45M +END:VEVENT +BEGIN:VEVENT +UID:D5733792-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235055Z +SUMMARY:Thanksgiving Break +DTSTART;VALUE=DATE:20021128 +DTEND;VALUE=DATE:20021202 +END:VEVENT +BEGIN:VEVENT +UID:D5733E36-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235244Z +SUMMARY:CS - Lab 4 Due +DTSTART;VALUE=DATE:20021209 +DTEND;VALUE=DATE:20021210 +END:VEVENT +BEGIN:VEVENT +UID:D573446A-E7AB-11D6-8111-0050E4E60429 +DTSTAMP:20021024T235322Z +SUMMARY:CS - HW Ch 7-9 Due +DTSTART;VALUE=DATE:20021213 +DTEND;VALUE=DATE:20021214 +END:VEVENT END:VCALENDAR diff --git a/functions/ical_parser.php b/functions/ical_parser.php index 220af9e..4bb22ae 100644 --- a/functions/ical_parser.php +++ b/functions/ical_parser.php @@ -69,6 +69,10 @@ if ($parse_file) { // auxiliary array for determining overlaps of events $overlap_array = array (); + // using $uid to set specific points in array, if $uid is not in the + // .ics file, we need to have some unique place in the array + $uid_counter = 0; + // read file in line by line // XXX end line is skipped because of the 1-line readahead while (!feof($ifile)) { @@ -87,7 +91,8 @@ if ($parse_file) { $start_time, $end_time, $start_date, $end_date, $summary, $allday_start, $allday_end, $start, $end, $the_duration, $beginning, $rrule_array, $start_of_vevent, $description, - $valarm_description, $start_unixtime, $end_unixtime + $valarm_description, $start_unixtime, $end_unixtime, + $recurrence_id, $uid ); $except_dates = array(); @@ -103,6 +108,30 @@ if ($parse_file) { ); } elseif (stristr($line, 'END:VEVENT')) { + // make sure we have some value for $uid + if (!isset($uid)) { + $uid = $uid_counter; + $uid_counter++; + $uid_valid = false; + } else { + $uid_valid = true; + } + + if ($uid_valid && isset($processed[$uid]) && isset($recurrence_id['date'])) { + $old_start_date = $processed[$uid][0]; + $old_start_time = $processed[$uid][1]; + $start_date_tmp = $recurrence_id['date']; + if (!isset($start_date)) $start_date = $old_start_date; + if (!isset($start_time)) $start_time = $master_array[$old_start_date][$old_start_time][$uid]['event_start']; + if (!isset($end_time)) $end_time = $master_array[$old_start_date][$old_start_time][$uid]['event_end']; + if (!isset($summary)) $summary = $master_array[$old_start_date][$old_start_time][$uid]['event_text']; + if (!isset($length)) $length = $master_array[$old_start_date][$old_start_time][$uid]['event_length']; + if (!isset($description)) $description = $master_array[$old_start_date][$old_start_time][$uid]['description']; + unset($master_array[$start_date_tmp][$old_start_time]); + $write_processed = false; + } else { + $write_processed = true; + } $mArray_begin = mktime (0,0,0,1,1,$this_year); $mArray_end = mktime (0,0,0,1,10,($this_year + 1)); @@ -128,6 +157,11 @@ if ($parse_file) { $minute = $time3[2]; } + // handle single changes in recurring events + if ($uid_valid && $write_processed) { + $processed[$uid] = array($start_date,($hour.$minute)); + } + // Handling of the all day events if ((isset($allday_start) && $allday_start != '')) { $start = strtotime($allday_start); @@ -139,7 +173,7 @@ if ($parse_file) { if (($end > $mArray_begin) && ($end < $mArray_end)) { while ($start != $end) { $start_date = date('Ymd', $start); - $master_array[($start_date)][('-1')][]= array ('event_text' => $summary, 'description' => $description); + $master_array[($start_date)][('-1')][$uid]= array ('event_text' => $summary, 'description' => $description); $start = strtotime('+1 day', $start); } } @@ -148,7 +182,8 @@ if ($parse_file) { // Handling regular events if ((isset($start_time) && $start_time != '') && (!isset($allday_start) || $allday_start == '')) { $nbrOfOverlaps = checkOverlap($start_date, $start_time, $end_time); - $master_array[($start_date)][($hour.$minute)][] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description); + $master_array[($start_date)][($hour.$minute)][$uid] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description); + } // Handling of the recurring events, RRULE @@ -386,7 +421,7 @@ if ($parse_file) { } } else { $nbrOfOverlaps = checkOverlap($recur_data_date, $start_time, $end_time); - $master_array[($recur_data_date)][($hour.$minute)][] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description); + $master_array[($recur_data_date)][($hour.$minute)][$uid] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description); } } } @@ -507,7 +542,48 @@ if ($parse_file) { } else { $valarm_description = $data; } - + } elseif (preg_match("/^RECURRENCE-ID/i", $field)) { + + $parts = split(';', $field); + foreach($parts as $part) { + $eachval = split('=',$part); + if ($eachval[0] == 'TZID') { + $recurrence_id['tzid'] = $eachval[1]; + } elseif ($eachval[0] == 'RANGE') { + $recurrence_id['range'] = $eachval[1]; + } elseif ($eachval[0] == 'VALUE') { + $recurrence_id['value'] = $eachval[1]; + } else { + $recurrence_id[] = $eachval[1]; + } + } + unset($parts, $part, $eachval); + + $data = ereg_replace('T', '', $data); + $data = ereg_replace('Z', '', $data); + ereg ('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})', $data, $regs); + $recurrence_id['date'] = $regs[1] . $regs[2] . $regs[3]; + $recurrence_id['time'] = $regs[4] . $regs[5]; + + $recur_unixtime = mktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]); + + $dlst = date('I', $recur_unixtime); + $server_offset_tmp = chooseOffset($recur_unixtime); + if (isset($recurrence_id['tzid'])) { + $tz_tmp = $recurrence_id['tzid']; + $offset_tmp = $tz_array[$tz_tmp][$dlst]; + } elseif (isset($calendar_tz)) { + $offset_tmp = $tz_array[$calendar_tz][$dlst]; + } else { + $offset_tmp = $server_offset_tmp; + } + $recur_unixtime = calcTime($offset_tmp, $server_offset_tmp, $recur_unixtime); + $recurrence_id['date'] = date('Ymd', $recur_unixtime); + $recurrence_id['time'] = date('Hi', $recur_unixtime); + unset($server_offset_tmp); + + } elseif (preg_match("/^UID/i", $field)) { + $uid = $data; } elseif (preg_match("/^X-WR-CALNAME/i", $field)) { $calendar_name = $data; $master_array['calendar_name'] = $calendar_name; @@ -516,7 +592,7 @@ if ($parse_file) { $master_array['calendar_tz'] = $calendar_tz; } elseif (preg_match("/^DURATION/i", $field)) { - if (($first_duration = TRUE) && (!stristr($field, '=DURATION'))) { + if (($first_duration == TRUE) && (!stristr($field, '=DURATION'))) { ereg ('^P([0-9]{1,2})?([W,D]{0,1}[T])?([0-9]{1,2}[H])?([0-9]{1,2}[M])?([0-9]{1,2}[S])?', $data, $duration); if ($duration[2] = 'W') { $weeks = $duration[1]; |