26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/ice_cube/parsers/ical_parser.rb', line 26
def self.rule_from_ical(ical)
params = { validations: { } }
ical.split(';').each do |rule|
(name, value) = rule.split('=')
value.strip!
case name
when 'FREQ'
params[:freq] = value.downcase
when 'INTERVAL'
params[:interval] = value.to_i
when 'COUNT'
params[:count] = value.to_i
when 'UNTIL'
params[:until] = Time.parse(value).utc
when 'WKST'
params[:wkst] = TimeUtil.ical_day_to_symbol(value)
when 'BYSECOND'
params[:validations][:second_of_minute] = value.split(',').collect(&:to_i)
when 'BYMINUTE'
params[:validations][:minute_of_hour] = value.split(',').collect(&:to_i)
when 'BYHOUR'
params[:validations][:hour_of_day] = value.split(',').collect(&:to_i)
when 'BYDAY'
dows = {}
days = []
value.split(',').each do |expr|
day = TimeUtil.ical_day_to_symbol(expr.strip[-2..-1])
if expr.strip.length > 2 occ = expr[0..-3].to_i
dows[day].nil? ? dows[day] = [occ] : dows[day].push(occ)
days.delete(TimeUtil.sym_to_wday(day))
else
days.push TimeUtil.sym_to_wday(day) if dows[day].nil?
end
end
params[:validations][:day_of_week] = dows unless dows.empty?
params[:validations][:day] = days unless days.empty?
when 'BYMONTHDAY'
params[:validations][:day_of_month] = value.split(',').collect(&:to_i)
when 'BYMONTH'
params[:validations][:month_of_year] = value.split(',').collect(&:to_i)
when 'BYYEARDAY'
params[:validations][:day_of_year] = value.split(',').collect(&:to_i)
when 'BYSETPOS'
else
raise "Invalid or unsupported rrule command: #{name}"
end
end
params[:interval] ||= 1
params.delete(:wkst) unless params[:freq] == 'weekly'
rule = Rule.send(*params.values_at(:freq, :interval, :wkst).compact)
rule.count(params[:count]) if params[:count]
rule.until(params[:until]) if params[:until]
params[:validations].each do |key, value|
value.is_a?(Array) ? rule.send(key, *value) : rule.send(key, value)
end
rule
end
|