kopia lustrzana https://github.com/friendica/SG-iCalendar
RDATE support
rodzic
953662254d
commit
1ae7b2978e
27
README
27
README
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Ładowanie…
Reference in New Issue