#!/usr/bin/php $v) { if ($v['summary']=="") continue; $tmp_rrule = ""; $tmp_byday=""; $tmp_occurrence=""; $tmp_month_changer = ""; $tmp_type="APPOINTMENT"; $t1=$v['rrule']['freq']; $today = getdate(); // This Removes the old event older than x months // if ($v['start_unix'] <= mktime (0,0,0,$today['mon']-$months_history,$today['mday'],$today['year'])) continue; // This Removes the old event older than x months // if ($v['start_unix'] >= mktime (0,0,0,$today['mon']+$months_future,$today['mday'],$today['year'])) continue; if ($v['end_time']=="") $v['end_time'] = 100 + $v['start_time']; if ($v['end_date']=="") $v['end_date']=$v['start_date']; if ($v['all_day']=="1") { if ($v['end_date']=="") $v['end_date']=$v['start_date']; $v['end_time']="235900"; $v['start_time']="000000"; } if ($v['rrule']['interval']=="") $v['rrule']['interval']=1; if (strlen(($v['rrule']['byday'])) == 3) { $tmp_occurrence= substr($v['rrule']['byday'],0,1).'+ '; $v['rrule']['byday'] = substr($v['rrule']['byday'],1,2); } //echo $tmp_occurrence . '--------------'; if ($v['rrule']['freq']=="WEEKLY"){ echo "Weekly"; if ($v['rrule']['until_date'] != "") { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ' ' .$v['rrule']['until_date'] .'T' .$v['rrule']['until_time'] . ""; } else { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$tmp_occurrence . $v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ""; } } elseif ($v['rrule']['freq']=="MONTHLY"){ echo "Monthly"; if ($v['rrule']['byday'] == "") { $tmp_month_changer = "D"; } else $tmp_month_changer = "P"; if ($v['rrule']['until_date'] != "") { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $tmp_month_changer. $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ' ' .$v['rrule']['until_date'] .'T' .$v['rrule']['until_time'] . ""; } else { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$tmp_occurrence . $v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $tmp_month_changer . $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ""; } } elseif ($v['rrule']['freq']=="DAILY"){ echo "Daily"; if ($v['rrule']['until_date'] != "") { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ' ' .$v['rrule']['until_date'] .'T' .$v['rrule']['until_time'] . ""; } else { if ($v['rrule']['byday'] != "") $tmp_byday=' ' .$tmp_occurrence . $v['rrule']['byday']; $tmp_rrule= "RRULE:" . $t1{0} . $v['rrule']['interval'] . $tmp_byday . ' #' .$v['rrule']['count'] . ""; } } elseif ($v['rrule']['freq']=="YEARLY"){ echo "Yearly"; $tmp_rrule= "RRULE:YM1 12 #0"; $tmp_type= "BIRTHDAY"; }else{ echo "One off"; } $tmp_output1.=' BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:'. $v['summary'] . ' DESCRIPTION:ENCODING=QUOTED-PRINTABLE: ' . $v['description'] . ' DTSTART:' . $v['start_date'] . 'T' . $v['start_time']. ' DTEND:' . $v['end_date'] . 'T' . $v['end_time'] . ' LOCATION:' . $v['location'] .' '. $tmp_rrule .' CATEGORIES:' . $tmp_type .' END:VEVENT END:VCALENDAR '; $event_count+=1; echo ' event added:'.$v['summary']. ' for '. $v['start_date'].' '; } } $filename = '/tmp/vCalender_export_from_iCal.vcs'; if (!$handle = fopen($filename, 'w+')) { echo "Cannot open file ($filename)"; exit; } // Write $somecontent to our opened file. if (fwrite($handle, $tmp_output1) === FALSE) { echo "Cannot write to file ($filename)"; exit; } // echo "Success, wrote ($tmp_output1) to file ($filename)"; echo "--- added $event_count events ---"; fclose($handle); echo exec('open -a /Applications/Utilities/Bluetooth\ File\ Exchange.app/ '.$filename); //-------------------------------------------------------- /* +------------------------------------------- | iCalender File Parser +------------------------------------------- | parse_ics.php +------------------------------------------- | Written by Ben Barnett | Mail: ben@menial.co.uk +------------------------------------------- | This script is old, has been unused for some | time but may be handy for some. | | It is not even *near* feature complete to the | iCalendar specification (RFC 2445), but can | deal with many of the common parts of it. | | It is licensed under a Creative Commons | Attribution, Non-Commercial Share-Alike (v2) | license. It'd be great to have any | changes sent to the address above. +------------------------------------------- | Pass the function the name of an .ics file | and it'll return an array of calendar events | in UNIX timestamp order. To see it's output | diagramatically, | "echo '
'.print_r(parse_ics('name')).'
'; +------------------------------------------- */ /** * iCalendar Parser * * Pass it the name (minus extension) of a .ics file and it'll return * a multidimensional array of calendar events on success, a string on some errors * and nothing on others as it's quite incomplete. * * CANT_OPEN_FILE ==> Function can't read ics file * INVALID_FILETYPE ==> The file isn't recognised as an ics file * * @param string $calendar The file to open * @return array An array of calendar events */ function parse_ical($calendar) { // Open calendar $fp = @fopen($calendar, 'r'); if (!$fp) { return 'CANT_OPEN_FILE'; } // Read first line $buffer_temp = fgets($fp, 1024); // Check to see if this is actually an iCalendar file. if (trim(strtoupper($buffer_temp)) != 'BEGIN:VCALENDAR') { return 'INVALID_FILETYPE'; } // And set a few variables... $cal = array(); $event = 0; $cal[0]['generator'] = 'Menial iCal Parser'; // Set variable to enable sorting of array. $cal[0]['start_unix'] = ''; $flag_valarm = false; // Now loop through line by line... while (!feof($fp)) { // Save prev read-ahead data $buffer = $buffer_temp; // Then read ahead again $buffer_temp = fgets($fp, 1024); // Remove newlines from new buffer $buffer_temp = ereg_replace("[\r\n]", '', $buffer_temp); // Check to see if this is a multi-line part, // (they begin with a space) while (substr($buffer_temp, 0, 1) == " ") { // If yes, process it and keep reading until // new buffer line doesn't begin with " ". $buffer = $buffer.substr($buffer_temp, 1); $buffer_temp = fgets($fp, 1024); $buffer_temp = ereg_replace("[\r\n]", '', $buffer_temp); } // Begin parsing directives in current buffer switch ($buffer) { // New event case 'BEGIN:VEVENT': $attendee = 1; $event = $event+1; $cal[$event] = array(); break; // End current event case 'END:VEVENT': break; // Begin alarm for current event case 'BEGIN:VALARM': $flag_valarm = true; break; // End alarm for current event case 'END:VALARM': $flag_valarm = false; break; default: $line = ''; //Break up the line. We want indices 1 and 2. Not 0. ereg ("([^:]+):(.*)", $buffer, $line); // Need to both trim the field down and keep a copy for later processing. $field = $line[1]; $data = $line[2]; //****************echo '>>'.$data.'
';*****************// // Need to keep a copy of each property line. $property = $field; // Trim the property values off the last ';' $property_p = strpos($property, ';'); if ($property_p != false) { $property = substr($property, 0, $property_p); // And make it upper-case $property = strtoupper($property); } switch ($property) { /********** CALENDER INFO ***********/ // Calendar Name case 'X-WR-CALNAME': $cal[0]['name'] = $data; break; // Calendar Description case 'X-WR-CALDESC': $cal[0]['description'] = stripslashes($data); break; // Main timezone of calendar case 'X-WR-TIMEZONE': $cal[0]['timezone'] = $data; break; // Calendar ID case 'X-WR-RELCALID': $cal[0]['relcalid'] = $data; break; // Calendar Scale case 'CALSCALE': $cal[0]['calscale'] = $data; break; // iCalendar Version case 'VERSION': $cal[0]['cal_version'] = $data; break; // Product ID of file generator case 'PRODID': $cal[0]['prodid'] = stripslashes($data); break; /********** END CALENDER INFO ***********/ /********** EVENT INFO ***********/ // Unique ID of event case 'UID': $cal[$event]['uid'] = $data; break; // Start time of event case 'DTSTART': $date = ''; $data = str_replace('T', '', $data); if (ereg('DTSTART;VALUE=DATE', $field)) { // ALL-DAY EVENT ereg('([0-9]{4})([0-9]{2})([0-9]{2})', $data, $date); // UNIX timestamps can't deal with pre 1970 dates if ($date[1] <= 1970) { $date[1] = 1971; } $cal[$event]['all_day'] = 1; $cal[$event]['start_date'] = $date[1].$date[2].$date[3]; $cal[$event]['start_time'] = 0; $cal[$event]['start_unix'] = mktime(0, 0, 0, $date[2],$date[3], $date[1]); } else { // TIME LIMITED EVENT ereg('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})', $data, $date); // UNIX timestamps can't deal with pre 1970 dates if ($date[1] <= 1970) { $date[1] = 1971; } $cal[$event]['all_day'] = 0; $cal[$event]['start_date'] = $date[1].$date[2].$date[3]; $cal[$event]['start_time'] = $date[4].$date[5]; $cal[$event]['start_unix'] = mktime($date[4], $date[5], $date[6], $date[2],$date[3], $date[1]); } break; // End time of event case 'DTEND': $data = str_replace('T', '', $data); // TIME LIMITED EVENT ereg('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})', $data, $date); // UNIX timestamps can't deal with pre 1970 dates if ($date[1] <= 1970) { $date[1] = 1971; } $cal[$event]['end_date'] = $date[1].$date[2].$date[3]; $cal[$event]['end_time'] = $date[4].$date[5]; $cal[$event]['end_unix'] = mktime($date[4], $date[5], $date[6], $date[2],$date[3], $date[1]); break; // Timestamp of event case 'DTSTAMP': $data = str_replace('T', '', $data); $data = str_replace('Z', '', $data); // TIME LIMITED EVENT ereg('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})', $data, $date); // UNIX timestamps can't deal with pre 1970 dates if ($date[1] <= 1970) { $date[1] = 1971; } $cal[$event]['stamp_date'] = $date[1].$date[2].$date[3]; $cal[$event]['stamp_time'] = $date[4].$date[5]; $cal[$event]['stamp_unix'] = mktime($date[4], $date[5], $date[6], $date[2],$date[3], $date[1]); break; // Summary of event case 'SUMMARY': //$data = str_replace("\\n", '
', $data); //$data = str_replace("\\r", '
', $data); //$data = stripslashes($data); //$data = htmlentities($data); $cal[$event]['summary'] = $data; break; // Event description case 'DESCRIPTION': //$data = str_replace("\\n", '
', $data); //$data = str_replace("\\r", '
', $data); //$data = stripslashes($data); //$data = htmlentities($data); if ($flag_valarm == false) { $cal[$event]['description'] = $data; } else { $cal[$event]['alarm']['description'] = $data; } break; //NOT REMOTELY COMPLIANT WITH //ICALENDAR RFC. READ AND DO IT AGAIN! // List of attendees case 'ATTENDEE': $att = explode(';', $buffer); foreach ($att as $value) { $att_content = explode('=', $value); switch ($att_content[0]) { // Calendar User Type case 'CUTYPE': $cal[$event]['attendee'][$attendee]['cutype'] = $att_content[1]; break; // case 'MEMBER': break; // case 'PARTSTAT': break; // case 'ROLE': $cal[$event]['attendee'][$attendee]['role'] = $att_content[1]; break; // RSVP? True/False case 'RSVP': $cal[$event]['attendee'][$attendee]['rsvp'] = $att_content[1]; break; // case 'SENT-BY': break; // Common Name case 'CN': $cal[$event]['attendee'][$attendee]['name'] = $att_content[1]; break; // case 'DIR': break; // case 'DELEGATED-TO': break; // case 'DELEGATED-FROM': break; } } $attendee++; unset($temp, $att, $value); break; // URL of event case 'URL': $cal[$event]['url'] = $data; break; // Location of event case 'LOCATION': $cal[$event]['location'] = $data; break; // Status of event case 'STATUS': $cal[$event]['status'] = $data; break; /********** ALARM INFO ***********/ // Alarm Action case 'ACTION': $cal[$event]['alarm']['action'] = $data; break; // When should the alarm go off? case 'TRIGGER': $cal[$event]['alarm']['trigger'] = $data; break; // Alarm attachment case 'ATTACH': $cal[$event]['alarm']['attach'] = $data; $temp = explode(';', $field); $temp = explode('=', $temp[1]); $cal[$event]['alarm']['attach_value'] = $temp[1]; unset($temp); break; // Alarm description handler is joined // with event description handler /********** END ALARM INFO ***********/ /********** RECURRENCE RULE INFO ***********/ case 'RRULE': $cal[$event]['rrule'] = array(); $rrule = explode(';',$data); foreach ($rrule as $value) { $rrule_content = explode('=', $value); switch ($rrule_content[0]) { // Frequency of repeating event case 'FREQ': $cal[$event]['rrule']['freq'] = $rrule_content[1]; break; // Interval to repeat the frequency // eg. FREQ=WEEKLY;INTERVAL=2 ==> repeat every 2 weeks case 'INTERVAL': $cal[$event]['rrule']['interval'] = $rrule_content[1]; break; // Number of times to repeat event case 'COUNT': $cal[$event]['rrule']['count'] = $rrule_content[1]; break; // Repeat event until date/time case 'UNTIL': $data = str_replace('T', '', $data); $data = str_replace('Z', '', $data); // TIME LIMITED EVENT ereg('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})', $data, $date); // UNIX timestamps can't deal with pre 1970 dates if ($date[1] <= 1970) { $date[1] = 1971; } $cal[$event]['rrule']['until_date'] = $date[1].$date[2].$date[3]; $cal[$event]['rrule']['until_time'] = $date[4].$date[5]; $cal[$event]['rrule']['until_unix'] = mktime($date[4], $date[5], $date[6], $date[2],$date[3], $date[1]); break; //**** BYxxxx RULES ****// case 'BYSECOND': $cal[$event]['rrule']['bysecond'] = $rrule_content[1]; break; case 'BYMINUTE': $cal[$event]['rrule']['byminute'] = $rrule_content[1]; break; case 'BYHOUR': $cal[$event]['rrule']['byhour'] = $rrule_content[1]; break; case 'BYDAY': $cal[$event]['rrule']['byday'] = $rrule_content[1]; break; case 'BYMONTH': $cal[$event]['rrule']['bymonth'] = $rrule_content[1]; break; case 'BYYEAR': $cal[$event]['rrule']['byyear'] = $rrule_content[1]; break; case 'BYMONTHDAY': $cal[$event]['rrule']['bymonthday'] = $rrule_content[1]; break; case 'BYYEARDAY': $cal[$event]['rrule']['byyearday'] = $rrule_content[1]; break; case 'BYWEEKNO': $cal[$event]['rrule']['byweekno'] = $rrule_content[1]; break; //**** END BYxxxx RULES ****// // Day that work week start case 'WKST': $cal[$event]['rrule']['wkst'] = $rrule_content[1]; break; // case 'BYSETPOS': $cal[$event]['rrule']['bysetpos'] = $rrule_content[1]; break; } } unset($rrule, $rrule_content, $value); break; /********** RECURRENCE RULE INFO ***********/ } /********** END EVENT INFO ***********/ break; } } fclose($fp); // Puts events in order using UNIX timestamp as // a comparison point. usort($cal, 'compare'); // Unset "padding" varible unset($cal[0]['start_unix']); // Return parsed data. return $cal; } // The function that does the comparing to // order events. function compare($a, $b) { return strnatcasecmp($a['start_unix'], $b['start_unix']); } ?>