feat: adapt spine-add-book for shelf-based nesting
This commit is contained in:
@@ -227,13 +227,13 @@ SELECTED-ID expands the matching book's detail section."
|
||||
nil))))))))
|
||||
)))))
|
||||
(defun spine-add-book (&rest args)
|
||||
"Add a new WANT book to `spine-org-file'.
|
||||
Keyword arguments: :title :author :category :format :isbn :cover
|
||||
"Add a new book to shelf `:shelf' in `spine-org-file'.
|
||||
Keyword arguments: :title :author :shelf :format :isbn :cover
|
||||
:rec_by :rec_note :date_added :initial_note
|
||||
Signals an error on failure."
|
||||
:shelf is required. Signals an error if the shelf doesn't exist."
|
||||
(let ((title (plist-get args :title))
|
||||
(shelf (plist-get args :shelf))
|
||||
(author (plist-get args :author))
|
||||
(category (plist-get args :category))
|
||||
(format (plist-get args :format))
|
||||
(isbn (plist-get args :isbn))
|
||||
(cover (plist-get args :cover))
|
||||
@@ -243,20 +243,32 @@ Signals an error on failure."
|
||||
(initial-note (plist-get args :initial_note)))
|
||||
(unless title
|
||||
(error "spine-add-book: title is required"))
|
||||
(unless shelf
|
||||
(error "spine-add-book: :shelf is required"))
|
||||
(let ((org-file (expand-file-name spine-org-file)))
|
||||
;; Create file if it doesn't exist
|
||||
(unless (file-exists-p org-file)
|
||||
(with-temp-file org-file
|
||||
(insert "#+TODO: WANT(w) READING(r) | READ(d) ABANDONED(a)\n\n")))
|
||||
(error "spine-add-book: file %s does not exist; create shelves first"
|
||||
org-file))
|
||||
(with-current-buffer (find-file-noselect org-file)
|
||||
(unwind-protect
|
||||
(progn
|
||||
(goto-char (point-max))
|
||||
;; Insert new headline
|
||||
;; Find the shelf headline
|
||||
(goto-char (point-min))
|
||||
(let ((shelf-found nil))
|
||||
(while (and (not shelf-found)
|
||||
(re-search-forward
|
||||
(format "^\\*+[ \t]+%s[ \t]*$" (regexp-quote shelf))
|
||||
nil t))
|
||||
(when (= (org-current-level) 1)
|
||||
(setq shelf-found t)))
|
||||
(unless shelf-found
|
||||
(error "spine-add-book: shelf \"%s\" not found" shelf)))
|
||||
;; Go to end of shelf section
|
||||
(org-end-of-subtree)
|
||||
;; Insert new book headline at level 2
|
||||
(org-insert-heading nil t)
|
||||
(org-demote-subtree)
|
||||
(insert title)
|
||||
;; Set TODO state
|
||||
(org-todo "WANT")
|
||||
;; Set properties (only non-empty)
|
||||
(when (and author (> (length author) 0))
|
||||
(org-set-property "AUTHOR" author))
|
||||
@@ -279,9 +291,6 @@ Signals an error on failure."
|
||||
(substring (sha1 (concat title (number-to-string (random)))) 0 4)))
|
||||
;; Set last modified
|
||||
(org-set-property "LAST_MODIFIED" (format-time-string "[%Y-%m-%d]"))
|
||||
;; Set tags
|
||||
(when (and category (> (length category) 0))
|
||||
(org-set-tags (list category)))
|
||||
;; Add initial note
|
||||
(when (and initial-note (> (length initial-note) 0))
|
||||
(let ((date (if (and date-added (> (length date-added) 0))
|
||||
|
||||
Reference in New Issue
Block a user