http://github.com/icalendar/icalendar
لا يزال هناك توثيق أفضل، ولكن في هذه الأثناء يتم تلخيص التغييرات اللازمة للانتقال من 1.x إلى 2.0 من خلال الفرق المطلوب لتحديث الملف التمهيدي (README)
iCalendar هي مكتبة Ruby للتعامل مع ملفات iCalendar بتنسيق iCalendar المحدد بواسطة RFC-5545.
require 'icalendar'
# Create a calendar with an event (standard method)
cal = Icalendar :: Calendar . new
cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = "Meeting with the man."
e . description = "Have a long lunch meeting and decide nothing..."
e . ip_class = "PRIVATE"
end
cal . publish
event = Icalendar :: Event . new
event . dtstart = DateTime . civil ( 2006 , 6 , 23 , 8 , 30 )
event . summary = "A great event!"
cal . add_event ( event )
event2 = cal . event # This automatically adds the event to the calendar
event2 . dtstart = DateTime . civil ( 2006 , 6 , 24 , 8 , 30 )
event2 . summary = "Another great event!"
params = { "altrep" => "http://my.language.net" , "language" => "SPANISH" }
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = Icalendar :: Values :: Text . new "This is a summary with params." , params
end
event . summary . ical_params #=> {'altrep' => 'http://my.language.net', 'language' => 'SPANISH'}
# or
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: Date . new ( '20050428' )
e . dtend = Icalendar :: Values :: Date . new ( '20050429' )
e . summary = "This is a summary with params."
e . summary . ical_params = params
end
event . summary . ical_params #=> {'altrep' => 'http://my.language.net', 'language' => 'SPANISH'}
في بعض الأحيان، لا نهتم إذا كانت بداية الحدث أو نهايته عبارة عن كائنات Date
أو DateTime
. لهذا يمكننا استخدام DateOrDateTime.new(value)
. سيؤدي استدعاء .call
على DateOrDateTime
الذي تم إرجاعه إلى إرجاع كائن Date
أو DateTime
الأساسي على الفور.
event = cal . event do | e |
e . dtstart = Icalendar :: Values :: DateOrDateTime . new ( '20140924' )
e . dtend = Icalendar :: Values :: DateOrDateTime . new ( '20140925' ) . call
e . summary = 'This is an all-day event, because DateOrDateTime will return Dates'
end
بالنسبة للعملاء الذين يمكنهم تحليل وعرض عنوان URL المرتبط بحدث ما، فمن الممكن تعيين واحد.
event = cal . event do | e |
e . url = 'https://example.com'
end
cal_string = cal.to_ical
puts cal_string
cal . event do | e |
# ...other event properties
e . alarm do | a |
a . action = "EMAIL"
a . description = "This is an event reminder" # email body (required)
a . summary = "Alarm notification" # email subject (required)
a . attendee = %w( mailto:[email protected] mailto:[email protected] ) # one or more email recipients (required)
a . append_attendee "mailto:[email protected]"
a . trigger = "-PT15M" # 15 minutes before
a . append_attach Icalendar :: Values :: Uri . new ( "ftp://host.com/novo-procs/felizano.exe" , "fmttype" => "application/binary" ) # email attachments (optional)
end
e . alarm do | a |
a . action = "DISPLAY" # This line isn't necessary, it's the default
a . summary = "Alarm notification"
a . trigger = "-P1DT0H0M0S" # 1 day before
end
e . alarm do | a |
a . action = "AUDIO"
a . trigger = "-PT15M"
a . append_attach "Basso"
end
end
# BEGIN:VALARM
# ACTION:EMAIL
# ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-procs/felizano.exe
# TRIGGER:-PT15M
# SUMMARY:Alarm notification
# DESCRIPTION:This is an event reminder
# ATTENDEE:mailto:[email protected]
# ATTENDEE:mailto:[email protected]
# END:VALARM
#
# BEGIN:VALARM
# ACTION:DISPLAY
# TRIGGER:-P1DT0H0M0S
# SUMMARY:Alarm notification
# END:VALARM
#
# BEGIN:VALARM
# ACTION:AUDIO
# ATTACH;VALUE=URI:Basso
# TRIGGER:-PT15M
# END:VALARM
سيؤدي استدعاء الأسلوب event.alarm
إلى إنشاء إنذار في حالة عدم وجوده. للتحقق مما إذا كان هناك إنذار لحدث ما، استخدم has_alarm?
طريقة.
event . has_alarm?
# => false
event . alarm
# => #<Icalendar::Alarm ... >
event . has_alarm?
#=> true
cal = Icalendar :: Calendar . new
cal . timezone do | t |
t . tzid = "America/Chicago"
t . daylight do | d |
d . tzoffsetfrom = "-0600"
d . tzoffsetto = "-0500"
d . tzname = "CDT"
d . dtstart = "19700308T020000"
d . rrule = "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
end
t . standard do | s |
s . tzoffsetfrom = "-0500"
s . tzoffsetto = "-0600"
s . tzname = "CST"
s . dtstart = "19701101T020000"
s . rrule = "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
end
end
# BEGIN:VTIMEZONE
# TZID:America/Chicago
# BEGIN:DAYLIGHT
# TZOFFSETFROM:-0600
# TZOFFSETTO:-0500
# TZNAME:CDT
# DTSTART:19700308T020000
# RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
# END:DAYLIGHT
# BEGIN:STANDARD
# TZOFFSETFROM:-0500
# TZOFFSETTO:-0600
# TZNAME:CST
# DTSTART:19701101T020000
# RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
# END:STANDARD
# END:VTIMEZONE
يتمتع iCalendar ببعض الدعم الأساسي لإنشاء كتل VTIMEZONE من معلومات المنطقة الزمنية المأخوذة من tzinfo
. يجب أن تحتاج إلى دعم tzinfo
يدويًا للاستفادة من هذه الميزة.
تم اختبار iCalendar ويعمل مع إصدارات tzinfo
0.3 و1.x و2.x. قد تكون جوهرة tzinfo-data
مطلوبة أيضًا اعتمادًا على إصدار tzinfo
الخاص بك وربما نظام التشغيل لديك.
require 'icalendar/tzinfo'
cal = Icalendar :: Calendar . new
event_start = DateTime . new 2008 , 12 , 29 , 8 , 0 , 0
event_end = DateTime . new 2008 , 12 , 29 , 11 , 0 , 0
tzid = "America/Chicago"
tz = TZInfo :: Timezone . get tzid
timezone = tz . ical_timezone event_start
cal . add_timezone timezone
cal . event do | e |
e . dtstart = Icalendar :: Values :: DateTime . new event_start , 'tzid' => tzid
e . dtend = Icalendar :: Values :: DateTime . new event_end , 'tzid' => tzid
e . summary = "Meeting with the man."
e . description = "Have a long lunch meeting and decide nothing..."
e . organizer = "mailto:[email protected]"
e . organizer = Icalendar :: Values :: CalAddress . new ( "mailto:[email protected]" , cn : 'John Smith' )
end
# Open a file or pass a string to the parser
cal_file = File . open ( "single_event.ics" )
# Parser returns an array of calendars because a single file
# can have multiple calendars.
cals = Icalendar :: Calendar . parse ( cal_file )
cal = cals . first
# Now you can access the cal object in just the same way I created it
event = cal . events . first
puts "start date-time: #{ event . dtstart } "
puts "start date-time timezone: #{ event . dtstart . ical_params [ 'tzid' ] } "
puts "summary: #{ event . summary } "
يمكنك أيضًا إنشاء نسخة Parser
مباشرةً، ويمكن استخدام ذلك لتمكين التحليل الدقيق:
# Sometimes you want to strongly verify only rfc-approved properties are
# used
strict_parser = Icalendar :: Parser . new ( cal_file , true )
cal = strict_parser . parse
# Open a file or pass a string to the parser
event_file = File . open ( "event.ics" )
# Parser returns an array of events because a single file
# can have multiple events.
events = Icalendar :: Event . parse ( event_file )
event = events . first
puts "start date-time: #{ event . dtstart } "
puts "start date-time timezone: #{ event . dtstart . ical_params [ 'tzid' ] } "
puts "summary: #{ event . summary } "
في كثير من الأحيان، في تطبيقات الويب والتطبيقات التفاعلية الأخرى، ستحتاج إلى البحث عن العناصر في التقويم لإجراء تغييرات أو الحصول على التفاصيل. يمكنك الآن العثور على كل شيء من خلال المعرف الفريد المرتبط تلقائيًا بجميع المكونات.
cal = Calendar . new
10 . times { cal . event } # Create 10 events with only default data.
some_event = cal . events [ 5 ] # Grab it from the array of events
# Use the uid as the key in your app
key = some_event . uid
# so later you can find it.
same_event = cal . find_event ( key )
تحقق من اختبارات الوحدة للحصول على أمثلة لمعظم الأشياء التي تريد القيام بها، ولكن من فضلك أرسل لي رمز المثال أو أخبرني بما هو مفقود.
يمكن العثور على أحدث إصدار من هذه المكتبة على
الأمر كله يتعلق بأحجار الياقوت:
$ gem install icalendar
لتشغيل الاختبارات:
$ bundle install
$ rake spec
تم إصدار هذه المكتبة بموجب نفس ترخيص روبي نفسها.
الرجاء إرسال طلبات السحب من فرع موضوع تم إعادة تأسيسه وتضمين اختبارات لجميع الأخطاء والميزات.
باعتبارنا مساهمين ومشرفين على هذا المشروع، نتعهد باحترام جميع الأشخاص الذين يساهمون من خلال الإبلاغ عن المشكلات، ونشر طلبات الميزات، وتحديث الوثائق، وإرسال طلبات السحب أو التصحيحات، والأنشطة الأخرى.
نحن ملتزمون بجعل المشاركة في هذا المشروع تجربة خالية من التحرش للجميع، بغض النظر عن مستوى الخبرة أو الجنس أو الهوية الجنسية والتعبير أو التوجه الجنسي أو الإعاقة أو المظهر الشخصي أو حجم الجسم أو العرق أو الأصل العرقي أو العمر أو الدين.
تشمل أمثلة السلوك غير المقبول من قبل المشاركين استخدام اللغة أو الصور الجنسية، أو التعليقات المهينة أو الهجمات الشخصية، أو التصيد، أو المضايقات العامة أو الخاصة، أو الإهانات، أو أي سلوك غير مهني آخر.
يتمتع مشرفو المشروع بالحق والمسؤولية في إزالة أو تحرير أو رفض التعليقات والالتزامات والتعليمات البرمجية وتحريرات wiki والمشكلات والمساهمات الأخرى التي لا تتوافق مع قواعد السلوك هذه. قد تتم إزالة مشرفي المشروع الذين لا يتبعون قواعد السلوك من فريق المشروع.
تنطبق قواعد السلوك هذه داخل مساحات المشروع وفي الأماكن العامة عندما يمثل الفرد المشروع أو مجتمعه.
قد يتم الإبلاغ عن حالات السلوك المسيء أو المضايق أو غير المقبول عن طريق فتح مشكلة أو الاتصال بواحد أو أكثر من القائمين على المشروع.
تم تعديل قواعد السلوك هذه من ميثاق المساهمين، الإصدار 1.1.0، المتاح على http://contributor-covenant.org/version/1/1/0/