Function: org-attach-dir-from-id

org-attach-dir-from-id is a byte-compiled function defined in org-attach.el.gz.

Signature

(org-attach-dir-from-id ID &optional EXISTING)

Documentation

Return a folder path based on org-attach-id-dir and ID.

Try id-to-path functions in org-attach-id-to-path-function-list ignoring nils. If EXISTING is non-nil, then return the first path found in the filesystem. Otherwise return the first non-nil value.

The existing paths are searched in
1. org-attach-id-dir;
2. in "data/" dir - the default value of org-attach-id-dir;
3. if current buffer is a symlink, (1) and (2) searches are repeated
   in the default-directory of symlink target.

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-attach.el.gz
(defun org-attach-dir-from-id (id &optional existing)
  "Return a folder path based on `org-attach-id-dir' and ID.
Try id-to-path functions in `org-attach-id-to-path-function-list'
ignoring nils.  If EXISTING is non-nil, then return the first path
found in the filesystem.  Otherwise return the first non-nil value.

The existing paths are searched in
1. `org-attach-id-dir';
2. in \"data/\" dir - the default value of `org-attach-id-dir';
3. if current buffer is a symlink, (1) and (2) searches are repeated
   in the `default-directory' of symlink target."
  (let ((fun-list org-attach-id-to-path-function-list)
        (base-dir (expand-file-name org-attach-id-dir))
        (fallback-dirs (list (expand-file-name "data/")))
        preferred first)
    (when (and (buffer-file-name)
               (file-symlink-p (buffer-file-name)))
      (let ((default-directory
             (file-name-directory
              (file-truename (buffer-file-name)))))
        (cl-pushnew (expand-file-name org-attach-id-dir) fallback-dirs)
        (cl-pushnew (expand-file-name "data/") fallback-dirs)))
    (setq fallback-dirs (delete base-dir fallback-dirs))
    (setq fallback-dirs (seq-filter #'file-directory-p fallback-dirs))
    (while (and fun-list
                (not preferred))
      (let* ((name (funcall (car fun-list) id))
             (candidate (and name (expand-file-name name base-dir)))
             ;; Try the default value `org-attach-id-dir', and linked
             ;; dirs if buffer is a symlink as a fallback.
             (fallback-candidates
              (and name (mapcar
                         (lambda (dir) (expand-file-name name dir))
                         fallback-dirs)))
             (fallback-candidates
              (seq-filter #'file-directory-p fallback-candidates)))
        (setq fun-list (cdr fun-list))
        (when candidate
          (if (or (not existing) (file-directory-p candidate))
              (setq preferred candidate)
            (unless first
              (setq first candidate)))
          (when (and existing
                     fallback-candidates
                     (not (file-directory-p candidate)))
            (setq preferred (car fallback-candidates))))))
    (or preferred first)))