@@ -2,28 +2,57 @@ module IceCube
22 class IcalParser
33 def self . schedule_from_ical ( ical_string , options = { } )
44 data = { }
5+ parser = :parse_line
56 ical_string . each_line do |line |
67 ( property , value ) = line . split ( ':' )
78 ( property , tzid ) = property . split ( ';' )
9+
10+ parser , property , value = *send ( parser , property , value )
11+
812 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
928 when 'DTSTART'
10- data [ : start_time] = TimeUtil . deserialize_time ( value )
29+ [ :parse_line , : start_time, TimeUtil . deserialize_time ( value ) ]
1130 when 'DTEND'
12- data [ : end_time] = TimeUtil . deserialize_time ( value )
31+ [ :parse_line , : end_time, TimeUtil . deserialize_time ( value ) ]
1332 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 ) } ]
1634 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 ) } ]
1936 when 'DURATION'
20- data [ :duration ] # FIXME
37+ nil # FIXME
2138 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'
2442 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 ]
2756 end
2857
2958 def self . rule_from_ical ( ical )
0 commit comments