From f7c7dd2b46d957e9c52b11a87335d7e07c439f9c Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Mon, 4 Aug 2014 14:18:01 -0700 Subject: [PATCH 1/6] Support exdates by returning an array with the parsed object. --- .gitignore | 1 + ical.js | 113 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 69 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index 3c3629e..eb79dd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +.idea diff --git a/ical.js b/ical.js index 54146de..e4226f3 100755 --- a/ical.js +++ b/ical.js @@ -51,71 +51,93 @@ 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 + dateObj.tz = p.TZID } - return dt - } - + return dateObj + }; - var dateParam = function(name){ - return function(val, params, 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 = {}; - // Store as string - worst case scenario - storeParam(name)(val, undefined, curr) + 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) } } + var dateParam = function(name){ + return function(val, params, curr){ + // Store as string - worst case scenario + storeParam(name)(val, undefined, curr); + var dateObj = parseDate(val, params, curr); + curr[name] = addTZ(dateObj, params); + 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){ @@ -216,6 +238,7 @@ , 'COMPLETED': dateParam('completed') , 'CATEGORIES': categoriesParam('categories') , 'FREEBUSY': freebusyParam('freebusy') + , 'EXDATE': dateParamArray('exdate') }, From 277579b5061687facfa1aa6bfb9230cc2132b6c9 Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Mon, 4 Aug 2014 14:40:51 -0700 Subject: [PATCH 2/6] Only set timezone if we have a valid parsed date. --- ical.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ical.js b/ical.js index e4226f3..cbc1ba3 100755 --- a/ical.js +++ b/ical.js @@ -56,11 +56,11 @@ var addTZ = function(dateObj, params){ var p = parseParams(params); - if (params && p){ + if (params && p && dateObj){ dateObj.tz = p.TZID } - return dateObj + return dateObj; }; /** @@ -71,7 +71,7 @@ * @return {object} The Javascript date object */ function parseDate(val, params, curr) { - var objToReturn = {}; + var objToReturn = val; if (params && params[0] === "VALUE=DATE") { // Just Date @@ -118,10 +118,14 @@ var dateParam = function(name){ return function(val, params, curr){ - // Store as string - worst case scenario - storeParam(name)(val, undefined, curr); var dateObj = parseDate(val, params, curr); - curr[name] = addTZ(dateObj, params); + dateObj = addTZ(dateObj, params); + if (dateObj) { + curr[name] = dateObj; + } else { + // Store as string - worst case scenario + storeParam(name)(val, undefined, curr); + } return curr; } }; From 97cd72ecac514b82adee6c84fab5d5bb5efa9f8d Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Thu, 7 Aug 2014 13:17:30 -0700 Subject: [PATCH 3/6] Index VEVENTs by a guid instead of the external UID (which can isn't always unique). --- ical.js | 9 ++++----- package.json | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ical.js b/ical.js index cbc1ba3..edbdd91 100755 --- a/ical.js +++ b/ical.js @@ -1,3 +1,5 @@ +var UUID = require('node-uuid'); + (function(name, definition) { /**************** @@ -219,11 +221,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 } @@ -243,6 +241,7 @@ , 'CATEGORIES': categoriesParam('categories') , 'FREEBUSY': freebusyParam('freebusy') , 'EXDATE': dateParamArray('exdate') + , 'RECURRENCE-ID': storeParam('recurrenceId') }, diff --git a/package.json b/package.json index 8847145..428068e 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,9 @@ "url": "git://github.com/peterbraden/ical.js.git" }, "dependencies": { + "node-uuid": "^1.4.1", "request": "", - "rrule": "2.0.0" + "rrule": "2.1.0" }, "devDependencies": { "vows": "0.7.0", From 6470cca342e9fed358857bee19ac0690833e8aca Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Mon, 27 Oct 2014 12:31:54 -0700 Subject: [PATCH 4/6] Fix missing comma in package.json, and fix broken test. --- package.json | 2 +- test/test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fed6692..9b25838 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "node-uuid": "^1.4.1", - "rrule": "2.1.0" + "rrule": "2.1.0", "request": "2.40.0" }, "devDependencies": { diff --git a/test/test.js b/test/test.js index e7b5221..733c56d 100755 --- a/test/test.js +++ b/test/test.js @@ -72,7 +72,7 @@ vows.describe('node-ical').addBatch({ } , 'todo item uid4@host1.com' : { topic : function(items){ - return items['uid4@host1.com'] + return _.filter(items,function(obj) { { return obj.uid == 'uid4@host1.com'; } })[0]; } , 'is a VTODO' : function(topic){ assert.equal(topic.type, 'VTODO') From 2521065864f992cfe2ce15fc25d7d43d07f41260 Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Fri, 6 Feb 2015 10:28:47 -0800 Subject: [PATCH 5/6] Return a date object even when there's no time value --- ical.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ical.js b/ical.js index edbdd91..4cff50a 100755 --- a/ical.js +++ b/ical.js @@ -116,6 +116,16 @@ var UUID = require('node-uuid'); ); } } + + // date format (no time) + var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val); + if (comps !== null) { + return new Date(Date.UTC( + parseInt(comps[1], 10), + parseInt(comps[2], 10)-1, + parseInt(comps[3], 10) + )); + } } var dateParam = function(name){ From 1aab4370725ee876d291efa4578f301d7d67fe20 Mon Sep 17 00:00:00 2001 From: Julian Frumar Date: Fri, 6 Feb 2015 12:01:11 -0800 Subject: [PATCH 6/6] Support importing dates that don't have a time component. --- ical.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ical.js b/ical.js index 4cff50a..51de6b1 100755 --- a/ical.js +++ b/ical.js @@ -118,13 +118,16 @@ var UUID = require('node-uuid'); } // date format (no time) - var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val); + comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val); if (comps !== null) { - return new Date(Date.UTC( - parseInt(comps[1], 10), + // No TZ info - assume same timezone as this computer + objToReturn = new Date( + comps[1], parseInt(comps[2], 10)-1, - parseInt(comps[3], 10) - )); + comps[3] + ); + + return addTZ(objToReturn, params); } }