diff --git a/ical.js b/ical.js
index dff5fbc..2dcf10a 100755
--- a/ical.js
+++ b/ical.js
@@ -1,3 +1,5 @@
+var UUID = require('node-uuid');
+
(function(name, definition) {
/****************
@@ -31,117 +33,130 @@
var out = {}
for (var i = 0; i
-1){
- var segs = p[i].split('=');
-
- out[segs[0]] = parseValue(segs.slice(1).join('='));
-
+ var segs = p[i].split('=')
+ , out = {}
+ if (segs.length == 2){
+ out[segs[0]] = segs[1]
+ }
}
}
return out || sp
}
- var parseValue = function(val){
- if ('TRUE' === val)
- return true;
-
- if ('FALSE' === val)
- return false;
-
- var number = Number(val);
- if (!isNaN(number))
- return number;
-
- return val;
- }
-
var storeParam = function(name){
return function(val, params, curr){
- var data;
if (params && params.length && !(params.length==1 && params[0]==='CHARSET=utf-8')){
- data = {params:parseParams(params), val:text(val)}
+ curr[name] = {params:params, val:text(val)}
}
else
- data = text(val)
+ curr[name] = text(val)
- var current = curr[name];
- if (Array.isArray(current)){
- current.push(data);
- return curr;
- }
-
- if (current != null){
- curr[name] = [current, data];
- return curr;
- }
-
- curr[name] = data;
return curr
}
- }
+ };
- var addTZ = function(dt, name, params){
+ var addTZ = function(dateObj, params){
var p = parseParams(params);
- if (params && p){
- dt[name].tz = p.TZID
+ if (params && p && dateObj){
+ dateObj.tz = p.TZID
}
- return dt
- }
-
-
- var dateParam = function(name){
- return function(val, params, curr){
+ return dateObj;
+ };
- // Store as string - worst case scenario
- storeParam(name)(val, undefined, curr)
+ /**
+ * Convert a date string from ICS format into a native Date object
+ * @param {string} val - The ICS string to be parsed
+ * @param {array} params
+ * @param {object} curr - The current Object that we're building
+ * @return {object} The Javascript date object
+ */
+ function parseDate(val, params, curr) {
+ var objToReturn = val;
- if (params && params[0] === "VALUE=DATE") {
- // Just Date
+ if (params && params[0] === "VALUE=DATE") {
+ // Just Date
- var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
- if (comps !== null) {
- // No TZ info - assume same timezone as this computer
- curr[name] = new Date(
- comps[1],
+ var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
+ if (comps !== null) {
+ // No TZ info - assume same timezone as this computer
+ objToReturn = new Date(
+ comps[1],
parseInt(comps[2], 10)-1,
- comps[3]
- );
+ comps[3]
+ );
- return addTZ(curr, name, params);
- }
+ return addTZ(objToReturn, params);
}
+ }
- //typical RFC date-time format
- var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
- if (comps !== null) {
- if (comps[7] == 'Z'){ // GMT
- curr[name] = new Date(Date.UTC(
- parseInt(comps[1], 10),
+ //typical RFC date-time format
+ var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
+ if (comps !== null) {
+ if (comps[7] == 'Z'){ // GMT
+ return new Date(Date.UTC(
+ parseInt(comps[1], 10),
parseInt(comps[2], 10)-1,
- parseInt(comps[3], 10),
- parseInt(comps[4], 10),
- parseInt(comps[5], 10),
- parseInt(comps[6], 10 )
- ));
- // TODO add tz
- } else {
- curr[name] = new Date(
- parseInt(comps[1], 10),
+ parseInt(comps[3], 10),
+ parseInt(comps[4], 10),
+ parseInt(comps[5], 10),
+ parseInt(comps[6], 10 )
+ ));
+ // TODO add tz
+ } else {
+ return new Date(
+ parseInt(comps[1], 10),
parseInt(comps[2], 10)-1,
- parseInt(comps[3], 10),
- parseInt(comps[4], 10),
- parseInt(comps[5], 10),
- parseInt(comps[6], 10)
- );
- }
+ parseInt(comps[3], 10),
+ parseInt(comps[4], 10),
+ parseInt(comps[5], 10),
+ parseInt(comps[6], 10)
+ );
}
+ }
- return addTZ(curr, name, params)
+ // date format (no time)
+ comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
+ if (comps !== null) {
+ // No TZ info - assume same timezone as this computer
+ objToReturn = new Date(
+ comps[1],
+ parseInt(comps[2], 10)-1,
+ comps[3]
+ );
+
+ return addTZ(objToReturn, params);
}
}
+ var dateParam = function(name){
+ return function(val, params, curr){
+ var dateObj = parseDate(val, params, curr);
+ dateObj = addTZ(dateObj, params);
+ if (dateObj) {
+ curr[name] = dateObj;
+ } else {
+ // Store as string - worst case scenario
+ storeParam(name)(val, undefined, curr);
+ }
+ return curr;
+ }
+ };
+
+ var dateParamArray = function(name) {
+ return function(date, params, curr) {
+ // initialize
+ curr[name] = curr[name] || [];
+ // load date
+ var dateObj = parseDate(date, params, curr);
+ dateObj = addTZ(dateObj, params);
+ curr[name].push(dateObj);
+ return curr;
+ }
+
+ };
var geoParam = function(name){
return function(val, params, curr){
@@ -219,11 +234,7 @@
}
var par = stack.pop()
-
- if (curr.uid)
- par[curr.uid] = curr
- else
- par[Math.random()*100000] = curr // Randomly assign ID : TODO - use true GUID
+ par[UUID.v4()] = curr;
return par
}
@@ -242,6 +253,8 @@
, 'COMPLETED': dateParam('completed')
, 'CATEGORIES': categoriesParam('categories')
, 'FREEBUSY': freebusyParam('freebusy')
+ , 'EXDATE': dateParamArray('exdate')
+ , 'RECURRENCE-ID': storeParam('recurrenceId')
},
@@ -301,4 +314,4 @@
}
}
-}))
+}))
\ No newline at end of file
diff --git a/package.json b/package.json
index 915ae84..5dff450 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
"url": "git://github.com/peterbraden/ical.js.git"
},
"dependencies": {
+ "node-uuid": "^1.4.3",
"request": "2.40.0",
"rrule": "2.0.0"
},