diff --git a/ics-collector/debugger/index.php b/ics-collector/debugger/index.php
index 49b5f68..c9141bc 100644
--- a/ics-collector/debugger/index.php
+++ b/ics-collector/debugger/index.php
@@ -37,7 +37,7 @@ function generateDataOptions() {
-
+
diff --git a/ics-collector/debugger/lib/class.iCalReader.php b/ics-collector/debugger/lib/class.iCalReader.php
index aecd863..48a9b56 100644
--- a/ics-collector/debugger/lib/class.iCalReader.php
+++ b/ics-collector/debugger/lib/class.iCalReader.php
@@ -15,6 +15,7 @@
* UPDATE NOTES : @zyzo (htto://www.github.com/zyzo)
* - Add recurrence event counter
* - Add option disable recurrent events
+ * - Return more details for DATE/DATE-TIME property
*
*/
@@ -158,8 +159,10 @@ public function initLines($lines)
*/
public function addCalendarComponentWithKeyAndValue($component, $keyword, $value)
{
+ $explodedKeyword = null;
if (strstr($keyword, ';')) {
// Ignore everything in keyword after a ; (things like Language, etc)
+ $explodedKeyword = explode(';', $keyword);
$keyword = substr($keyword, 0, strpos($keyword, ';'));
}
if ($keyword == false) {
@@ -178,8 +181,27 @@ public function addCalendarComponentWithKeyAndValue($component, $keyword, $value
}
if (stristr($keyword, 'DTSTART') or stristr($keyword, 'DTEND') or stristr($keyword, 'EXDATE')) {
- $keyword = explode(';', $keyword);
- $keyword = $keyword[0];
+ //$keyword = $keyword[0];
+ $meta = array();
+ if (strlen($value) === 8) {
+ // DATE format 19970714
+ $meta['type'] = 'DATE';
+ } else {
+ // DATE-TIME format
+ $meta['type'] = 'DATE-TIME';
+ if (strstr('T', $value)) {
+ // format 2 : DATE with UTC time 19980119T070000Z
+ $meta['format'] = 'UTC-TIME';
+ } else {
+ // format 1 : DATE with local time 19980118T230000
+ $meta['format'] = 'LOCAL-TIME';
+ if (count($explodedKeyword) === 2 && stristr($explodedKeyword[1], 'TZID=')) {
+ // timezone specification exists
+ $meta['tzid'] = explode('=', $explodedKeyword[1])[1];
+ }
+ }
+ }
+ $value = array('meta' => $meta, 'value' => $value);
}
switch ($component) {
diff --git a/ics-collector/debugger/lib/ics-merger-config.ini b/ics-collector/debugger/lib/ics-merger-config.ini
index c7dcfd9..10ede81 100644
--- a/ics-collector/debugger/lib/ics-merger-config.ini
+++ b/ics-collector/debugger/lib/ics-merger-config.ini
@@ -1,2 +1,2 @@
DEFAULT_PRODID = "-//FOSSASIA//FOSSASIA Calendar//EN"
-DEFAULT_TIME_ZONE => Europe/Berlin
+DEFAULT_TIME_ZONE = Europe/Berlin
diff --git a/ics-collector/debugger/lib/ics-merger.php b/ics-collector/debugger/lib/ics-merger.php
index 6a568fe..9f14448 100644
--- a/ics-collector/debugger/lib/ics-merger.php
+++ b/ics-collector/debugger/lib/ics-merger.php
@@ -5,10 +5,12 @@ class IcsMerger {
private $inputs = array();
private $config = array();
+ private $defaultTimezone;
const CONFIG_FILENAME = 'ics-merger-config.ini';
public function __construct() {
$this->config = parse_ini_file(IcsMerger::CONFIG_FILENAME);
+ $this->defaultTimezone = new DateTimeZone($this->config['DEFAULT_TIME_ZONE']);
}
public function add($text) {
@@ -19,19 +21,19 @@ public function getResult() {
$result = array(
'VCALENDAR' => array(),
'VEVENTS' => array()
- );
+ );
foreach ($this->inputs as $icsText) {
$ical = new ICal(explode("\n", $icsText), true);
+ //var_dump($ical);
foreach($ical->cal as $key => $value) {
switch($key) {
case 'VCALENDAR' :
$result['VCALENDAR'] = array_merge($result['VCALENDAR'], $value);
break;
case 'VEVENT' :
- $result['VEVENTS'] = array_merge($result['VEVENTS'], $value);
+ $result['VEVENTS'] = array_merge($result['VEVENTS'], $this->processEvents($value));
break;
default :
- // ignore others
break;
}
}
@@ -47,6 +49,39 @@ public function getResult() {
return $result;
}
+ private function processEvents($events) {
+ foreach($events as &$event) {
+ //echo "$key hahdsad" . PHP_EOL;
+ foreach ($event as $key => &$value) {
+ switch($key) {
+ // properties of type DATE / DATE-TIME
+ case 'DTSTART':
+ case 'DTEND' :
+ case 'RDATE' :
+ // only local datime needs conversion
+ if ($value['meta']['type'] == 'DATE-TIME' && $value['meta']['format'] == 'LOCAL-TIME') {
+ if (array_key_exists('tzid', $value['meta'])) {
+ $tz = new DateTimeZone($value['meta']['tzid']);
+ try {
+ $time = new DateTime($value['value'], $tz);
+ } catch (Exception $e) {
+ echo $e->getMessage();
+ exit(1);
+ }
+ $time->setTimezone($this->defaultTimezone);
+ $value['value'] = $time->format('Ymd\THis');
+ }
+ }
+ break;
+ default :
+ // ignore others
+ break;
+ }
+ }
+ }
+ return $events;
+ }
+
public static function getRawText($icsMergerResult) {
$callback = function ($v, $k) {
diff --git a/ics-collector/debugger/tests/IcsMergerTest.php b/ics-collector/debugger/tests/IcsMergerTest.php
new file mode 100644
index 0000000..cebc68a
--- /dev/null
+++ b/ics-collector/debugger/tests/IcsMergerTest.php
@@ -0,0 +1,69 @@
+merger = new IcsMerger();
+ }
+
+ public function testWithTwoFile() {
+ $this->merger->add(file_get_contents('../data/freifunk_0'));
+ $this->merger->add(file_get_contents('../data/freifunk_3'));
+ $result = $this->merger->getResult();
+ $this->assertEquals(count($result['VEVENTS']), 3);
+ /*
+ echo '
';
+ var_dump($result);
+ echo '
';
+ echo IcsMerger::getRawText($result);
+ */
+ }
+
+ public function testConversionLocalTimeWithTimezone() {
+ $this->merger->add
+ ("BEGIN:VCALENDAR
+ BEGIN:VEVENT
+ DTSTART;TZID=Asia/Saigon:20150527T213000
+ SUMMARY:Event 1
+ END:VEVENT
+ END:VCALENDAR
+ ");
+ $this->merger->add
+ ("BEGIN:VCALENDAR
+ BEGIN:VEVENT
+ DTSTART;TZID=EST:20150527T213000
+ SUMMARY:Event 2
+ END:VEVENT
+ END:VCALENDAR
+ ");
+ $this->assertEquals($this->merger->getResult()['VEVENTS']['0']['DTSTART']['value'], '20150527T163000');
+ $this->assertEquals($this->merger->getResult()['VEVENTS']['1']['DTSTART']['value'], '20150528T033000');
+ }
+
+ public function testConversionLocalTimeWithoutTimezone() {
+ $this->merger->add
+ ("BEGIN:VCALENDAR
+ BEGIN:VEVENT
+ DTSTART:20150527T213000
+ SUMMARY:Event 1
+ END:VEVENT
+ END:VCALENDAR
+ ");
+ $this->merger->add
+ ("BEGIN:VCALENDAR
+ BEGIN:VEVENT
+ DTSTART;TZID=EST:20150527T213000
+ SUMMARY:Event 2
+ END:VEVENT
+ END:VCALENDAR
+ ");
+ $this->assertEquals($this->merger->getResult()['VEVENTS']['0']['DTSTART']['value'], '20150527T163000');
+ $this->assertEquals($this->merger->getResult()['VEVENTS']['1']['DTSTART']['value'], '20150528T023000');
+ }
+}
\ No newline at end of file
diff --git a/ics-collector/debugger/tests/ics-merger-test.php b/ics-collector/debugger/tests/ics-merger-test.php
deleted file mode 100644
index b006b4b..0000000
--- a/ics-collector/debugger/tests/ics-merger-test.php
+++ /dev/null
@@ -1,12 +0,0 @@
-add(file_get_contents('../data/freifunk_0'));
-$merger->add(file_get_contents('../data/freifunk_3'));
-$result = $merger->getResult();
-echo '
';
-var_dump($result);
-echo '
';
-
-echo IcsMerger::getRawText($result);