1
+ var UUID = require ( 'node-uuid' ) ;
2
+
1
3
( function ( name , definition ) {
2
4
3
5
/****************
31
33
var out = { }
32
34
for ( var i = 0 ; i < p . length ; i ++ ) {
33
35
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
+ }
38
41
}
39
42
}
40
43
return out || sp
41
44
}
42
45
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
-
57
46
var storeParam = function ( name ) {
58
47
return function ( val , params , curr ) {
59
- var data ;
60
48
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 ) }
62
50
}
63
51
else
64
- data = text ( val )
52
+ curr [ name ] = text ( val )
65
53
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 ;
78
54
return curr
79
55
}
80
- }
56
+ } ;
81
57
82
- var addTZ = function ( dt , name , params ) {
58
+ var addTZ = function ( dateObj , params ) {
83
59
var p = parseParams ( params ) ;
84
60
85
- if ( params && p ) {
86
- dt [ name ] . tz = p . TZID
61
+ if ( params && p && dateObj ) {
62
+ dateObj . tz = p . TZID
87
63
}
88
64
89
- return dt
90
- }
91
-
92
-
93
- var dateParam = function ( name ) {
94
- return function ( val , params , curr ) {
65
+ return dateObj ;
66
+ } ;
95
67
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 ;
98
77
99
- if ( params && params [ 0 ] === "VALUE=DATE" ) {
100
- // Just Date
78
+ if ( params && params [ 0 ] === "VALUE=DATE" ) {
79
+ // Just Date
101
80
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 ] ,
107
86
parseInt ( comps [ 2 ] , 10 ) - 1 ,
108
- comps [ 3 ]
109
- ) ;
87
+ comps [ 3 ]
88
+ ) ;
110
89
111
- return addTZ ( curr , name , params ) ;
112
- }
90
+ return addTZ ( objToReturn , params ) ;
113
91
}
92
+ }
114
93
115
94
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 ) ,
122
101
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 ) ,
132
111
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
+ ) ;
139
117
}
118
+ }
140
119
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 ) ;
142
131
}
143
132
}
144
133
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
+ } ;
145
160
146
161
var geoParam = function ( name ) {
147
162
return function ( val , params , curr ) {
219
234
}
220
235
221
236
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 ;
227
238
228
239
return par
229
240
}
242
253
, 'COMPLETED' : dateParam ( 'completed' )
243
254
, 'CATEGORIES' : categoriesParam ( 'categories' )
244
255
, 'FREEBUSY' : freebusyParam ( 'freebusy' )
256
+ , 'EXDATE' : dateParamArray ( 'exdate' )
257
+ , 'RECURRENCE-ID' : storeParam ( 'recurrenceId' )
245
258
} ,
246
259
247
260
301
314
}
302
315
303
316
}
304
- } ) )
317
+ } ) )
0 commit comments