oc: Allow declaring cite styles as a function

* lisp/oc.el (org-cite-register-processor): Allow a function
as :cite-styles value.
(org-cite-supported-styles): Propagate change above.
* testing/lisp/test-oc.el (test-org-cite/supported-styles): Add test.
This commit is contained in:
Nicolas Goaziou 2021-12-11 23:42:05 +01:00
parent 798435be85
commit 7e2d9091d0
3 changed files with 21 additions and 1 deletions

View File

@ -97,6 +97,12 @@ argument.
** Miscellaneous
*** Citation processors can declare styles dynamically
When a citation processor is registered, it is now possible to set
~:cite-styles~ key to a function, which will be called whenever the
list of styles is required.
*** Org also searches for CSL style files in default directory
When CSL style file name is relative, Org first looks into

View File

@ -409,6 +409,9 @@ optional keys can be set:
The \"nil\" style denotes the processor fall-back style. It
should have a corresponding entry in the value.
The value can also be a function. It will be called without
any argument and should return a list structured as the above.
Return a non-nil value on a successful operation."
(declare (indent 1))
(unless (and name (symbolp name))
@ -680,7 +683,10 @@ strings."
(let ((collection
(seq-mapcat
(lambda (name)
(org-cite-processor-cite-styles (org-cite-get-processor name)))
(pcase (org-cite-processor-cite-styles
(org-cite-get-processor name))
((and (pred functionp) f) (funcall f))
(static-data static-data)))
(or processors
(mapcar (pcase-lambda (`(,_ . (,name . ,_))) name)
org-cite-export-processors))))

View File

@ -306,6 +306,14 @@
(org-cite-register-processor 'test
:cite-styles '((("foo" "f")) ((""))))
(org-cite-supported-styles))))
;; Also support functions generating the list.
(should
(equal '((("foo" "f")) (("")))
(let ((org-cite--processors nil)
(org-cite-export-processors '((t test))))
(org-cite-register-processor 'test
:cite-styles (lambda () '((("foo" "f")) (("")))))
(org-cite-supported-styles))))
;; Explicitly provide a processor.
(should
(equal '((("")))