Function: org-element-timestamp-interpreter

org-element-timestamp-interpreter is a byte-compiled function defined in org-element.el.gz.

Signature

(org-element-timestamp-interpreter TIMESTAMP _)

Documentation

Interpret TIMESTAMP object as Org syntax.

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-element.el.gz
(defun org-element-timestamp-interpreter (timestamp _)
  "Interpret TIMESTAMP object as Org syntax."
  (let((type (org-element-property :type timestamp)))
    (let ((day-start (org-element-property :day-start timestamp))
          (month-start (org-element-property :month-start timestamp))
          (year-start (org-element-property :year-start timestamp)))
      ;; Return nil when start date is not available.  Could also
      ;; throw an error, but the current behavior is historical.
      (when (or (and day-start month-start year-start)
                (eq type 'diary))
        (let* ((repeat-string
                (concat
                 (pcase (org-element-property :repeater-type timestamp)
                   (`cumulate "+") (`catch-up "++") (`restart ".+"))
                 (let ((val (org-element-property :repeater-value timestamp)))
                   (and val (number-to-string val)))
                 (pcase (org-element-property :repeater-unit timestamp)
                   (`hour "h") (`day "d") (`week "w") (`month "m") (`year "y"))
                 (when-let ((repeater-deadline-value
                             (org-element-property :repeater-deadline-value timestamp))
                            (repeater-deadline-unit
                             (org-element-property :repeater-deadline-unit timestamp)))
                   (concat
                    "/"
                    (number-to-string repeater-deadline-value)
                    (pcase repeater-deadline-unit
                      (`hour "h") (`day "d") (`week "w") (`month "m") (`year "y"))))))
               (range-type (org-element-property :range-type timestamp))
               (warning-string
                (concat
                 (pcase (org-element-property :warning-type timestamp)
                   (`first "--") (`all "-"))
                 (let ((val (org-element-property :warning-value timestamp)))
                   (and val (number-to-string val)))
                 (pcase (org-element-property :warning-unit timestamp)
                   (`hour "h") (`day "d") (`week "w") (`month "m") (`year "y"))))
               (hour-start (org-element-property :hour-start timestamp))
               (minute-start (org-element-property :minute-start timestamp))
               (brackets
                (if (member
                     type
                     '(inactive inactive-range))
                    (cons "[" "]")
                  ;; diary as well
                  (cons "<" ">")))
               (timestamp-end
                (concat
                 (and (org-string-nw-p repeat-string) (concat " " repeat-string))
                 (and (org-string-nw-p warning-string) (concat " " warning-string))
                 (cdr brackets))))
          (concat
           ;; Opening bracket: [ or <
           (car brackets)
           ;; Starting date/time: YYYY-MM-DD DAY[ HH:MM]
           (if (eq type 'diary)
               (concat
                "%%"
                (org-element-property :diary-sexp timestamp)
                (when (and minute-start hour-start)
                  (format " %02d:%02d" hour-start minute-start)))
             (format-time-string
              ;; `org-time-stamp-formats'.
	      (org-time-stamp-format
               ;; Ignore time unless both HH:MM are available.
               ;; Ignore means (car org-timestamp-formats).
               (and minute-start hour-start)
               'no-brackets)
	      (org-encode-time
	       0 (or minute-start 0) (or hour-start 0)
	       day-start month-start year-start)))
           ;; Range: -HH:MM or TIMESTAMP-END--[YYYY-MM-DD DAY HH:MM]
           (let ((hour-end (org-element-property :hour-end timestamp))
                 (minute-end (org-element-property :minute-end timestamp)))
             (pcase type
               ((or `active `inactive)
                ;; `org-element-timestamp-parser' uses this type
                ;; when no time/date range is provided.  So,
                ;; should normally return nil in this clause.
                (pcase range-type
                  (`nil
                   ;; `org-element-timestamp-parser' assigns end
                   ;; times for `active'/`inactive' TYPE if start
                   ;; time is not nil.  But manually built
                   ;; timestamps may not contain end times, so
                   ;; check for end times anyway.
                   (when (and hour-start hour-end minute-start minute-end
			      (or (/= hour-start hour-end)
				  (/= minute-start minute-end)))
                     ;; Could also throw an error.  Return range
                     ;; timestamp nevertheless to preserve
                     ;; historical behavior.
                     (format "-%02d:%02d" hour-end minute-end)))
                  ((or `timerange `daterange)
                   (error "`:range-type' must be `nil' for `active'/`inactive' type"))))
               ;; Range must be present.
               ((or `active-range `inactive-range
                    (and `diary (guard (eq 'timerange range-type))))
                (pcase range-type
                  ;; End time: -HH:MM.
                  ;; Fall back to start time if end time is not defined (arbitrary historical choice).
                  ;; Error will be thrown if both end and begin time is not defined.
                  (`timerange (format "-%02d:%02d" (or hour-end hour-start) (or minute-end minute-start)))
                  ;; End date: TIMESTAMP-END--[YYYY-MM-DD DAY HH:MM
                  ((or `daterange
                       ;; Should never happen in the output of `org-element-timestamp-parser'.
                       ;; Treat as an equivalent of `daterange' arbitrarily.
                       `nil)
                   (concat
                    ;; repeater + warning + closing > or ]
                    ;; This info is duplicated in date ranges.
                    timestamp-end
                    "--" (car brackets)
                    (format-time-string
                     ;; `org-time-stamp-formats'.
                     (org-time-stamp-format
                      ;; Ignore time unless both HH:MM are available.
                      ;; Ignore means (car org-timestamp-formats).
                      (and minute-end hour-end)
                      'no-brackets)
                     (org-encode-time
                      ;; Closing HH:MM missing is a valid scenario.
                      0 (or minute-end 0) (or hour-end 0)
                      ;; YEAR/MONTH/DAY-END will always be present
                      ;; for `daterange' range-type, as parsed by
                      ;; `org-element-timestamp-parser'.
                      ;; For manually constructed timestamp
                      ;; object, arbitrarily fall back to starting
                      ;; date.
                      (or (org-element-property :day-end timestamp) day-start)
                      (or (org-element-property :month-end timestamp) month-start)
                      (or (org-element-property :year-end timestamp) year-start)))))))))
           ;; repeater + warning + closing > or ]
           ;; This info is duplicated in date ranges.
           timestamp-end))))))