summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Guerry <bzg@altern.org>2011-07-25 00:55:04 +0200
committerBastien Guerry <bzg@altern.org>2011-07-25 00:55:04 +0200
commit829e226536ab65cc737b387f3d6df4e8ff2fdf03 (patch)
tree197d68b3f55816a7795e4545b0e76286f65c9677
parentcb973614bd3fb106acf69d4514e09a783bcaf0a2 (diff)
downloadorg-mode-829e226536ab65cc737b387f3d6df4e8ff2fdf03.tar.gz
org-table: fix another bug in duration computation.
* org-table.el (org-table-eval-formula): Fix bug when a formula "range" is just one cell. (org-table-time-string-to-seconds): don't check whether we manipulate a string.
-rw-r--r--doc/org.texi7
-rw-r--r--lisp/org-table.el21
2 files changed, 15 insertions, 13 deletions
diff --git a/doc/org.texi b/doc/org.texi
index 79a4c9c..87f73a8 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -2581,9 +2581,10 @@ formulas or Elisp formulas:
@end group
@end example
-Values must be of the form @code{[HH:MM[:SS]}, where seconds are optional.
-The resulting duration will always be displayed as @code{[HH:MM:SS}. Note
-that negative values can be manipulated as well.
+Duration values are of the form @code{[HH:MM[:SS]}, where seconds are
+optional. The computed duration will be displayed as @code{[HH:MM:SS}.
+Negative values can be manipulated as well, and integers are considered
+as seconds in addition and subtraction.
@node Field and range formulas, Column formulas, Durations and time values, The spreadsheet
@subsection Field and range formulas
diff --git a/lisp/org-table.el b/lisp/org-table.el
index 5797ae0..4d35ff9 100644
--- a/lisp/org-table.el
+++ b/lisp/org-table.el
@@ -2391,7 +2391,7 @@ not overwrite the stored one."
(modes (copy-sequence org-calc-default-modes))
(numbers nil) ; was a variable, now fixed default
(keep-empty nil)
- n form form0 formrpl bw fmt x ev orig c lispp literal duration)
+ n form form0 formrpl formrg bw fmt x ev orig c lispp literal duration)
;; Parse the format string. Since we have a lot of modes, this is
;; a lot of work. However, I think calc still uses most of the time.
(if (string-match ";" formula)
@@ -2477,15 +2477,17 @@ not overwrite the stored one."
;; Insert complex ranges
(while (and (string-match org-table-range-regexp form)
(> (length (match-string 0 form)) 1))
+ (setq formrg (save-match-data
+ (org-table-get-range (match-string 0 form) nil n0)))
(setq formrpl
(save-match-data
(org-table-make-reference
;; possibly handle durations
(if duration
- (mapcar (lambda(x)
- (org-table-time-string-to-seconds x))
- (org-table-get-range (match-string 0 form) nil n0))
- (org-table-get-range (match-string 0 form) nil n0))
+ (if (listp formrg)
+ (mapcar (lambda(x) (org-table-time-string-to-seconds x)) formrg)
+ (org-table-time-string-to-seconds formrg))
+ formrg)
keep-empty numbers lispp)))
(if (not (save-match-data
(string-match (regexp-quote form) formrpl)))
@@ -3212,11 +3214,11 @@ For example: 28 -> AB."
(defun org-table-time-string-to-seconds (s)
"Convert a time string into numerical duration in seconds.
-S must be a string matching either -?HH:MM:SS or -?HH:MM."
+S can be a string matching either -?HH:MM:SS or -?HH:MM.
+If S is a string representing a number, keep this number."
(let (hour min sec res)
(cond
- ((and (stringp s)
- (string-match "\\(-?\\)\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s))
+ ((and (string-match "\\(-?\\)\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s))
(setq minus (< 0 (length (match-string 1 s)))
hour (string-to-number (match-string 2 s))
min (string-to-number (match-string 3 s))
@@ -3224,8 +3226,7 @@ S must be a string matching either -?HH:MM:SS or -?HH:MM."
(if minus
(setq res (- (+ (* hour 3600) (* min 60) sec)))
(setq res (+ (* hour 3600) (* min 60) sec))))
- ((and (stringp s)
- (not (string-match org-ts-regexp-both s))
+ ((and (not (string-match org-ts-regexp-both s))
(string-match "\\(-?\\)\\([0-9]+\\):\\([0-9]+\\)" s))
(setq minus (< 0 (length (match-string 1 s)))
hour (string-to-number (match-string 2 s))