diff options
author | Alban Gruin | 2020-09-12 01:24:22 +0200 |
---|---|---|
committer | Alban Gruin | 2020-09-12 01:39:15 +0200 |
commit | b6506d308a3b3e3bf585d3a5a79f58a766244bf5 (patch) | |
tree | ef49f05a2b44a1b0ede9c6b9e8e9564bb670877d | |
parent | bfcd4b6c5b3f4d0baaec8ef99e79c4c4adcd7d10 (diff) |
ics: split long lines according to the iCalendar specification
Signed-off-by: Alban Gruin <alban at pa1ch dot fr>
-rw-r--r-- | src/ics.ml | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -20,6 +20,19 @@ open CalendarLib let to_date = Printer.Calendar.sprint "%Y%m%dT%H%M%SZ" let current_date () = to_date @@ Calendar.now () +let ics_split_line = + let max_line_length = 73 in + let rec aux accu str = + String.( + let l = length str in + if l > max_line_length then + let b = sub str 0 max_line_length and + e = sub str max_line_length (l - max_line_length) in + aux (accu ^ b ^ "\r\n ") e + else + accu ^ str) in + aux "" + module Event = struct type t = { start: Calendar.t; @@ -32,16 +45,16 @@ module Event = struct {start; stop; summary; location} let to_string date event id = - Printf.sprintf "BEGIN:VEVENT\n\ - UID:%s.%d@ucs.pa1ch.fr\n\ - DTSTART:%s\n\ - DTEND:%s\n\ - DTSTAMP:%s\n\ - SUMMARY:%s\n\ - LOCATION:%s\n\ - END:VEVENT\n" - date id (to_date event.start) (to_date event.stop) - date event.summary event.location + ["BEGIN:VEVENT"; + "UID:" ^ date ^ "." ^ (string_of_int id) ^ "@ucs.pa1ch.fr"; + "DTSTART:" ^ to_date event.start; + "DTEND:" ^ to_date event.stop; + "DTSTAMP:" ^ date; + "SUMMARY:" ^ event.summary; + "LOCATION:" ^ event.location; + "END:VEVENT\n"] + |> List.map ics_split_line + |> String.concat "\n" end type t = Event.t list |