Explorar o código

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.
Nicolas Goaziou %!s(int64=3) %!d(string=hai) anos
pai
achega
7e2d9091d0
Modificáronse 3 ficheiros con 21 adicións e 1 borrados
  1. 6 0
      etc/ORG-NEWS
  2. 7 1
      lisp/oc.el
  3. 8 0
      testing/lisp/test-oc.el

+ 6 - 0
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

+ 7 - 1
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))))

+ 8 - 0
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 '((("")))