@@ -2,28 +2,57 @@ module IceCube
2
2
class IcalParser
3
3
def self . schedule_from_ical ( ical_string , options = { } )
4
4
data = { }
5
+ parser = :parse_line
5
6
ical_string . each_line do |line |
6
7
( property , value ) = line . split ( ':' )
7
8
( property , tzid ) = property . split ( ';' )
9
+
10
+ parser , property , value = *send ( parser , property , value )
11
+
8
12
case property
13
+ when :start_time ,
14
+ :end_time
15
+ data [ property ] = value
16
+ when :rtimes ,
17
+ :rrules ,
18
+ :extimes
19
+ data [ property ] ||= [ ]
20
+ data [ property ] += value
21
+ end
22
+ end
23
+ Schedule . from_hash data
24
+ end
25
+
26
+ def self . parse_line ( property , value )
27
+ result = case property
9
28
when 'DTSTART'
10
- data [ : start_time] = TimeUtil . deserialize_time ( value )
29
+ [ :parse_line , : start_time, TimeUtil . deserialize_time ( value ) ]
11
30
when 'DTEND'
12
- data [ : end_time] = TimeUtil . deserialize_time ( value )
31
+ [ :parse_line , : end_time, TimeUtil . deserialize_time ( value ) ]
13
32
when 'RDATE'
14
- data [ :rtimes ] ||= [ ]
15
- data [ :rtimes ] += value . split ( ',' ) . map { |v | TimeUtil . deserialize_time ( v ) }
33
+ [ :parse_line , :rtimes , value . split ( ',' ) . map { |v | TimeUtil . deserialize_time ( v ) } ]
16
34
when 'EXDATE'
17
- data [ :extimes ] ||= [ ]
18
- data [ :extimes ] += value . split ( ',' ) . map { |v | TimeUtil . deserialize_time ( v ) }
35
+ [ :parse_line , :extimes , value . split ( ',' ) . map { |v | TimeUtil . deserialize_time ( v ) } ]
19
36
when 'DURATION'
20
- data [ :duration ] # FIXME
37
+ nil # FIXME
21
38
when 'RRULE'
22
- data [ :rrules ] ||= [ ]
23
- data [ :rrules ] += [ rule_from_ical ( value ) ]
39
+ [ :parse_line , :rrules , [ rule_from_ical ( value ) ] ]
40
+ when 'BEGIN'
41
+ [ :parse_vevent_line ] if value . chomp == 'VEVENT'
24
42
end
25
- end
26
- Schedule . from_hash data
43
+
44
+ result || [ :parse_line ]
45
+ end
46
+
47
+ def self . parse_vevent_line ( property , value )
48
+ result = case property
49
+ when 'DTSTART'
50
+ [ :parse_vevent_line , :rtimes , [ TimeUtil . deserialize_time ( value ) ] ]
51
+ when 'END'
52
+ [ :parse_line ] if value . chomp == 'VEVENT'
53
+ end
54
+
55
+ result || [ :parse_vevent_line ]
27
56
end
28
57
29
58
def self . rule_from_ical ( ical )
0 commit comments