diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 81459eb23..80f6b7175 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -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 diff --git a/lisp/oc.el b/lisp/oc.el index e6190e425..3ee5ae65b 100644 --- a/lisp/oc.el +++ b/lisp/oc.el @@ -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)))) diff --git a/testing/lisp/test-oc.el b/testing/lisp/test-oc.el index 722b0fb9a..4c288e983 100644 --- a/testing/lisp/test-oc.el +++ b/testing/lisp/test-oc.el @@ -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 '((("")))