There is no documentation of this format. It is basically private.I can give 
you some partial information. Basically, it is base64 encoded plist data. The 
plist is a dictionary with 2 keys: relativePath and bookmark. The relativePath 
gives the path relative to the .bib file. The bookmark is alias data generated 
by Apple, and its format is not documented. So when you get the(full) path 
(from this alias data), that is largely by accident. The only robust way to get 
the (full) path is by resolving the alias using the system Foundation framework 
(i.e. using an  Objective-C or Swift program). Perhaps the best is to get the 
relative path, and also pass the .bib file path to your function.

For instance, you could get the plist data from the command line using:

echo “BDSKFILEVALUE” | base64 -D | plutil -convert xml1 -o - -

And you can get the relative path using:
 
echo “BDSKFILEVALUE” | base64 -D | plutil -extract relativePath raw -expect 
string -o - -

Christiaan

> On 15 May 2025, at 11:48, Alexander,J <[email protected]> wrote:
> 
> Is there documentation describing how to decode the values of the Bdsk-File-* 
> fields, and extract the path to the file?  
> 
> I ask because I've written the following Emacs macro which, when invoked 
> while the cursor is sitting on a citation key, attempts to open the first 
> such file  (if it exists) associated with that entry.  At the moment, this 
> seems to work, but when I inspect the results of the Base64 decoding (by 
> visiting the "*Bibdesk Info*" buffer), there's a lot of noise in the buffer 
> and the file path appears in all lower-case... which makes me worry that this 
> macro is working largely by accident and there is a more robust way of doing 
> this.
> 
> Many thanks,
> 
> Jason
> 
> 
> (defun open-bibdesk-file ()
>  "Extract the bdsk-file-1 field and open the file."
>  (interactive)
>  (save-window-excursion
>    ;; Use existing reftex function to locate the entry
>    (reftex-view-crossref 2)
> 
>    ;; Now we're in the bib file at the entry
>    (let (citation-key field-content)
>      ;; Find the citation key
>      (save-excursion
>        (when (re-search-backward "^@\\w+{\\([^,]+\\)," nil t)
>          (setq citation-key (match-string 1))))
> 
>      ;; Find the bdsk-file-1 field in the current entry
>      (save-excursion
>        (if (re-search-forward "bdsk-file-1\\s-*=\\s-*{\\([^}]*\\)}" nil t)
>            (progn
>              (let*
>                  ((Bdsk-File-1 (match-string 1))
>                   (fstr (base64-decode-string Bdsk-File-1))
>                   (info-buffer (get-buffer-create "*Bibdesk Info*"))
>                   path)
>                (string-match "\\(users/[- ,A-z0-9/_?]*.pdf\\)"  fstr)
>                (setq path (format "/%s" (match-string 0 fstr)))
>                (with-current-buffer info-buffer
>                  (erase-buffer)
>                  (insert (format "path: %s" path))
>                  (insert (format "\n\n%s" fstr)))
>                (if (and path (file-exists-p path))
>                    (shell-command (concat "open " (shell-quote-argument 
> path)))
>                  (message "File not found")))))))))



_______________________________________________
Bibdesk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-users

Reply via email to