iCalendar
iCalendar je standard (RFC 5545) pro výměnu kalendářových dat. Je též znám pod zkratkou iCal, což je též jméno kalendářového programu firmy Apple, který je jedním z programů, který tento formát využívá. Tento formát též podporují Mozilla Sunbird, Novell Evolution, Google Calendar, Microsoft Outlook či třeba Windows Calendar.
Standard iCalendar vznikl kvůli potřebě poskytovat otevřenou výměnu kalendářních a plánovacích informací (úkolů a schůzek mezi uživateli) v rámci internetu. Byl vydán komisí IETF v listopadu roku 1998 (RFC 2445) a jeho podoba byla založena na rané práci specifikace vCalendar. V roce 2009 byl vydán update standardu (RFC 5545). iCalendar byl vyvinut pro rozšíření internetové pošty MIME, ale standard je navržen tak, aby byl nezávislý na přenášeném protokolu. Proto může být sdílen i pomocí protokolů WebDAV nebo SyncML.
Jednoduché webové servery (poskytující pouze protokol HTTP) jsou často používány ke zveřejňování informací o individuálních plánech událostí, akcí a osobním pracovním vytížení. Pro zobrazení těchto informací v HTML (XHTML) lze použít například mikroformát hCalendar, který slouží k přesné interpretaci dat iCalendar do podoby HTML kódu.
Základní specifikace
Formát iCalendar byl navržen skupinou Calendaring and Scheduling Working Group (kterou založil pan Anik Ganguly z Open Text Corporation) ze sdružení Internet Engineering Task Force (zkratka IETF, česky „Komise techniky Internetu“) a autory jsou pánové Frank Dawson z Lotus Development Corporation a Derik Stenerson z Microsoft Corporation. Je založen na starším formátu vCalendar, jehož průmyslovou specifikaci vytvořili v ICM (Internet Mail Consortium)
Soubor iCalendar má příponu ics a data v něm jsou tvořena prostým textem (ASCII). Soubor s příponou ifb obsahuje informace o volném anebo obsazeném čase. Délka každého řádku v souboru může být maximálně 75 bytů (ne znaků) a je ukončen znakem CRLF (hex: 0D0A). Pokud je řádek delší, musí se pokračovat na novém řádku odsazeném mezerou (hex: 20) nebo tabulátorem (hex: 09). Při zalomení řádku v textu se používá sekvence „\n“ (hex: 5C6E). Z mezinárodních důvodů je doporučeno soubor ukládat ve formátu UTF-8.
Objekt kalendáře
Všechna data v souboru jsou umístěna v objektu kalendáře (Calendaring Core Object), což je kolekce informací o kalendáři. První a poslední řádek objektu má striktně danou podobu, jak je naznačeno na následujících řádcích které popisují Den oslav dobytí Bastily jako událost konající se od 14. července 1997 17:00 (UTC) do 15. července 1997 03:59:59 (UTC).
BEGIN:VCALENDAR VERSION:2.0 PRODID:-//hacksw/handcal//NONSGML v1.0//EN BEGIN:VEVENT DTSTART:19970714T170000Z DTEND:19970715T035959Z SUMMARY:Bastille Day Party END:VEVENT END:VCALENDAR
První řádek datového souboru musí být: BEGIN:VCALENDAR, a poslední řádek END:VCALENDAR, obsah souboru mezi těmito dvěma řádky se nazývá icalbody. Tělo objektu kalendáře (icalbody) se skládá z popisu jeho vlastností a alespoň jedné komponenty. Kalendářní vlastnosti jsou atributy, které se vztahují na objekt kalendáře jako celku. Jména i hodnoty těchto vlastností jsou case-insensitive. Vlastnosti kalendáře mohou být:
- VERSION – Představuje označení použité verze standardu iCalendar (aktuální je 2.0). Označení verze je povinná vlastnost objektu.
- PRODID – Identifikátor, který by měl být globálně jedinečný. Objekt kalendáře musí tuto vlastnost obsahovat.
- CALSCALE – Vlastnost definuje typ kalendáře. Když vlastnost není uvedena, předpokládá se typ gregoriánského kalendáře.
- METHOD – Pokud je kalendář použit v rozšíření MIME, tak vlastnost METHOD musí mít parametr stejný jako hodnota Content-Type.
Kalendářové komponenty vyjadřují právě nějakou část kalendáře (mohou popisovat například událost, úkol, informace o časovém pásmu, volném nebo obsazeném čase anebo budík). Existuje mnoho různých typů kalendářových komponent popsaných standardem iCalendar, viz následující popis.
Komponenty kalendáře
Komponenta je sbírka vlastností, vyjadřujících konkrétní prvek kalendáře, například událost, úkol, alarm atd. Všechny komponenty začínají písmenem V.
Událost (VEVENT)
Komponenta VEVENT je označení události, která zabírá určitý časový úsek. Musí obsahovat vlastnosti DTSTART a DTEND deklarující začátek a konec události a UID definující identifikátor. Do VEVENT je také dovoleno vložit komponentu VALARM. Výjimkou, kdy událost nemusí obsahovat vlastnost DTEND, jsou opakující se poznámky bez udání přesného času (může být použito např. u výročí). Tyto události mají vlastnost DSTART typu DATE namísto DATE-TIME. Dále VEVENT může obsahovat vlastnosti kategorie, záznam poslední změny, souhrn a jiné. Příklad definice události:
BEGIN:VEVENT UID:19970901T130000Z-123401@example.com DTSTAMP:19970901T130000Z DTSTART:19970903T163000Z DTEND:19970903T190000Z SUMMARY:Annual Employee Review CLASS:PRIVATE CATEGORIES:BUSINESS,HUMAN RESOURCES END:VEVENT
Úkol (VTODO)
VTODO je komponenta definující úkol, který je potřeba vykonat. Musí obsahovat vlastnost UID pro identifikátor a může obsahovat start i konec události, záznam poslední změny, status, kategorii, souhrn a jiné. Ilustrace komponenty pro úkol:
BEGIN:VTODO UID:20070313T123432Z-456553@example.com DTSTAMP:20070313T123432Z DUE;VALUE=DATE:20070501 SUMMARY:Submit Quebec Income Tax Return for 2006 CLASS:CONFIDENTIAL CATEGORIES:FAMILY, FINANCE STATUS:NEEDS-ACTION END:VTODO
Deník (VJOURNAL)
Komponenta VJOURNAL popisuje záznam do deníku. Jednoduše připojí popisnou textovou poznámku k určitému datu kalendáře, může sloužit například k zaznamenávání seznamu aktivit během dne, nebo k popisu akcí vztahujících se k nějakému úkolu. Komponenta VJOURNAL nezabírá v kalendáři žádný čas ani nemá vliv na stav obsazení času (jako TRANSPARENT položka) V praxi se deníkové záznamy příliš nepoužívají, jsou implementovány například v programu Plum Canary's Chirp, který je používá kombinaci VTODO a VJOURNAL pro správu projektů. Jsou podporovány také programem KOrganizer, který je součástí balíku KDE.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ABC Corporation//NONSGML My Product//EN
BEGIN:VJOURNAL
DTSTAMP:19970324T120000Z
UID:uid5@host1.com
ORGANIZER:MAILTO:jsmith@host.com
STATUS:DRAFT
CLASS:PUBLIC
CATEGORY:Project Report, XYZ, Weekly Meeting
DESCRIPTION:Project xyz Review Meeting Minutes\n
Agenda\n1. Review of project version 1.0 requirements.\n2.
Definition
of project processes.\n3. Review of project schedule.\n
Participants: John Smith, Jane Doe, Jim Dandy\n-It was
decided that the requirements need to be signed off by
product marketing.\n-Project processes were accepted.\n
-Project schedule needs to account for scheduled holidays
and employee vacation time. Check with HR for specific
dates.\n-New schedule will be distributed by Friday.\n-
Next weeks meeting is cancelled. No meeting until 3/23.
END:VJOURNAL
END:VCALENDAR
Volný a obsazený čas (VFREEBUSY)
Komponenta popisuje požadavek na zjištění stavu obsazení v určitém čase, popisuje odpověď na tento dotaz a popisuje také sestavu pro zveřejnění obsazeného času.
Dle normy RFC2445 je popsána takto:
Pro zjištění stavu obsazení času existuje vlastnosti ATTENDEE specifikující uživatele kalendáře, jehož stav času je dotazován, ORGANIZER specifikuje který uživatel kalendáře se ptá a vlastnosti DTSTART a DTEND udávají časové rozmezí v němž je stav zjišťován. Vlastnosti UID a DTSTAMP slouží k určení pořadí dotazů v případě, že jich žádost obsahuje více.
Odpověď na dotaz stavu času obsahuje opět vlastnosti ATTENDEE, která specifikuje odpovídajícího uživatele (vlastník zjišťovaného kalendáře) a ORGANIZER v tomto případě značí původního tazatele – nyní tedy příjemce odpovědi. Vlastnost FREEBUSY určuje stav dotazovaného časového úseku. A opět vlastnosti UID a DTSTAMP určující pořadí ve více dotazech.
K publikování stavu času slouží vlastnosti ORGANIZER, jež i zde značí vlastníka (publikovaného) kalendáře, DTSTART a DTEND jsou časové údaje ohraničující oblast kalendáře označenou jako obsazený čas. Vlastnost FREEBUSY obsahuje popis obsazeného času a DTSTAMP informaci o tom, kdy byl objekt v kalendáři vytvořen.
Příklad publikovaného kalendáře:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//RDU Software//NONSGML HandCal//EN
BEGIN:VFREEBUSY
ORGANIZER:MAILTO:jsmith@host.com
DTSTART:19980313T141711Z
DTEND:19980410T141711Z
FREEBUSY:19980314T233000Z/19980315T003000Z
FREEBUSY:19980316T153000Z/19980316T163000Z
FREEBUSY:19980318T030000Z/19980318T040000Z
URL:http://www.host.com/calendar/busytime/jsmith.ifb
END:VFREEBUSY
END:VCALENDAR
Objekt iCalendar může být umístěn na serveru v souboru s příponou ifb.
Alarm (VALARM)
Komponenta VALARM popisuje alarm. Používá se pro událost VEVENT nebo úkol VTODO. Musí obsahovat vlastnosti ACTION, která popisuje reakci při spuštění alarmu a TRIGGER, který popisuje, kdy bude alarm spuštěn. Alarm se může také opakovat pomocí nastavení vlastnosti REPEAT, která udává počet opakování. S vlastností REPEAT musí být přítomna i DURATION udávající dobu, do které se bude alarm opakovat. Ilustrace definice alarmu:
BEGIN:VALARM TRIGGER:-PT30M REPEAT:2 DURATION:PT15M ACTION:DISPLAY DESCRIPTION:Breakfast meeting with executive\n team at 8:30 AM EST. END:VALARM
Časová zóna (VTIMEZONE)
VTIMEZONE komponenta popisuje časovou zónu kalendáře. Definuje standardní a zimní čas pro dané časové pásmo a časový interval. VTIMEZONE nesmí být vnořený do žádné jiné komponenty, ale musí obsahovat TZID a také alespoň jednu definici času STANDARD nebo DAYLIGHT. Tyto definice musí zahrnovat DTSTART TZOFFSETFROM a TZOFFSETTO vlastnosti. V jenom kalendáři může být více VTIMEZONE, ale pak musí mít unikátní TZID. Tato možnost je nezbytná například pro letecké společnosti, kdy letadla startují v jedné zóně a přistávají v jiné. Příklad definice časové zóny:
BEGIN:VTIMEZONE TZID:Fictitious LAST-MODIFIED:19870101T000000Z BEGIN:STANDARD DTSTART:19671029T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:EST END:STANDARD BEGIN:DAYLIGHT DTSTART:19870405T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:EDT END:DAYLIGHT END:VTIMEZONE
Distribuované aktualizace
Vlastnost UID se používá k usnadnění publikování změn v případě, že dojde ke změně plánování události v kalendáři. Při prvním vytvoření události je jí přiřazen globální unikátní identifikátor. Pokud je později publikována událost se stejným identifikátorem, je původní událost touto nahrazena. Identifikátor 5. srazu skupiny 131 2. semestru hypotetické VŠ může vypadat například Y2007S2C131M5@bigcitycollege.org.
Výměna dat iCalendar
Jak již bylo uvedeno výše, formát iCalendar je určen k popisu kalendářových dat a neobsahuje tedy popis jak s těmito daty pracovat. Proto je třeba použít nějaký jiný protokol pro práci s těmito daty. Těchto protokolů existuje několik, jedním z nich je například CalDAV (RFC 4791) nebo také iTIP (iCalendar Transport-Independent Interoperability) (RFC 2446) definující protokol pro výměnu dat kalendáře mezi uživateli kalendáře (Calendar Users (CUs)) – kdokoli zahájí libovolnou výměnu dat, stává se Organizátorem (Organizer). Tento standard obsahuje metody: PUBLISH, REQUEST, REPLY, ADD, CANCEL, REFRESH, COUNTER a DECLINE-COUNTER.
Dalším příkladem protokolu pro práci s daty iCal je IMIP (iCalendar Message-based Interoperability Protocol) (RFC 2447), který stanoví metody pro implementaci protokolu iTIP se standardním internetovým poštovním transportním protokolem (email).
Guide to Internet Calendaring (RFC 3283) popisuje vztah mezi formátem iCalendar a různými jinými standardy (současnými i budoucími).