master
Tanguy Pruvot 2010-10-31 20:06:16 +01:00
rodzic 953662254d
commit 1ae7b2978e
4 zmienionych plików z 96 dodań i 34 usunięć

27
README
Wyświetl plik

@ -1,7 +1,8 @@
A simple and fast iCal parser. A simple and fast iCal parser.
-------------------------------------------------------------------------------
http://github.com/tpruvot/PHP-iCal http://github.com/tpruvot/PHP-iCal
fork from http://github.com/fangel/SG-iCalendar
About this fork (forked at v0.5.0 from http://github.com/fangel/SG-iCalendar) -------------------------------------------------------------------------------
A simple example : A simple example :
$ical = new SG_iCalReader( "./basic.ics" ); $ical = new SG_iCalReader( "./basic.ics" );
@ -15,8 +16,14 @@ To check unit tests with phpunit, goto tests/ directory and :
phpunit AllTests phpunit AllTests
phpunit helpers/FreqTest phpunit helpers/FreqTest
Changelog : -------------------------------------------------------------------------------
CHANGELOG :
-------------------------------------------------------------------------------
current (31 oct 2010)
+ ical RDATE support (added dates in a range)
+ RDATE and EXDATE arrays support
0.7.0-tpr (30 oct 2010) 0.7.0-tpr (30 oct 2010)
+ ical EXDATE support (excluded dates in a range) + ical EXDATE support (excluded dates in a range)
+ $event->isWholeDay() + $event->isWholeDay()
@ -29,3 +36,17 @@ Changelog :
+ Support of Recurrent events in query Between() + Support of Recurrent events in query Between()
* various fixes on actual (5) issues * various fixes on actual (5) issues
-------------------------------------------------------------------------------
TODO :
-------------------------------------------------------------------------------
These iCal keywords are not supported for the moment :
- RECURRENCE-ID : to move one event from a recurrence
- EXRULE : to exclude multiple days by a complex rule
Also, multiple RRULE could be specified for an event,
but that is not the case for most calendar applications
-------------------------------------------------------------------------------
To get more information about ical format and rules :
see http://www.ietf.org/rfc/rfc2445.txt

Wyświetl plik

@ -17,17 +17,23 @@ class SG_iCal_VEvent {
const DEFAULT_CONFIRMED = true; const DEFAULT_CONFIRMED = true;
protected $uid; protected $uid;
protected $start; protected $start;
protected $end; protected $end;
protected $laststart;
protected $lastend;
protected $summary; protected $summary;
protected $description; protected $description;
protected $location; protected $location;
public $recurrence; protected $laststart;
public $excluded; protected $lastend;
public $freq; //getFrequency()
public $recurrence; //RRULE
public $recurex; //EXRULE
public $excluded; //EXDATE(s)
public $added; //RDATE(s)
public $freq; //getFrequency() SG_iCal_Freq
public $data; public $data;
@ -47,6 +53,11 @@ class SG_iCal_VEvent {
unset($data['rrule']); unset($data['rrule']);
} }
if ( isset($data['exrule']) ) {
$this->recurex = new SG_iCal_Recurrence($data['exrule']);
unset($data['exrule']);
}
if( isset($data['dtstart']) ) { if( isset($data['dtstart']) ) {
$this->start = $this->getTimestamp($data['dtstart'], $ical); $this->start = $this->getTimestamp($data['dtstart'], $ical);
unset($data['dtstart']); unset($data['dtstart']);
@ -68,13 +79,21 @@ class SG_iCal_VEvent {
//exclusions //exclusions
if ( isset($data['exdate']) ) { if ( isset($data['exdate']) ) {
foreach ($data['exdate'] as $exdate) { foreach ($data['exdate'] as $exdate) {
//$this->excluded[] = $this->getTimestamp($exdate, $ical);
foreach ($exdate->getDataAsArray() as $ts) { foreach ($exdate->getDataAsArray() as $ts) {
$this->excluded[] = strtotime($ts); $this->excluded[] = strtotime($ts);
} }
} }
unset($data['exdate']); unset($data['exdate']);
} }
//additions
if ( isset($data['rdate']) ) {
foreach ($data['rdate'] as $rdate) {
foreach ($rdate->getDataAsArray() as $ts) {
$this->added[] = strtotime($ts);
}
}
unset($data['rdate']);
}
$until = $this->recurrence->getUntil(); $until = $this->recurrence->getUntil();
$count = $this->recurrence->getCount(); $count = $this->recurrence->getCount();
@ -83,7 +102,7 @@ class SG_iCal_VEvent {
//ok.. //ok..
} elseif ($count) { } elseif ($count) {
//if count is set, then figure out the last occurrence and set that as the end date //if count is set, then figure out the last occurrence and set that as the end date
$this->freq = new SG_iCal_Freq($this->recurrence->rrule, $start, $this->excluded); $this->getFrequency();
$until = $this->freq->lastOccurrence($this->start); $until = $this->freq->lastOccurrence($this->start);
} else { } else {
//forever... limit to 3 years //forever... limit to 3 years
@ -118,7 +137,7 @@ class SG_iCal_VEvent {
public function getFrequency() { public function getFrequency() {
if (! isset($this->freq)) { if (! isset($this->freq)) {
if ( isset($this->recurrence) ) { if ( isset($this->recurrence) ) {
$this->freq = new SG_iCal_Freq($this->recurrence->rrule, $this->start, $this->excluded); $this->freq = new SG_iCal_Freq($this->recurrence->rrule, $this->start, $this->excluded, $this->added);
} }
} }
return $this->freq; return $this->freq;
@ -176,6 +195,18 @@ class SG_iCal_VEvent {
} }
} }
/**
* Returns true if duration is multiple of 86400
* @return bool
*/
public function isWholeDay() {
$dur = $this->getDuration();
if ($dur > 0 && ($dur % 86400) == 0) {
return true;
}
return false;
}
/** /**
* Returns the timestamp for the beginning of the event * Returns the timestamp for the beginning of the event
* @return int * @return int
@ -208,18 +239,6 @@ class SG_iCal_VEvent {
return $this->end - $this->start; return $this->end - $this->start;
} }
/**
* Returns true if duration is multiple of 86400
* @return bool
*/
public function isWholeDay() {
$dur = $this->getDuration();
if ($dur > 0 && ($dur % 86400) == 0) {
return true;
}
return false;
}
/** /**
* Returns the given property of the event. * Returns the given property of the event.
* @param string $prop * @param string $prop

Wyświetl plik

@ -33,17 +33,20 @@ class SG_iCal_Freq {
protected $freq = ''; protected $freq = '';
protected $excluded; //EXDATE protected $excluded; //EXDATE
protected $added; //RDATE
public $cache; protected $cache; // getAllOccurrences()
/** /**
* Constructs a new Freqency-rule * Constructs a new Freqency-rule
* @param $rule string * @param $rule string
* @param $start int Unix-timestamp (important : Need to be the start of Event) * @param $start int Unix-timestamp (important : Need to be the start of Event)
* @param $excluded array of int (timestamps), see EXDATE documentation
* @param $added array of int (timestamps), see RDATE documentation
*/ */
public function __construct( $rule, $start, $excluded=array()) { public function __construct( $rule, $start, $excluded=array(), $added=array()) {
$this->start = $start; $this->start = $start;
$this->excluded = $excluded; $this->excluded = array();
$rules = array(); $rules = array();
foreach( explode(';', $rule) AS $v) { foreach( explode(';', $rule) AS $v) {
@ -72,15 +75,31 @@ class SG_iCal_Freq {
//set until, and cache //set until, and cache
if( isset($this->rules['count']) ) { if( isset($this->rules['count']) ) {
$ts = $this->start;
$cache[0] = $ts; $cache[$ts] = $ts = $this->start;
for($n=1; $n < $this->rules['count']; $n++) { for($n=1; $n < $this->rules['count']; $n++) {
$ts = $this->findNext($ts); $ts = $this->findNext($ts);
$cache[$n] = $ts; $cache[$ts] = $ts;
} }
$this->rules['until'] = $ts; $this->rules['until'] = $ts;
$this->cache = $cache;
//EXDATE
if (!empty($excluded)) {
foreach($excluded as $ts) {
unset($cache[$ts]);
}
}
//RDATE
if (!empty($added)) {
$cache = $cache + $added;
asort($cache);
}
$this->cache = array_values($cache);
} }
$this->excluded = $excluded;
$this->added = $added;
} }
@ -91,12 +110,15 @@ class SG_iCal_Freq {
public function getAllOccurrences() { public function getAllOccurrences() {
if (empty($this->cache)) { if (empty($this->cache)) {
//build cache //build cache
$n=0; $cache[$n] = $this->start; $next = $this->firstOccurrence();
$next = $this->findNext($this->start);
while ($next) { while ($next) {
$n++; $cache[$n] = $next; $cache[] = $next;
$next = $this->findNext($next); $next = $this->findNext($next);
} }
if (!empty($this->added)) {
$cache = $cache + $this->added;
asort($cache);
}
$this->cache = $cache; $this->cache = $cache;
} }
return $this->cache; return $this->cache;

Wyświetl plik

@ -93,7 +93,7 @@ class SG_iCal_Parser {
*/ */
private static function _Parse( $content, SG_iCal $ical ) { private static function _Parse( $content, SG_iCal $ical ) {
$main_sections = array('vevent', 'vjournal', 'vtodo', 'vtimezone', 'vcalendar'); $main_sections = array('vevent', 'vjournal', 'vtodo', 'vtimezone', 'vcalendar');
$array_idents = array('exdate'); $array_idents = array('exdate','rdate');
$sections = array(); $sections = array();
$section = ''; $section = '';
$current_data = array(); $current_data = array();