Function: org-dblock-write:clocktable
org-dblock-write:clocktable is an autoloaded and byte-compiled
function defined in org-clock.el.gz.
Signature
(org-dblock-write:clocktable PARAMS)
Documentation
Write the standard clocktable.
Source Code
;; Defined in /usr/src/emacs/lisp/org/org-clock.el.gz
;;;###autoload
(defun org-dblock-write:clocktable (params)
"Write the standard clocktable."
(setq params (org-combine-plists org-clocktable-defaults params))
(catch 'exit
(let* ((scope (plist-get params :scope))
(base-buffer (org-base-buffer (current-buffer)))
(files (pcase scope
(`agenda
(org-agenda-files t))
(`agenda-with-archives
(org-add-archive-files (org-agenda-files t)))
(`file-with-archives
(let ((base-file (buffer-file-name base-buffer)))
(and base-file
(org-add-archive-files (list base-file)))))
((or `nil `file `subtree `tree
(and (pred symbolp)
(guard (string-match "\\`tree\\([0-9]+\\)\\'"
(symbol-name scope)))))
base-buffer)
((pred functionp) (funcall scope))
((pred consp) scope)
(_ (user-error "Unknown scope: %S" scope))))
(block (plist-get params :block))
(ts (plist-get params :tstart))
(te (plist-get params :tend))
(ws (plist-get params :wstart))
(ms (plist-get params :mstart))
(step (plist-get params :step))
(hide-files (plist-get params :hidefiles))
(formatter (or (plist-get params :formatter)
org-clock-clocktable-formatter
'org-clocktable-write-default))
cc)
;; Check if we need to do steps
(when block
;; Get the range text for the header
(setq cc (org-clock-special-range block nil t ws ms)
ts (car cc)
te (nth 1 cc)))
(when step
;; Write many tables, in steps
(unless (or block (and ts te))
(user-error "Clocktable `:step' can only be used with `:block' or `:tstart', `:tend'"))
(org-clocktable-steps params)
(throw 'exit nil))
(org-agenda-prepare-buffers (if (consp files) files (list files)))
(let ((origin (point))
(tables
(if (consp files)
(mapcar (lambda (file)
(with-current-buffer (find-buffer-visiting file)
(save-excursion
(save-restriction
(org-clock-get-table-data file params)))))
files)
;; Get the right restriction for the scope.
(save-restriction
(cond
((not scope)) ;use the restriction as it is now
((eq scope 'file) (widen))
((eq scope 'subtree) (org-narrow-to-subtree))
((eq scope 'tree)
(while (org-up-heading-safe))
(org-narrow-to-subtree))
((and (symbolp scope)
(string-match "\\`tree\\([0-9]+\\)\\'"
(symbol-name scope)))
(let ((level (string-to-number
(match-string 1 (symbol-name scope)))))
(catch 'exit
(while (org-up-heading-safe)
(looking-at org-outline-regexp)
(when (<= (org-reduced-level (funcall outline-level))
level)
(throw 'exit nil))))
(org-narrow-to-subtree))))
(list (org-clock-get-table-data nil params)))))
(multifile
;; Even though `file-with-archives' can consist of
;; multiple files, we consider this is one extended file
;; instead.
(and (not hide-files)
(consp files)
(not (eq scope 'file-with-archives)))))
(funcall formatter
origin
tables
(org-combine-plists params `(:multifile ,multifile)))))))