Skip to content

Commit b4adaca

Browse files
committed
merges in this PR which fixes recurring events peterbraden#44
1 parent 2f611dc commit b4adaca

File tree

2 files changed

+98
-84
lines changed

2 files changed

+98
-84
lines changed

ical.js

Lines changed: 97 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var UUID = require('node-uuid');
2+
13
(function(name, definition) {
24

35
/****************
@@ -31,117 +33,130 @@
3133
var out = {}
3234
for (var i = 0; i<p.length; i++){
3335
if (p[i].indexOf('=') > -1){
34-
var segs = p[i].split('=');
35-
36-
out[segs[0]] = parseValue(segs.slice(1).join('='));
37-
36+
var segs = p[i].split('=')
37+
, out = {}
38+
if (segs.length == 2){
39+
out[segs[0]] = segs[1]
40+
}
3841
}
3942
}
4043
return out || sp
4144
}
4245

43-
var parseValue = function(val){
44-
if ('TRUE' === val)
45-
return true;
46-
47-
if ('FALSE' === val)
48-
return false;
49-
50-
var number = Number(val);
51-
if (!isNaN(number))
52-
return number;
53-
54-
return val;
55-
}
56-
5746
var storeParam = function(name){
5847
return function(val, params, curr){
59-
var data;
6048
if (params && params.length && !(params.length==1 && params[0]==='CHARSET=utf-8')){
61-
data = {params:parseParams(params), val:text(val)}
49+
curr[name] = {params:params, val:text(val)}
6250
}
6351
else
64-
data = text(val)
52+
curr[name] = text(val)
6553

66-
var current = curr[name];
67-
if (Array.isArray(current)){
68-
current.push(data);
69-
return curr;
70-
}
71-
72-
if (current != null){
73-
curr[name] = [current, data];
74-
return curr;
75-
}
76-
77-
curr[name] = data;
7854
return curr
7955
}
80-
}
56+
};
8157

82-
var addTZ = function(dt, name, params){
58+
var addTZ = function(dateObj, params){
8359
var p = parseParams(params);
8460

85-
if (params && p){
86-
dt[name].tz = p.TZID
61+
if (params && p && dateObj){
62+
dateObj.tz = p.TZID
8763
}
8864

89-
return dt
90-
}
91-
92-
93-
var dateParam = function(name){
94-
return function(val, params, curr){
65+
return dateObj;
66+
};
9567

96-
// Store as string - worst case scenario
97-
storeParam(name)(val, undefined, curr)
68+
/**
69+
* Convert a date string from ICS format into a native Date object
70+
* @param {string} val - The ICS string to be parsed
71+
* @param {array} params
72+
* @param {object} curr - The current Object that we're building
73+
* @return {object} The Javascript date object
74+
*/
75+
function parseDate(val, params, curr) {
76+
var objToReturn = val;
9877

99-
if (params && params[0] === "VALUE=DATE") {
100-
// Just Date
78+
if (params && params[0] === "VALUE=DATE") {
79+
// Just Date
10180

102-
var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
103-
if (comps !== null) {
104-
// No TZ info - assume same timezone as this computer
105-
curr[name] = new Date(
106-
comps[1],
81+
var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
82+
if (comps !== null) {
83+
// No TZ info - assume same timezone as this computer
84+
objToReturn = new Date(
85+
comps[1],
10786
parseInt(comps[2], 10)-1,
108-
comps[3]
109-
);
87+
comps[3]
88+
);
11089

111-
return addTZ(curr, name, params);
112-
}
90+
return addTZ(objToReturn, params);
11391
}
92+
}
11493

11594

116-
//typical RFC date-time format
117-
var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
118-
if (comps !== null) {
119-
if (comps[7] == 'Z'){ // GMT
120-
curr[name] = new Date(Date.UTC(
121-
parseInt(comps[1], 10),
95+
//typical RFC date-time format
96+
var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
97+
if (comps !== null) {
98+
if (comps[7] == 'Z'){ // GMT
99+
return new Date(Date.UTC(
100+
parseInt(comps[1], 10),
122101
parseInt(comps[2], 10)-1,
123-
parseInt(comps[3], 10),
124-
parseInt(comps[4], 10),
125-
parseInt(comps[5], 10),
126-
parseInt(comps[6], 10 )
127-
));
128-
// TODO add tz
129-
} else {
130-
curr[name] = new Date(
131-
parseInt(comps[1], 10),
102+
parseInt(comps[3], 10),
103+
parseInt(comps[4], 10),
104+
parseInt(comps[5], 10),
105+
parseInt(comps[6], 10 )
106+
));
107+
// TODO add tz
108+
} else {
109+
return new Date(
110+
parseInt(comps[1], 10),
132111
parseInt(comps[2], 10)-1,
133-
parseInt(comps[3], 10),
134-
parseInt(comps[4], 10),
135-
parseInt(comps[5], 10),
136-
parseInt(comps[6], 10)
137-
);
138-
}
112+
parseInt(comps[3], 10),
113+
parseInt(comps[4], 10),
114+
parseInt(comps[5], 10),
115+
parseInt(comps[6], 10)
116+
);
139117
}
118+
}
140119

141-
return addTZ(curr, name, params)
120+
// date format (no time)
121+
comps = /^(\d{4})(\d{2})(\d{2})$/.exec(val);
122+
if (comps !== null) {
123+
// No TZ info - assume same timezone as this computer
124+
objToReturn = new Date(
125+
comps[1],
126+
parseInt(comps[2], 10)-1,
127+
comps[3]
128+
);
129+
130+
return addTZ(objToReturn, params);
142131
}
143132
}
144133

134+
var dateParam = function(name){
135+
return function(val, params, curr){
136+
var dateObj = parseDate(val, params, curr);
137+
dateObj = addTZ(dateObj, params);
138+
if (dateObj) {
139+
curr[name] = dateObj;
140+
} else {
141+
// Store as string - worst case scenario
142+
storeParam(name)(val, undefined, curr);
143+
}
144+
return curr;
145+
}
146+
};
147+
148+
var dateParamArray = function(name) {
149+
return function(date, params, curr) {
150+
// initialize
151+
curr[name] = curr[name] || [];
152+
// load date
153+
var dateObj = parseDate(date, params, curr);
154+
dateObj = addTZ(dateObj, params);
155+
curr[name].push(dateObj);
156+
return curr;
157+
}
158+
159+
};
145160

146161
var geoParam = function(name){
147162
return function(val, params, curr){
@@ -219,11 +234,7 @@
219234
}
220235

221236
var par = stack.pop()
222-
223-
if (curr.uid)
224-
par[curr.uid] = curr
225-
else
226-
par[Math.random()*100000] = curr // Randomly assign ID : TODO - use true GUID
237+
par[UUID.v4()] = curr;
227238

228239
return par
229240
}
@@ -242,6 +253,8 @@
242253
, 'COMPLETED': dateParam('completed')
243254
, 'CATEGORIES': categoriesParam('categories')
244255
, 'FREEBUSY': freebusyParam('freebusy')
256+
, 'EXDATE': dateParamArray('exdate')
257+
, 'RECURRENCE-ID': storeParam('recurrenceId')
245258
},
246259

247260

@@ -301,4 +314,4 @@
301314
}
302315

303316
}
304-
}))
317+
}))

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"url": "git://github.com/peterbraden/ical.js.git"
1616
},
1717
"dependencies": {
18+
"node-uuid": "^1.4.3",
1819
"request": "2.40.0",
1920
"rrule": "2.0.0"
2021
},

0 commit comments

Comments
 (0)