http://github.com/icalendar/icalendar
Dokumentasi yang lebih baik masih akan datang, namun sementara itu perubahan yang diperlukan untuk berpindah dari 1.x ke 2.0 dirangkum oleh perbedaan yang diperlukan untuk memperbarui README
iCalendar adalah perpustakaan Ruby untuk menangani file iCalendar dalam format iCalendar yang ditentukan oleh 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'}
Terkadang kita tidak peduli apakah awal atau akhir acara adalah objek Date
atau DateTime
. Untuk ini, kita bisa menggunakan DateOrDateTime.new(value)
. Memanggil .call
pada DateOrDateTime
yang dikembalikan akan segera mengembalikan objek Date
atau DateTime
yang mendasarinya.
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
Untuk klien yang dapat mengurai dan menampilkan URL yang terkait dengan suatu peristiwa, dimungkinkan untuk menetapkannya.
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
Memanggil metode event.alarm
akan membuat alarm jika tidak ada. Untuk memeriksa apakah suatu peristiwa memiliki alarm, gunakan has_alarm?
metode.
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 memiliki beberapa dukungan dasar untuk membuat blok VTIMEZONE dari informasi zona waktu yang diambil dari tzinfo
. Anda harus memerlukan dukungan tzinfo
secara manual untuk memanfaatkannya.
iCalendar telah diuji dan berfungsi dengan tzinfo
versi 0.3, 1.x, dan 2.x. Permata tzinfo-data
mungkin juga diperlukan tergantung pada versi tzinfo
Anda dan kemungkinan sistem operasi Anda.
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 } "
Anda juga dapat membuat instance Parser
secara langsung, ini dapat digunakan untuk mengaktifkan penguraian ketat:
# 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 } "
Seringkali dalam aplikasi web dan aplikasi interaktif lainnya Anda perlu mencari item di kalender untuk membuat perubahan atau mendapatkan detail. Sekarang Anda dapat menemukan semuanya dengan id unik yang secara otomatis dikaitkan dengan semua komponen.
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 )
Periksa pengujian unit untuk mengetahui contoh sebagian besar hal yang ingin Anda lakukan, tetapi kirimkan saya kode contoh atau beri tahu saya apa yang hilang.
Versi rilis terbaru perpustakaan ini dapat ditemukan di
Ini semua tentang rubygem:
$ gem install icalendar
Untuk menjalankan tes:
$ bundle install
$ rake spec
Perpustakaan ini dirilis di bawah lisensi yang sama dengan Ruby itu sendiri.
Silakan kirimkan permintaan penarikan dari cabang topik yang telah diubah dan sertakan pengujian untuk semua bug dan fitur.
Sebagai kontributor dan pengelola proyek ini, kami berjanji untuk menghormati semua orang yang berkontribusi melalui pelaporan masalah, memposting permintaan fitur, memperbarui dokumentasi, mengirimkan permintaan penarikan atau patch, dan aktivitas lainnya.
Kami berkomitmen untuk menjadikan partisipasi dalam proyek ini sebagai pengalaman bebas pelecehan bagi semua orang, tanpa memandang tingkat pengalaman, gender, identitas dan ekspresi gender, orientasi seksual, disabilitas, penampilan pribadi, ukuran tubuh, ras, etnis, usia, atau agama.
Contoh perilaku yang tidak dapat diterima oleh peserta mencakup penggunaan bahasa atau gambar seksual, komentar yang menghina atau serangan pribadi, trolling, pelecehan publik atau pribadi, penghinaan, atau tindakan tidak profesional lainnya.
Pengelola proyek mempunyai hak dan tanggung jawab untuk menghapus, mengedit, atau menolak komentar, komitmen, kode, pengeditan wiki, masalah, dan kontribusi lainnya yang tidak selaras dengan Kode Etik ini. Pengelola proyek yang tidak mengikuti Kode Etik dapat dikeluarkan dari tim proyek.
Kode etik ini berlaku baik di dalam ruang proyek maupun di ruang publik ketika seseorang mewakili proyek atau komunitasnya.
Contoh perilaku kasar, melecehkan, atau perilaku yang tidak dapat diterima dapat dilaporkan dengan membuka masalah atau menghubungi satu atau lebih pengelola proyek.
Kode Etik ini diadaptasi dari Perjanjian Kontributor, versi 1.1.0, tersedia di http://contributor-covenant.org/version/1/1/0/