Skip to content

Commit

Permalink
merges in this PR which fixes recurring events peterbraden#44
Browse files Browse the repository at this point in the history
  • Loading branch information
mreid1130 committed Sep 24, 2015
1 parent 2f611dc commit b4adaca
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 84 deletions.
181 changes: 97 additions & 84 deletions ical.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
var UUID = require('node-uuid');

(function(name, definition) {

/****************
Expand Down Expand Up @@ -31,117 +33,130 @@
var out = {}
for (var i = 0; i<p.length; i++){
if (p[i].indexOf('=') > -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){
Expand Down Expand Up @@ -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
}
Expand All @@ -242,6 +253,8 @@
, 'COMPLETED': dateParam('completed')
, 'CATEGORIES': categoriesParam('categories')
, 'FREEBUSY': freebusyParam('freebusy')
, 'EXDATE': dateParamArray('exdate')
, 'RECURRENCE-ID': storeParam('recurrenceId')
},


Expand Down Expand Up @@ -301,4 +314,4 @@
}

}
}))
}))
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down

0 comments on commit b4adaca

Please sign in to comment.