Browse Source

oc-csl: Locate etc/csl for system installs and Emacs repo

* lisp/oc-csl.el (org-cite-csl--etc-dir): Add `data-directory' case,
using it as the fallback.  Also, use the more specific
file-directory-p rather than file-exists-p to inspect the candidates.

When using Org from the system installation, the CSL files will be
available in the etc/org/csl/ subdirectory underneath
`data-directory'.  (This requires the etc/csl/ files to be synced to
the Emacs repo under etc/org/csl.)

Give the Org repository and package cases precedence because they are
anchored to a specific oc.el location while, for Emacs releases with
Org 9.5 or later, the data-directory files will typically always be
present.
Kyle Meyer 3 years ago
parent
commit
60b178e596
1 changed files with 14 additions and 8 deletions
  1. 14 8
      lisp/oc-csl.el

+ 14 - 8
lisp/oc-csl.el

@@ -183,14 +183,20 @@ Used only when `second-field-align' is activated by the used CSL style."
 
 ;;; Internal variables
 (defconst org-cite-csl--etc-dir
-  (let* ((oc-root (file-name-directory (locate-library "oc")))
-         (oc-etc-dir-1 (expand-file-name "../etc/csl/" oc-root)))
-    ;; package.el and straight will put all of org-mode/lisp/ in org-mode/.
-    ;; This will cause .. to resolve to the directory above Org.
-    ;; To make life easier for people using package.el or straight, we can
-    ;; check to see if ../etc/csl exists, and if it doesn't try ./etc/csl.
-    (if (file-exists-p oc-etc-dir-1) oc-etc-dir-1
-      (expand-file-name "etc/csl/" oc-root)))
+  (let ((oc-root (file-name-directory (locate-library "oc"))))
+    (cond
+     ;; First check whether it looks like we're running from the main
+     ;; Org repository.
+     ((let ((csl-org (expand-file-name "../etc/csl/" oc-root)))
+        (and (file-directory-p csl-org) csl-org)))
+     ;; Next look for the directory alongside oc.el because package.el
+     ;; and straight will put all of org-mode/lisp/ in org-mode/.
+     ((let ((csl-pkg (expand-file-name "etc/csl/" oc-root)))
+        (and (file-directory-p csl-pkg) csl-pkg)))
+     ;; Finally fall back the location used by shared system installs
+     ;; and when running directly from Emacs repository.
+     (t
+      (expand-file-name "org/csl/" data-directory))))
   "Directory \"etc/\" from repository.")
 
 (defconst org-cite-csl--fallback-locales-dir org-cite-csl--etc-dir