|
@@ -2431,21 +2431,22 @@ not overwrite the stored one."
|
|
|
(setq formula (org-table-formula-substitute-names formula)))
|
|
|
(setq orig (or (get-text-property 1 :orig-formula formula) "?"))
|
|
|
(while (> ndown 0)
|
|
|
- (setq fields
|
|
|
- (mapcar (lambda (cell)
|
|
|
- (let ((duration (org-table-time-string-to-seconds cell)))
|
|
|
- (if duration (number-to-string duration) cell)))
|
|
|
- (org-split-string
|
|
|
- (org-no-properties
|
|
|
- (buffer-substring (point-at-bol) (point-at-eol)))
|
|
|
- " *| *")))
|
|
|
+ (setq fields (org-split-string
|
|
|
+ (org-no-properties
|
|
|
+ (buffer-substring (point-at-bol) (point-at-eol)))
|
|
|
+ " *| *"))
|
|
|
+ ;; replace fields with duration values if relevant
|
|
|
+ (if duration
|
|
|
+ (setq fields
|
|
|
+ (mapcar (lambda (x) (org-table-time-string-to-seconds x))
|
|
|
+ fields)))
|
|
|
(if (eq numbers t)
|
|
|
(setq fields (mapcar
|
|
|
(lambda (x) (number-to-string (string-to-number x)))
|
|
|
fields)))
|
|
|
(setq ndown (1- ndown))
|
|
|
(setq form (copy-sequence formula)
|
|
|
- lispp (and (> (length form) 2)(equal (substring form 0 2) "'(")))
|
|
|
+ lispp (and (> (length form) 2) (equal (substring form 0 2) "'(")))
|
|
|
(if (and lispp literal) (setq lispp 'literal))
|
|
|
|
|
|
;; Insert row and column number of formula result field
|
|
@@ -2479,7 +2480,12 @@ not overwrite the stored one."
|
|
|
(setq formrpl
|
|
|
(save-match-data
|
|
|
(org-table-make-reference
|
|
|
- (org-table-get-range (match-string 0 form) nil n0)
|
|
|
+ ;; 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))
|
|
|
keep-empty numbers lispp)))
|
|
|
(if (not (save-match-data
|
|
|
(string-match (regexp-quote form) formrpl)))
|
|
@@ -2518,8 +2524,7 @@ not overwrite the stored one."
|
|
|
(string-to-number ev)) ev))
|
|
|
(or (fboundp 'calc-eval)
|
|
|
(error "Calc does not seem to be installed, and is needed to evaluate the formula"))
|
|
|
- (setq ev (calc-eval (cons form modes)
|
|
|
- (if numbers 'num))
|
|
|
+ (setq ev (calc-eval (cons form modes) (if numbers 'num))
|
|
|
ev (if duration (org-table-time-seconds-to-string
|
|
|
(string-to-number ev)) ev)))
|
|
|
|
|
@@ -3208,25 +3213,28 @@ 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."
|
|
|
- (cond
|
|
|
- ((and (stringp s)
|
|
|
- (string-match "\\(-?\\)\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)" s))
|
|
|
- (let ((minus (< 0 (length (match-string 1 s))))
|
|
|
- (hour (string-to-number (match-string 2 s)))
|
|
|
- (min (string-to-number (match-string 3 s)))
|
|
|
- (sec (string-to-number (match-string 4 s))))
|
|
|
+ (let (hour min sec res)
|
|
|
+ (cond
|
|
|
+ ((and (stringp s)
|
|
|
+ (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))
|
|
|
+ sec (string-to-number (match-string 4 s)))
|
|
|
(if minus
|
|
|
- (- (+ (* hour 3600) (* min 60) sec))
|
|
|
- (+ (* hour 3600) (* min 60) sec))))
|
|
|
- ((and (stringp s)
|
|
|
- (not (string-match org-ts-regexp-both s))
|
|
|
- (string-match "\\(-?\\)\\([0-9]+\\):\\([0-9]+\\)" s))
|
|
|
- (let ((minus (< 0 (length (match-string 1 s))))
|
|
|
- (hour (string-to-number (match-string 2 s)))
|
|
|
- (min (string-to-number (match-string 3 s))))
|
|
|
+ (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))
|
|
|
+ (string-match "\\(-?\\)\\([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)))
|
|
|
(if minus
|
|
|
- (- (+ (* hour 3600) (* min 60)))
|
|
|
- (+ (* hour 3600) (* min 60)))))))
|
|
|
+ (setq res (- (+ (* hour 3600) (* min 60))))
|
|
|
+ (setq res (+ (* hour 3600) (* min 60)))))
|
|
|
+ (t (setq res (string-to-number s))))
|
|
|
+ (number-to-string res)))
|
|
|
|
|
|
(defun org-table-time-seconds-to-string (secs)
|
|
|
"Convert a number of seconds to a time string."
|