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
