lisp/org-colview.el: Add formatter parameter to colview dynamic block
* lisp/org-colview.el (org-dblock-write:column view): Factor out the existing formatting code to new function `org-columns-dblock-write-default', and honour new dblock parameter :formatter for specifying a different formatting function. (org-columns-dblock-write-default): New function with current formatting code. (org-columns--capture-view): Amend docstring to better explain the format of the data being passed to the formatting function. (org-clock-clocktable-formatter): New option to define a global default formatting function, defaulting to the current behaviour. * testing/lisp/test-org-colview.el (test-org-colview/dblock): New test for formatting function. (test-org-colview/dblock-formatter): New function used in formatting test. * doc/org-manual.org (Capturing column view): Describe new :formatter parameter. * etc/ORG-NEWS (New option ~org-columns-dblock-formatter~): Announce new option. (=colview= dynamic block supports custom formatting function): Describe new custom formatting function feature.
This commit is contained in:
parent
f124b616d9
commit
5a98b4c563
|
@ -6014,6 +6014,13 @@ This dynamic block has the following parameters:
|
||||||
Specify a column attribute (see [[*Column attributes]]) for the dynamic
|
Specify a column attribute (see [[*Column attributes]]) for the dynamic
|
||||||
block.
|
block.
|
||||||
|
|
||||||
|
- =:formatter= ::
|
||||||
|
|
||||||
|
#+cindex: @samp{formatter}, dynamic block parameter
|
||||||
|
#+vindex: org-columns-dblock-formatter
|
||||||
|
A function to format column view data and insert it into the buffer.
|
||||||
|
See the option ~org-columns-dblock-formatter~.
|
||||||
|
|
||||||
The following commands insert or update the dynamic block:
|
The following commands insert or update the dynamic block:
|
||||||
|
|
||||||
- ~org-columns-insert-dblock~ ::
|
- ~org-columns-insert-dblock~ ::
|
||||||
|
|
29
etc/ORG-NEWS
29
etc/ORG-NEWS
|
@ -1027,6 +1027,16 @@ When using =biblatex= to export bibliographies, you can use the format
|
||||||
as specified in the =biblatex= package documentation as
|
as specified in the =biblatex= package documentation as
|
||||||
=key=val,key=val,...=
|
=key=val,key=val,...=
|
||||||
|
|
||||||
|
*** New option ~org-columns-dblock-formatter~
|
||||||
|
|
||||||
|
=colview= dynamic blocks now understand a new ~:formatter~ parameter
|
||||||
|
to use a specific function for formatting and inserting the contents
|
||||||
|
of the dynamic block. This new option can be used to set the global
|
||||||
|
default formatting function that will be used for =colview= dynamic
|
||||||
|
blocks that do not specify any ~:formatter~ parameter. Its default
|
||||||
|
value (the new function ~org-columns-dblock-write-default~) yields the
|
||||||
|
previous (fixed) formatting behaviour.
|
||||||
|
|
||||||
** New features
|
** New features
|
||||||
*** =ob-lua=: Support all types and multiple values in results
|
*** =ob-lua=: Support all types and multiple values in results
|
||||||
|
|
||||||
|
@ -1075,6 +1085,25 @@ Example:
|
||||||
: | PROYECTO EMACS |
|
: | PROYECTO EMACS |
|
||||||
: #+END:
|
: #+END:
|
||||||
|
|
||||||
|
*** =colview= dynamic block supports custom formatting function
|
||||||
|
|
||||||
|
The =colview= dynamic block understands a new ~:formatter~ parameter,
|
||||||
|
which specifies a user-supplied function to format and insert the data
|
||||||
|
in the dynamic block.
|
||||||
|
|
||||||
|
A global default formatting function for =colview= dynamic blocks can
|
||||||
|
be set via the new option ~org-columns-dblock-formatter~ which
|
||||||
|
defaults to the new function ~org-columns-dblock-write-default~, that
|
||||||
|
implements the previous (fixed) formatting behaviour. Hence, the
|
||||||
|
default behaviour is identical to previous versions.
|
||||||
|
|
||||||
|
The global default function can be overridden for any given =colview=
|
||||||
|
dynamic block individually by specifying a custom formatter function
|
||||||
|
using the new ~:formatter~ parameter on the block's =BEGIN= line.
|
||||||
|
|
||||||
|
This new feature replicates the ~:formatter~ option already available
|
||||||
|
for =clocktable= dynamic blocks.
|
||||||
|
|
||||||
*** =ob-tangle.el=: New flag to remove tangle targets before writing
|
*** =ob-tangle.el=: New flag to remove tangle targets before writing
|
||||||
|
|
||||||
When ~org-babel-tangle-remove-file-before-write~ is set to ~t~ the
|
When ~org-babel-tangle-remove-file-before-write~ is set to ~t~ the
|
||||||
|
|
|
@ -123,6 +123,12 @@ in `org-columns-summary-types-default', which see."
|
||||||
(function :tag "Summarize")
|
(function :tag "Summarize")
|
||||||
(function :tag "Collect")))))
|
(function :tag "Collect")))))
|
||||||
|
|
||||||
|
(defcustom org-columns-dblock-formatter #'org-columns-dblock-write-default
|
||||||
|
"Function to format data in column view dynamic blocks.
|
||||||
|
For more information, see `org-columns-dblock-write-default'."
|
||||||
|
:group 'org-properties
|
||||||
|
:package-version '(Org . "9.7")
|
||||||
|
:type 'function)
|
||||||
|
|
||||||
|
|
||||||
;;; Column View
|
;;; Column View
|
||||||
|
@ -1442,9 +1448,13 @@ that will be excluded from the resulting view. FORMAT is a
|
||||||
format string for columns, or nil. When LOCAL is non-nil, only
|
format string for columns, or nil. When LOCAL is non-nil, only
|
||||||
capture headings in current subtree.
|
capture headings in current subtree.
|
||||||
|
|
||||||
This function returns a list containing the title row and all
|
This function returns a list containing the title row and all other
|
||||||
other rows. Each row is a list of fields, as strings, or
|
rows. Each row is either a list, or the symbol `hline'. The first list
|
||||||
`hline'."
|
is the heading row as a list of strings with the column titles according
|
||||||
|
to FORMAT. All subsequent lists each represent a body row as a list
|
||||||
|
whose first element is an integer indicating the outline level of the
|
||||||
|
entry, and whose remaining elements are strings with the contents for
|
||||||
|
the columns according to FORMAT."
|
||||||
(org-columns (not local) format)
|
(org-columns (not local) format)
|
||||||
(goto-char org-columns-top-level-marker)
|
(goto-char org-columns-top-level-marker)
|
||||||
(let ((columns (length org-columns-current-fmt-compiled))
|
(let ((columns (length org-columns-current-fmt-compiled))
|
||||||
|
@ -1545,7 +1555,13 @@ PARAMS is a property list of parameters:
|
||||||
`:vlines'
|
`:vlines'
|
||||||
|
|
||||||
When non-nil, make each column a column group to enforce
|
When non-nil, make each column a column group to enforce
|
||||||
vertical lines."
|
vertical lines.
|
||||||
|
|
||||||
|
`:formatter'
|
||||||
|
|
||||||
|
A function to format the data and insert it into the
|
||||||
|
buffer. Overrides the default formatting function set in
|
||||||
|
`org-columns-dblock-formatter'."
|
||||||
(let ((table
|
(let ((table
|
||||||
(let ((id (plist-get params :id))
|
(let ((id (plist-get params :id))
|
||||||
view-file view-pos)
|
view-file view-pos)
|
||||||
|
@ -1573,7 +1589,17 @@ PARAMS is a property list of parameters:
|
||||||
(plist-get params :exclude-tags)
|
(plist-get params :exclude-tags)
|
||||||
(plist-get params :format)
|
(plist-get params :format)
|
||||||
view-pos)))))
|
view-pos)))))
|
||||||
(width-specs
|
(formatter (or (plist-get params :formatter)
|
||||||
|
org-columns-dblock-formatter
|
||||||
|
#'org-columns-dblock-write-default)))
|
||||||
|
(funcall formatter (point) table params)))
|
||||||
|
|
||||||
|
(defun org-columns-dblock-write-default (ipos table params)
|
||||||
|
"Write out a columnview table at position IPOS in the current buffer.
|
||||||
|
TABLE is a table with data as produced by `org-columns--capture-view'.
|
||||||
|
PARAMS is the parameter property list obtained from the dynamic block
|
||||||
|
definition."
|
||||||
|
(let ((width-specs
|
||||||
(mapcar (lambda (spec) (nth 2 spec))
|
(mapcar (lambda (spec) (nth 2 spec))
|
||||||
org-columns-current-fmt-compiled)))
|
org-columns-current-fmt-compiled)))
|
||||||
(when table
|
(when table
|
||||||
|
@ -1616,6 +1642,8 @@ PARAMS is a property list of parameters:
|
||||||
;; to the resulting table, adding alignment field as the first
|
;; to the resulting table, adding alignment field as the first
|
||||||
;; row.
|
;; row.
|
||||||
(push (mapcar (lambda (width) (when width (format "<%d>" width))) width-specs) table))
|
(push (mapcar (lambda (width) (when width (format "<%d>" width))) width-specs) table))
|
||||||
|
;; now insert the table into the buffer
|
||||||
|
(goto-char ipos)
|
||||||
(let ((content-lines (org-split-string (plist-get params :content) "\n"))
|
(let ((content-lines (org-split-string (plist-get params :content) "\n"))
|
||||||
recalc)
|
recalc)
|
||||||
;; Insert affiliated keywords before the table.
|
;; Insert affiliated keywords before the table.
|
||||||
|
|
|
@ -1398,6 +1398,13 @@
|
||||||
|
|
||||||
;;; Dynamic block
|
;;; Dynamic block
|
||||||
|
|
||||||
|
(defun test-org-colview/dblock-formatter (ipos table params)
|
||||||
|
"User-defined columnview dblock formatting function."
|
||||||
|
(goto-char ipos)
|
||||||
|
(insert-before-markers "Hello columnview!" "\n")
|
||||||
|
(insert-before-markers (format "table has %d rows" (length table)) "\n")
|
||||||
|
(insert-before-markers (format "there are %d parameters" (/ (length params) 2))))
|
||||||
|
|
||||||
(ert-deftest test-org-colview/dblock ()
|
(ert-deftest test-org-colview/dblock ()
|
||||||
"Test the column view table."
|
"Test the column view table."
|
||||||
(should
|
(should
|
||||||
|
@ -1703,6 +1710,19 @@ SCHEDULED: <2020-05-11 Mon> DEADLINE: <2020-05-14 Thu>
|
||||||
(let ((org-columns-default-format
|
(let ((org-columns-default-format
|
||||||
"%ITEM %DEADLINE(d) %SCHEDULED(s) %TIMESTAMP(t)"))
|
"%ITEM %DEADLINE(d) %SCHEDULED(s) %TIMESTAMP(t)"))
|
||||||
(org-update-dblock))
|
(org-update-dblock))
|
||||||
|
(buffer-substring-no-properties (point) (point-max)))))
|
||||||
|
;; custom formatting function
|
||||||
|
(should
|
||||||
|
(equal
|
||||||
|
"#+BEGIN: columnview :formatter test-org-colview/dblock-formatter
|
||||||
|
Hello columnview!
|
||||||
|
table has 3 rows
|
||||||
|
there are 4 parameters
|
||||||
|
#+END:"
|
||||||
|
(org-test-with-temp-text
|
||||||
|
"* H\n<point>#+BEGIN: columnview :formatter test-org-colview/dblock-formatter\n#+END:"
|
||||||
|
(let ((org-columns-default-format "%ITEM"))
|
||||||
|
(org-update-dblock))
|
||||||
(buffer-substring-no-properties (point) (point-max))))))
|
(buffer-substring-no-properties (point) (point-max))))))
|
||||||
|
|
||||||
(provide 'test-org-colview)
|
(provide 'test-org-colview)
|
||||||
|
|
Loading…
Reference in New Issue