Skip to content

An RFC 5545 compatible parser and serializer for iCalendar files

License

Notifications You must be signed in to change notification settings

jonathanballs/magical

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Magical

Hex.pm Version Docs Coverage Status

Magical is a RFC 5545 compatible parser and serializer for iCalendar files. It parses the file intelligently by converting values into native Elixir types and resolving time zones automatically.

Magical is designed to comply with Postel's law - which means that it is lenient in what it accepts and strict in what it produces. It accepts and supports the more common non-standard extensions to iCalendar such as X-WR-TIMEZONE, X-WR-CALNAME or X-WR-DESC and will gracefully handle poor character escaping and other idiosyncrasies found in real world ICS files. Internally it uses NimbleParsec to ensure robust parsing of escaped strings. It has been tested against a variety of edge cases and noncompliant ics files. The iCalendar files that it produces are tested against both the iCalendar spec as well as real calendar software.

Magical was built for a side project called Calapi which provides an API for managing your personal calendars and events.

Installation

Just add magical to your list of dependencies in mix.exs:

def deps do
  [
    {:magical, "~> 1.0.1"}
  ]
end

Quickstart

"test.ics"
|> File.read!()
|> Magical.from_ics()
{:ok,
 %Magical.Calendar{
   prodid: "//Magical//Booking//EN",
   version: "2.0",
   time_zone: "Europe/London",
   name: nil,
   description: nil,
   events: [
     %Magical.Event{
       uid: "6529327f4eabe",
       dtstamp: ~U[2023-10-13 12:05:19Z],
       summary: "Booking at The King's Arms",
       description: "Your booking is confirmed for 6 people at 2 o'clock",
       location: "251 Tooley Street, London, SE1 2JX",
       dtstart: #DateTime<2023-10-13 19:00:00+01:00 BST Europe/London>,
       dtend: #DateTime<2023-10-13 21:00:00+01:00 BST Europe/London>,
       class: "PUBLIC",
       created: nil,
       geo: "51.501568;-0.075906",
       last_modified: nil,
       organizer: nil,
       priority: nil,
       seq: nil,
       status: nil,
       transp: "OPAQUE",
       url: nil,
       recurid: nil,
       rrule: nil,
       attach: nil,
       attendee: nil,
       categories: nil,
       comment: nil,
       contact: nil,
       exdate: nil,
       rstatus: nil,
       related: nil,
       resources: nil,
       rdate: nil,
       x_prop: nil,
       iana_prop: nil
     }
   ]
 }}

About

An RFC 5545 compatible parser and serializer for iCalendar files

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages