http://github.com/icalendar/icalendar
Eine bessere Dokumentation steht noch aus, aber in der Zwischenzeit sind die für den Wechsel von 1.x auf 2.0 erforderlichen Änderungen im Diff zusammengefasst, der zum Aktualisieren der README-Datei erforderlich ist
iCalendar ist eine Ruby-Bibliothek für den Umgang mit iCalendar-Dateien im durch RFC-5545 definierten iCalendar-Format.
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'}
Manchmal ist es uns egal, ob der Beginn oder das Ende eines Ereignisses Date
oder DateTime
Objekte sind. Hierfür können wir DateOrDateTime.new(value)
verwenden. Wenn Sie .call
für die zurückgegebene DateOrDateTime
aufrufen, wird sofort das zugrunde liegende Date
oder DateTime
Objekt zurückgegeben.
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
Für Clients, die eine mit einem Ereignis verknüpfte URL analysieren und anzeigen können, ist es möglich, eine zuzuweisen.
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
Durch Aufrufen der Methode event.alarm
wird ein Alarm erstellt, falls keiner vorhanden ist. Um zu überprüfen, ob ein Ereignis einen Alarm hat, verwenden Sie has_alarm?
Verfahren.
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 bietet einige grundlegende Unterstützung für die Erstellung von VTIMEZONE-Blöcken aus Zeitzoneninformationen, die aus tzinfo
abgerufen werden. Um die Vorteile nutzen zu können, müssen Sie tzinfo
Unterstützung manuell anfordern.
iCalendar wurde getestet und funktioniert mit tzinfo
-Versionen 0.3, 1.x und 2.x. Abhängig von Ihrer Version von tzinfo
und möglicherweise Ihrem Betriebssystem ist möglicherweise auch das Gem tzinfo-data
erforderlich.
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 } "
Sie können auch direkt eine Parser
Instanz erstellen, um eine strikte Analyse zu ermöglichen:
# 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 } "
In Web-Apps und anderen interaktiven Anwendungen müssen Sie häufig nach Elementen in einem Kalender suchen, um Änderungen vorzunehmen oder Details abzurufen. Jetzt können Sie alles anhand der eindeutigen ID finden, die automatisch allen Komponenten zugeordnet wird.
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 )
Sehen Sie sich die Unit-Tests an, um Beispiele für die meisten Dinge zu finden, die Sie tun möchten. Bitte senden Sie mir jedoch Beispielcode oder teilen Sie mir mit, was fehlt.
Die neueste Release-Version dieser Bibliothek finden Sie unter
Es dreht sich alles um Rubygems:
$ gem install icalendar
So führen Sie die Tests aus:
$ bundle install
$ rake spec
Diese Bibliothek wird unter derselben Lizenz wie Ruby selbst veröffentlicht.
Bitte reichen Sie Pull-Anfragen aus einem neu erstellten Themenzweig ein und schließen Sie Tests für alle Fehler und Funktionen ein.
Als Mitwirkende und Betreuer dieses Projekts verpflichten wir uns, alle Menschen zu respektieren, die durch das Melden von Problemen, das Posten von Funktionsanfragen, das Aktualisieren der Dokumentation, das Einreichen von Pull-Requests oder Patches und andere Aktivitäten einen Beitrag leisten.
Wir sind bestrebt, die Teilnahme an diesem Projekt für alle zu einem belästigungsfreien Erlebnis zu machen, unabhängig von Erfahrungsgrad, Geschlecht, Geschlechtsidentität und -ausdruck, sexueller Orientierung, Behinderung, persönlichem Aussehen, Körpergröße, Rasse, ethnischer Zugehörigkeit, Alter oder Religion.
Beispiele für inakzeptables Verhalten von Teilnehmern sind die Verwendung sexueller Sprache oder Bilder, abfällige Kommentare oder persönliche Angriffe, Trolling, öffentliche oder private Belästigung, Beleidigungen oder anderes unprofessionelles Verhalten.
Projektbetreuer haben das Recht und die Verantwortung, Kommentare, Commits, Code, Wiki-Änderungen, Probleme und andere Beiträge, die nicht mit diesem Verhaltenskodex übereinstimmen, zu entfernen, zu bearbeiten oder abzulehnen. Projektbetreuer, die den Verhaltenskodex nicht befolgen, können aus dem Projektteam entfernt werden.
Dieser Verhaltenskodex gilt sowohl innerhalb von Projekträumen als auch im öffentlichen Raum, wenn eine Einzelperson das Projekt oder seine Gemeinschaft vertritt.
Fälle von missbräuchlichem, belästigendem oder anderweitig inakzeptablem Verhalten können gemeldet werden, indem Sie ein Problem eröffnen oder einen oder mehrere Projektbetreuer kontaktieren.
Dieser Verhaltenskodex basiert auf dem Contributor Covenant, Version 1.1.0, verfügbar unter http://contributor-covenant.org/version/1/1/0/.