Parcourir la source

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 il y a 3 ans
Parent
commit
7e2d9091d0
3 fichiers modifiés avec 21 ajouts et 1 suppressions
  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
 ** 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
 *** Org also searches for CSL style files in default directory
 
 
 When CSL style file name is relative, Org first looks into
 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
     The \"nil\" style denotes the processor fall-back style.  It
     should have a corresponding entry in the value.
     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."
 Return a non-nil value on a successful operation."
   (declare (indent 1))
   (declare (indent 1))
   (unless (and name (symbolp name))
   (unless (and name (symbolp name))
@@ -680,7 +683,10 @@ strings."
   (let ((collection
   (let ((collection
          (seq-mapcat
          (seq-mapcat
           (lambda (name)
           (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
           (or processors
               (mapcar (pcase-lambda (`(,_ . (,name . ,_))) name)
               (mapcar (pcase-lambda (`(,_ . (,name . ,_))) name)
                       org-cite-export-processors))))
                       org-cite-export-processors))))

+ 8 - 0
testing/lisp/test-oc.el

@@ -306,6 +306,14 @@
             (org-cite-register-processor 'test
             (org-cite-register-processor 'test
               :cite-styles '((("foo" "f")) ((""))))
               :cite-styles '((("foo" "f")) ((""))))
             (org-cite-supported-styles))))
             (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.
   ;; Explicitly provide a processor.
   (should
   (should
    (equal '((("")))
    (equal '((("")))