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"))))