1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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
|
require 'delegate'
require 'icalendar/downcased_hash'
module Icalendar
class Value < ::SimpleDelegator
attr_accessor :ical_params
def initialize(value, params = {})
@ical_params = Icalendar::DowncasedHash(params)
super value
end
def ical_param(key, value)
@ical_params[key] = value
end
def value
__getobj__
end
def to_ical(default_type)
ical_param 'value', self.value_type if needs_value_type?(default_type)
"#{params_ical}:#{value_ical}"
end
def params_ical
unless ical_params.empty?
";#{ical_params.map { |name, value| param_ical name, value }.join ';'}"
end
end
def self.value_type
name.gsub(/\A.*::/, '').gsub(/(?<!\A)[A-Z]/, '-\0').upcase
end
def value_type
self.class.value_type
end
private
def needs_value_type?(default_type)
self.class != default_type
end
def param_ical(name, param_value)
if param_value.is_a? Array
param_value = param_value.map { |v| escape_param_value v }.join ','
else
param_value = escape_param_value param_value
end
"#{name.to_s.gsub('_', '-').upcase}=#{param_value}"
end
def escape_param_value(value)
v = value.to_s.gsub('"', "'")
v =~ /[;:,]/ ? %("#{v}") : v
end
end
end
# helpers; not actual iCalendar value type
require_relative 'values/array'
require_relative 'values/date_or_date_time'
# iCalendar value types
require_relative 'values/binary'
require_relative 'values/boolean'
require_relative 'values/date'
require_relative 'values/date_time'
require_relative 'values/duration'
require_relative 'values/float'
require_relative 'values/integer'
require_relative 'values/period'
require_relative 'values/recur'
require_relative 'values/text'
require_relative 'values/time'
require_relative 'values/uri'
require_relative 'values/utc_offset'
# further refine above classes
require_relative 'values/cal_address'
|