···
+
let text_event_data ?tz event =
+
let id = get_id event in
+
let start = get_start event in
+
let end_ = get_end event in
+
let start_date = format_date ?tz start in
+
match is_date event with true -> "" | false -> " " ^ format_time ?tz start
+
let end_date, end_time =
+
match is_date event with
+
match next_day start ~next:end_ with
+
| false -> (" - " ^ format_date ?tz end_, ""))
+
match same_day start end_ with
+
| true -> ("", " - " ^ format_time ?tz end_)
+
| false -> (" - " ^ format_date ?tz end_, " " ^ format_time ?tz end_)
+
match get_summary event with
+
| Some summary when summary <> "" -> summary
+
match get_location event with
+
| Some loc when loc <> "" -> "@" ^ loc
+
let calendar_name = get_calendar_name event in
+
let date_time = start_date ^ start_time ^ end_date ^ end_time in
+
(id, calendar_name, date_time, summary, location)
let format_event ?(format = `Text) ?tz event =
let start = get_start event in
let end_ = get_end event in
+
let id, calendar_name, date_time, summary, location =
+
text_event_data ?tz event
+
Printf.sprintf "%s\t%s\t%s\t%s\t%s" id calendar_name date_time summary
let format_opt label f opt =
Option.map (fun x -> Printf.sprintf "%s: %s\n" label (f x)) opt
···
(String.escaped id) (String.escaped summary) start_date start_time
end_str location description calendar
+
let format_events_with_dynamic_columns ?tz events =
+
let event_data = List.map (text_event_data ?tz) events in
+
(* Calculate max width for each column *)
+
(fun acc (id, _, _, _, _) -> max acc (String.length id))
+
(fun acc (_, cal, _, _, _) -> max acc (String.length cal))
+
(fun acc (_, _, date, _, _) -> max acc (String.length date))
+
(* Format each event with calculated widths *)
+
(fun (id, cal, date, summary, location) ->
+
Printf.sprintf "%-*s %-*s %-*s %s%s" max_id_width id max_cal_width
+
cal max_date_width date summary
+
(if location <> "" then " " ^ location else ""))
+
String.concat "\n" formatted_events
let format_events ?(format = `Text) ?tz events =
···
(List.map (fun e -> format_event ~format:`Sexp ?tz e) events)
+
| `Text -> format_events_with_dynamic_columns ?tz events
String.concat "\n" (List.map (fun e -> format_event ~format ?tz e) events)