summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2013-01-10 13:57:37 +0100
committerNicolas Goaziou <n.goaziou@gmail.com>2013-01-10 14:02:19 +0100
commitb68103a34430819b16c74a54f9bb62978b209748 (patch)
tree006264d094bfb01136f5db41aa1f49094853f46a
parentf8f548907100d90ceb9ce359806d401024f52165 (diff)
downloadorg-mode-b68103a34430819b16c74a54f9bb62978b209748.tar.gz
org-element: Correctly interpret timestamps ranges with repeaters
* lisp/org-element.el (org-element-timestamp-interpreter): Interpret timestamps ranges with repeaters. * testing/lisp/test-org-element.el: Add test.
-rw-r--r--lisp/org-element.el70
-rw-r--r--testing/lisp/test-org-element.el13
2 files changed, 48 insertions, 35 deletions
diff --git a/lisp/org-element.el b/lisp/org-element.el
index b7bb487..6f3622b 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -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))
diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el
index b8c012c..8c6acda 100644
--- a/testing/lisp/test-org-element.el
+++ b/testing/lisp/test-org-element.el
@@ -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 ()