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 | 
