aboutsummaryrefslogtreecommitdiff
path: root/bard-elisp
diff options
context:
space:
mode:
Diffstat (limited to 'bard-elisp')
-rw-r--r--bard-elisp/bard-writing.el43
1 files changed, 43 insertions, 0 deletions
diff --git a/bard-elisp/bard-writing.el b/bard-elisp/bard-writing.el
index e1e4048..0f18c46 100644
--- a/bard-elisp/bard-writing.el
+++ b/bard-elisp/bard-writing.el
@@ -1,5 +1,8 @@
(require 'consult)
(require 'beframe)
+(require 'calendar)
+(require 'org-roam-node)
+(require 'denote)
(defvar bard/consult--source-notes
`(:name "Note Buffers"
@@ -64,6 +67,46 @@
(expand-file-name file)))
(bard/denote-insert-id-at-top))))
+(defun bard/insert-or-create-node ()
+ "Insert an Org-roam link if the note exists; otherwise create via Denote."
+ (interactive)
+ ;; Prompt for an existing node, but do not auto-create
+ (let* ((node (org-roam-node-read))
+ (title (org-roam-node-title node)))
+ (if node
+ ;; Node exists: insert Org-roam link at point
+ (let ((id (org-roam-node-id node)))
+ (if id
+ (insert (org-link-make-string
+ (concat "id:" id)
+ title))
+ ;; Node does not exist (no id): create via Denote
+ (bard/denote-insert-node title))))))
+
+(defun bard/denote-insert-node (title)
+ "Denote analogy for `org-roam-insert-node', takes TITLE as node title."
+ (interactive)
+ (let* ((keywords (denote-keywords-prompt))
+ (file (denote title keywords nil nil nil nil nil nil)))
+
+ (when-let ((buf (find-buffer-visiting file)))
+ (with-current-buffer buf
+ (save-buffer)
+ (kill-buffer buf)))
+
+ ;; extract uuid from file that is autogenerated by `bard/denote-insert-id-at-top'
+ (let ((uuid
+ (with-temp-buffer
+ (insert-file-contents file)
+ (goto-char (point-min))
+ (when (re-search-forward "^:ID:\\s-+\\([[:alnum:]-]+\\)" nil t)
+ (match-string 1)))))
+ (unless uuid
+ (error "No :ID: found in Denote file %s" file))
+
+ ;; Insert link at point
+ (insert (format "[[id:%s][%s]]" uuid title)))))
+
(defun denote-sequence-region ()
"Call `denote-sequence' and insert therein the text of the active region.