|
From: Alexander,J <ja...@ls...> - 2025-05-15 19:21:38
|
Ah, yes - you’re right. I had been making that assumption.
Given these considerations, I think I’ll just stick with my current method that accidentally works, and file these helpful notes away for the time when it no longer works and I need to find a better solution.
Thank you!
Jason
Sent from my iPhone
> On 15 May 2025, at 17:47, Christiaan Hofman <cmh...@gm...> wrote:
> That makes no sense. I think you are thinking about an alias file. But I am talking about alias data. There is no method to open a file from alias data (except by using system framework methods).
>
> Christiaan
>
>> On 15 May 2025, at 16:47, Alexander,J <ja...@ls...> wrote:
>>
>> 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 <cmh...@gm...> 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...@ls...> 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
> Bib...@li...
> https://lists.sourceforge.net/lists/listinfo/bibdesk-users
|