Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun test/roam-open-reference ()
- "Switch to links and backlinks by completing-read."
- (interactive)
- (unless (buffer-file-name (or (buffer-base-buffer)
- (current-buffer)))
- (error "Not visiting a file."))
- (let* ((file-path (buffer-file-name (or (buffer-base-buffer)
- (current-buffer))))
- (links-out (test/get-links-out file-path))
- (backlinks (test/roam-file-backlink-info file-path))
- (sources nil))
- ;; Back-references to current page
- (when backlinks
- (dolist (info backlinks)
- (unless (equal file-path (plist-get info :file))
- (push (cons (format "<- [%s] %s"
- (plist-get info :title)
- (plist-get info :line))
- info)
- sources))))
- ;; Walk through pages of outgoing links
- (dolist (link-info links-out)
- ;; Links from current page out
- (unless (equal file-path (plist-get link-info :file))
- (push (cons (format "-> [%s]" (plist-get link-info :title))
- link-info)
- sources))
- (let* ((link-title (plist-get link-info :title))
- (link-file (plist-get link-info :file))
- (link-links-out (test/get-links-out link-file))
- (link-backlinks (test/roam-file-backlink-info link-file)))
- ;; Links from current page out
- (when link-links-out
- (dolist (info link-links-out)
- (unless (equal file-path (plist-get info :file))
- (push (cons (format "%s -> [%s]"
- link-title
- (plist-get info :title))
- info)
- sources))))
- ;; Back-references to current page
- (when link-backlinks
- (dolist (info link-backlinks)
- (unless (equal file-path (plist-get info :file))
- (push (cons (format "%s <- [%s] %s"
- link-title
- (plist-get info :title)
- (plist-get info :line))
- info)
- sources))))))
- (setq sources (nreverse sources))
- (when-let* ((selection (completing-read "Select reference: "
- sources nil t))
- (info (cdr (assoc selection sources)))
- )
- (find-file (plist-get info :file))
- (when-let ((file-point (plist-get info :file-point)))
- (goto-char file-point)))))
- ;; -- Helper functions ---------------------------------------------------------
- (defun test/roam-file-backlink-info (file-path &optional drop-to)
- "Produce a list of info on backlink."
- (when-let* ((backlinks (org-roam--get-backlinks file-path))
- (grouped-backlinks (--group-by (nth 0 it) backlinks)))
- (let (bl-info)
- (dolist (group grouped-backlinks)
- (let* ((file-from (car group)))
- (unless (equal drop-to file-from)
- (let* ((bls (cdr group))
- (title (org-roam--get-title-or-slug file-from)))
- (dolist (backlink bls)
- (pcase-let ((`(,file-from ,file-to ,props) backlink))
- (let* ((file-point (plist-get props :point))
- (line (-> (plist-get props :content)
- s-trim
- org-link-display-format
- substring-no-properties)))
- (push (list :file file-from
- :title title
- :line line
- :file-point file-point)
- bl-info))))))))
- bl-info)))
- (defun test/get-links-out (file-path &optional ignore-to)
- "Produce a list of info on link."
- (-as-> (org-roam-sql [:select [file-to] :from file-links
- :where (= file-from $s1)]
- file-path)
- prev
- (mapcar #'car prev)
- (-remove-item ignore-to prev)
- (-uniq prev)
- (--map (list :title (org-roam--get-title-or-slug it)
- :file it) prev)
- (--sort (string-lessp (plist-get it :title)
- (plist-get other :title))
- prev)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement