From a2e46db80848cb17185f257a397370a22cd686bb Mon Sep 17 00:00:00 2001 From: Jethro Kuan Date: Sat, 20 Nov 2021 16:33:12 +0800 Subject: [PATCH] (feat)db: support org-ref v3 (#1977) Org-ref v3 introduced a new citation syntax, and removed some functions that org-roam had previously relied upon (e.g. for extracting keys from multi-citations). This commit introduces support on two fronts: 1. Add `org-roam-org-ref-path-to-keys` which converts a link path to a list of keys. This supports both Org-ref v2 and v3. 2. Adds support for parsing multi-citations in refs. --- org-roam-db.el | 23 ++++++++++++++--------- org-roam-utils.el | 10 ++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/org-roam-db.el b/org-roam-db.el index da8b16b..96201a9 100644 --- a/org-roam-db.el +++ b/org-roam-db.el @@ -485,7 +485,13 @@ INFO is the org-element parsed buffer." (cond ((string-prefix-p "@" ref) (push (vector node-id (substring ref 1) "cite") rows)) ((string-match org-link-plain-re ref) - (push (vector node-id (match-string 2 ref) (match-string 1 ref)) rows)) + (let ((link-type (match-string 1 ref)) + (path (match-string 2 ref))) + (if (and (boundp 'org-ref-cite-types) + (or (assoc link-type org-ref-cite-types) + (member link-type org-ref-cite-types))) + (dolist (key (org-roam-org-ref-path-to-keys path)) + (push (vector node-id key link-type) rows))))) (t (lwarn '(org-roam) :warning "%s:%s\tInvalid ref %s, skipping..." (buffer-file-name) (point) ref))))) @@ -507,14 +513,13 @@ INFO is the org-element parsed buffer." ;; For Org-ref links, we need to split the path into the cite keys (when (and source path) (if (and (boundp 'org-ref-cite-types) - (fboundp 'org-ref-split-and-strip-string) - (member type org-ref-cite-types)) - (progn - (setq path (org-ref-split-and-strip-string path)) - (org-roam-db-query - [:insert :into citations - :values $v1] - (mapcar (lambda (p) (vector source p (point) properties)) path))) + (or (assoc type org-ref-cite-types) + (member type org-ref-cite-types))) + (org-roam-db-query + [:insert :into citations + :values $v1] + (mapcar (lambda (k) (vector source k (point) properties)) + (org-roam-org-ref-path-to-keys path))) (org-roam-db-query [:insert :into links :values $v1] diff --git a/org-roam-utils.el b/org-roam-utils.el index 0e644a4..ffc3a8d 100644 --- a/org-roam-utils.el +++ b/org-roam-utils.el @@ -355,6 +355,16 @@ If VAL is not specified, user is prompted to select a value." (org-delete-property prop)) prop-to-remove)) +;;; Refs +(defun org-roam-org-ref-path-to-keys (path) + "Return a list of keys given an org-ref cite: PATH. +Accounts for both v2 and v3." + (cond ((fboundp 'org-ref-parse-cite-path) + (mapcar (lambda (cite) (plist-get cite :key)) + (plist-get (org-ref-parse-cite-path path) :references))) + ((fboundp 'org-ref-split-and-strip-string) + (org-ref-split-and-strip-string path)))) + ;;; Logs (defvar org-roam-verbose) (defun org-roam-message (format-string &rest args)