org-element: Correctly interpret timestamps ranges with repeaters
authorNicolas Goaziou <n.goaziou@gmail.com>
Thu, 10 Jan 2013 12:57:37 +0000 (13:57 +0100)
committerNicolas Goaziou <n.goaziou@gmail.com>
Thu, 10 Jan 2013 13:02:19 +0000 (14:02 +0100)
* lisp/org-element.el (org-element-timestamp-interpreter): Interpret
  timestamps ranges with repeaters.
* testing/lisp/test-org-element.el: Add test.

lisp/org-element.el
testing/lisp/test-org-element.el

index b7bb487..6f3622b 100644 (file)
@@ -3522,33 +3522,40 @@ CONTENTS is nil."
   ;; Use `:raw-value' if specified.
   (or (org-element-property :raw-value timestamp)
       ;; Otherwise, build timestamp string.
-      (let ((build-ts-string
-            ;; Build an Org timestamp string from TIME.  ACTIVEP is
-            ;; non-nil when time stamp is active.  If WITH-TIME-P is
-            ;; non-nil, add a time part.  HOUR-END and MINUTE-END
-            ;; specify a time range in the timestamp.  REPEAT-STRING
-            ;; is the repeater string, if any.
-            (lambda (time activep
-                     &optional with-time-p hour-end minute-end repeat-string)
-              (let ((ts (format-time-string
-                         (funcall (if with-time-p 'cdr 'car)
-                                  org-time-stamp-formats)
-                         time)))
-                (when (and hour-end minute-end)
-                  (string-match "[012]?[0-9]:[0-5][0-9]" ts)
-                  (setq ts
-                        (replace-match
-                         (format "\\&-%02d:%02d" hour-end minute-end)
-                         nil nil ts)))
-                (unless activep (setq ts (format "[%s]" (substring ts 1 -1))))
-                (when (org-string-nw-p repeat-string)
-                  (setq ts (concat (substring ts 0 -1)
-                                   " "
-                                   repeat-string
-                                   (substring ts -1))))
-                ;; Return value.
-                ts)))
-           (type (org-element-property :type timestamp)))
+      (let* ((repeat-string
+             (concat
+              (case (org-element-property :repeater-type timestamp)
+                (cumulate "+") (catch-up "++") (restart ".+"))
+              (let ((val (org-element-property :repeater-value timestamp)))
+                (and val (number-to-string val)))
+              (case (org-element-property :repeater-unit timestamp)
+                (hour "h") (day "d") (week "w") (month "m") (year "y"))))
+            (build-ts-string
+             ;; Build an Org timestamp string from TIME.  ACTIVEP is
+             ;; non-nil when time stamp is active.  If WITH-TIME-P is
+             ;; non-nil, add a time part.  HOUR-END and MINUTE-END
+             ;; specify a time range in the timestamp.  REPEAT-STRING
+             ;; is the repeater string, if any.
+             (lambda (time activep &optional with-time-p hour-end minute-end)
+               (let ((ts (format-time-string
+                          (funcall (if with-time-p 'cdr 'car)
+                                   org-time-stamp-formats)
+                          time)))
+                 (when (and hour-end minute-end)
+                   (string-match "[012]?[0-9]:[0-5][0-9]" ts)
+                   (setq ts
+                         (replace-match
+                          (format "\\&-%02d:%02d" hour-end minute-end)
+                          nil nil ts)))
+                 (unless activep (setq ts (format "[%s]" (substring ts 1 -1))))
+                 (when (org-string-nw-p repeat-string)
+                   (setq ts (concat (substring ts 0 -1)
+                                    " "
+                                    repeat-string
+                                    (substring ts -1))))
+                 ;; Return value.
+                 ts)))
+            (type (org-element-property :type timestamp)))
        (case type
          ((active inactive)
           (let* ((minute-start (org-element-property :minute-start timestamp))
@@ -3569,14 +3576,7 @@ CONTENTS is nil."
              (eq type 'active)
              (and hour-start minute-start)
              (and time-range-p hour-end)
-             (and time-range-p minute-end)
-             (concat
-              (case (org-element-property :repeater-type timestamp)
-                (cumulate "+") (catch-up "++") (restart ".+"))
-              (let ((val (org-element-property :repeater-value timestamp)))
-                (and val (number-to-string val)))
-              (case (org-element-property :repeater-unit timestamp)
-                (hour "h") (day "d") (week "w") (month "m") (year "y"))))))
+             (and time-range-p minute-end))))
          ((active-range inactive-range)
           (let ((minute-start (org-element-property :minute-start timestamp))
                 (minute-end (org-element-property :minute-end timestamp))
index b8c012c..8c6acda 100644 (file)
@@ -2272,6 +2272,19 @@ DEADLINE: <2012-01-01> SCHEDULED: <2012-01-01> CLOSED: [2012-01-01]\n"))))
      '(timestamp
        (:type active :year-start 2012 :month-start 3 :day-start 29
              :repeater-type cumulate :repeater-value 1 :repeater-unit year))
+     nil)))
+  ;; Timestamp range with repeater interval
+  (should (equal (org-test-parse-and-interpret
+                 "<2012-03-29 Thu +1y>--<2012-03-30 Thu +1y>")
+                "<2012-03-29 Thu +1y>--<2012-03-30 Thu +1y>\n"))
+  (should
+   (string-match
+    "<2012-03-29 .* \\+1y>--<2012-03-30 .* \\+1y>"
+    (org-element-timestamp-interpreter
+     '(timestamp
+       (:type active-range :year-start 2012 :month-start 3 :day-start 29
+             :year-end 2012 :month-end 3 :day-end 30 :repeater-type cumulate
+             :repeater-value 1 :repeater-unit year))
      nil))))
 
 (ert-deftest test-org-element/verse-block-interpreter ()