Function: icalendar-index-get

icalendar-index-get is a byte-compiled function defined in icalendar-parser.el.gz.

Signature

(icalendar-index-get INDEX &rest ARGS &key DATE UID TZID)

Documentation

Get an iCalendar component from INDEX by date, UID, or TZID.

INDEX should be a reference to a parse tree index as returned by icalendar-parse-and-index, which see. The index can be queried by:

:uid UID (string, see icalendar-uid) - returns the component with that
  UID.

:tzid TZID (string, see icalendar-tzid and icalendar-tzidparam) -
  returns the icalendar-vtimezone component with that TZID.

:date DT (an icalendar-date, i.e. a list (M D Y)) - returns a list of
  the components occurring (or recurring) on that date.

Only one keyword argument can be queried at a time.

Other relevant functions are documented in the icalendar group.

Shortdoc

;; icalendar
(icalendar-index-get index :uid "some-event-UID")
    e.g. => (icalendar-vevent ...)
  (icalendar-index-get index :date '(5 28 2026))
    e.g. => ((icalendar-vevent ...) ...)
  (icalendar-index-get index :tzid "Europe/Vienna")
    e.g. => (icalendar-vtimezone ...)

Source Code

;; Defined in /usr/src/emacs/lisp/calendar/icalendar-parser.el.gz
(cl-defun ical:index-get (index &rest args &key date uid tzid)
  "Get an iCalendar component from INDEX by date, UID, or TZID.

INDEX should be a reference to a parse tree index as returned by
`icalendar-parse-and-index', which see.  The index can be queried by:

:uid UID (string, see `icalendar-uid') - returns the component with that
  UID.

:tzid TZID (string, see `icalendar-tzid' and `icalendar-tzidparam') -
  returns the `icalendar-vtimezone' component with that TZID.

:date DT (an `icalendar-date', i.e. a list (M D Y)) - returns a list of
  the components occurring (or recurring) on that date.

Only one keyword argument can be queried at a time."
  (require 'icalendar-recur) ; avoid circular imports
  (require 'icalendar-utils) ;

  (declare-function icr:find-interval "icalendar-recur")
  (declare-function icr:recurrences-in-interval "icalendar-recur")
  (declare-function ical:date/time-in-period-p "icalendar-utils")
  (declare-function ical:date/time<= "icalendar-utils")
  (declare-function ical:date/time< "icalendar-utils")
  (declare-function ical:date/time-add-duration "icalendar-utils")

  (when (length> args 2)
    (error "Only one keyword argument can be queried"))
  (cond (uid (gethash uid (plist-get index :byuid)))
        (tzid (gethash tzid (plist-get index :bytzid)))
        (date
         (let ((computed (gethash date (plist-get index :bydate)))
               (recurring (plist-get index :recurring)))
           (dolist (component recurring)
             (ical:with-component component
                 ((ical:dtstart :first dtstart-node :value dtstart)
                  (ical:rrule :value rrule)
                  (ical:rdate :all rdate-nodes)
                  (ical:duration :value duration))
               (unless (ical:date/time<= date dtstart)
                 (let* ((tz (ical:with-param-of dtstart-node 'ical:tzidparam nil
                              (gethash value (plist-get index :bytzid))))
                        (int (icr:find-interval date dtstart rrule tz))
                        (recs (icr:recurrences-in-interval int component tz)))
                   (catch 'found
                     (dolist (rec recs)
                       (let* ((local-rec (ical:date/time-to-local rec))
                              (end
                               (when duration
                                 (ical:date/time-add-duration local-rec duration)))
                              (rec-dates
                               (if end (ical:dates-until local-rec end t)
                                 (list (ical:date/time-to-date local-rec)))))
                         (when (member date rec-dates)
                           (push component computed)
                           (throw 'found nil))))
                     (dolist (node rdate-nodes)
                       ;; normal RDATE recurrences have already been
                       ;; checked above, but we check whether `date'
                       ;; occurs in any RDATE period values here:
                       (when (eq 'ical:period
                                 (ical:value-type-from-params
                                  (ical:ast-node-children node)))
                         (let* ((tz
                                 (ical:with-param-of node 'ical:tzidparam nil
                                   (gethash value (plist-get index :bytzid)))))
                           (ical:with-property node nil
                             (dolist (period values)
                               (when (ical:date/time-in-period-p date period tz)
                                 (push component computed)
                                 (throw 'found nil))))))))))))
           computed))
        (t (error "At least one of :uid, :tzid, or :date is required"))))