If the bookmark is an alias, isn't it possible to open the file directly via the alias, without needing to recover/construct the path? That might not be possible, though, with the functions available in emacs.
> On 15 May 2025, at 15:37, Christiaan Hofman <cmhof...@gmail.com> wrote: > > 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 <ja...@lse.ac.uk> 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 > Bibdesk-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bibdesk-users _______________________________________________ Bibdesk-users mailing list Bibdesk-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-users