org-list: Tweak `org-list-to-generic'

* lisp/org-list.el (org-list-to-generic): :istart, :icount, :iend
  and :isep are now called with an additional argument, the type of the
  list.  Also add a new property :ifmt.
(org-list--to-generic-item): Use new property.
(org-list-to-subtree): Adapt to new requirements for :istart and :iend.

* testing/lisp/test-org-list.el (test-org-list/to-generic): Update
  tests.
This commit is contained in:
Nicolas Goaziou 2016-10-30 01:00:49 +02:00
parent 9ea8e46df0
commit 835b8e05e5
3 changed files with 51 additions and 20 deletions

View File

@ -12,6 +12,11 @@ Please send Org bug reports to mailto:emacs-orgmode@gnu.org.
** Incompatible changes
*** Change signature for some properties in ~org-list-to-generic~
~:istart~, ~:icount~, ~:iend~ and ~:isep~ now expect the type of the
list as their first argument.
*** ~org-capture-templates~ no longer accepts S-expressions as file names
Since functions are allowed there, a straightforward way to migrate
@ -27,7 +32,9 @@ into
*** Agenda
**** New variable : ~org-agenda-show-future-repeats~
**** New variable : ~org-agenda-prefer-last-repeat~
*** Babel
**** Clojure: new setting ~org-babel-clojure-sync-nrepl-timeout~
Creation of a new setting to specify the Cider timeout. By setting
@ -93,6 +100,11 @@ as descriptions of links, a.k.a. image links. See its docstring for
details.
**** Horizontal rules are no longer ignored in LaTeX table math mode
*** ~org-list-to-generic~ includes a new property: ~:ifmt~
~:ifmt~ is a function to be called on the body of each item. See
~org-list-to-generic~ documentation for details.
*** New variable : ~org-bibtex-headline-format-function~
This allow to use a different title than entry title.

View File

@ -3314,23 +3314,28 @@ Valid parameters are:
Strings to start or end a list item, and to start a list item
with a counter. They can also be set to a function returning
a string or nil, which will be called with the depth of the
item, counting from 1.
a string or nil, which will be called with two arguments: the
type of list and the depth of the item, counting from 1.
:icount
Strings to start a list item with a counter. It can also be
set to a function returning a string or nil, which will be
called with two arguments: the depth of the item, counting from
1, and the counter. Its value, when non-nil, has precedence
over `:istart'.
called with three arguments: the type of list, the depth of the
item, counting from 1, and the counter. Its value, when
non-nil, has precedence over `:istart'.
:isep
String used to separate items. It can also be set to
a function returning a string or nil, which will be called with
the depth of the items, counting from 1. It always start on
a new line.
two arguments: the type of list and the depth of the item,
counting from 1. It always start on a new line.
:ifmt
Function to be applied to the contents of every item. It is
called with two arguments: the type of list and the contents.
:cbon, :cboff, :cbtrans
@ -3461,6 +3466,7 @@ PARAMS is a plist used to tweak the behavior of the transcoder."
(iend (plist-get params :iend))
(isep (plist-get params :isep))
(icount (plist-get params :icount))
(ifmt (plist-get params :ifmt))
(cboff (plist-get params :cboff))
(cbon (plist-get params :cbon))
(cbtrans (plist-get params :cbtrans))
@ -3474,9 +3480,9 @@ PARAMS is a plist used to tweak the behavior of the transcoder."
(tag (org-element-property :tag item))
(depth (org-list--depth item))
(separator (and (org-export-get-next-element item info)
(org-list--generic-eval isep depth)))
(closing (pcase (org-list--generic-eval iend depth)
((or `nil `"") "\n")
(org-list--generic-eval isep type depth)))
(closing (pcase (org-list--generic-eval iend type depth)
((or `nil "") "\n")
((and (guard separator) s)
(if (equal (substring s -1) "\n") s (concat s "\n")))
(s s))))
@ -3493,10 +3499,10 @@ PARAMS is a plist used to tweak the behavior of the transcoder."
;; Build output.
(concat
(let ((c (org-element-property :counter item)))
(if c (org-list--generic-eval icount depth c)
(org-list--generic-eval istart depth)))
(if (and c icount) (org-list--generic-eval icount type depth c)
(org-list--generic-eval istart type depth)))
(let ((body
(if (or istart iend icount cbon cboff cbtrans (not backend)
(if (or istart iend icount ifmt cbon cboff cbtrans (not backend)
(and (eq type 'descriptive)
(or dtstart dtend ddstart ddend)))
(concat
@ -3512,7 +3518,11 @@ PARAMS is a plist used to tweak the behavior of the transcoder."
(org-element-interpret-data tag))
dtend))
(and tag ddstart)
(if (= (length contents) 0) "" (substring contents 0 -1))
(let ((contents
(if (= (length contents) 0) ""
(substring contents 0 -1))))
(if ifmt (org-list--generic-eval ifmt type contents)
contents))
(and tag ddend))
(org-export-with-backend backend item contents info))))
;; Remove final newline.
@ -3556,7 +3566,7 @@ list with overruling parameters for `org-list-to-generic'."
(org-previous-line-empty-p)))))
(level (org-reduced-level (or (org-current-level) 0)))
(make-stars
(lambda (depth)
(lambda (_type depth &optional _count)
;; Return the string for the heading, depending on DEPTH
;; of current sub-list.
(let ((oddeven-level (+ level depth)))

View File

@ -1157,13 +1157,13 @@
"level1 a\nlevel2 b"
(org-test-with-temp-text "- a\n - b"
(org-list-to-generic (org-list-to-lisp)
'(:istart (lambda (l) (format "level%d "l)))))))
'(:istart (lambda (type l) (format "level%d "l)))))))
(should
(equal
"a\nblevel2level1"
(org-test-with-temp-text "- a\n - b"
(org-list-to-generic (org-list-to-lisp)
'(:iend (lambda (l) (format "level%d" l)))))))
'(:iend (lambda (type l) (format "level%d" l)))))))
;; Test `:icount' parameter.
(should
(equal
@ -1187,7 +1187,7 @@
(org-test-with-temp-text "1. [@3] a"
(org-list-to-generic
(org-list-to-lisp)
'(:icount (lambda (l c) (format "level:%d, counter:%d " l c)))))))
'(:icount (lambda (type l c) (format "level:%d, counter:%d " l c)))))))
;; Test `:isep' parameter.
(should
(equal
@ -1203,8 +1203,17 @@
(equal
"a\n- 1 -\nb"
(org-test-with-temp-text "- a\n- b"
(org-list-to-generic (org-list-to-lisp)
'(:isep (lambda (l) (format "- %d -" l)))))))
(org-list-to-generic
(org-list-to-lisp)
'(:isep (lambda (type depth) (format "- %d -" depth)))))))
;; Test `:ifmt' parameter.
(should
(equal
">> a <<"
(org-test-with-temp-text "1. [@3] a"
(org-list-to-generic
(org-list-to-lisp)
'(:ifmt (lambda (type c) (format ">> %s <<" c)))))))
;; Test `:cbon', `:cboff', `:cbtrans'
(should
(equal