Skip to content

Commit

Permalink
Define citar-org-cite-basic-activate
Browse files Browse the repository at this point in the history
citar-org-cite-basic-activate is an org-cite activate processor meant to
be a more performant version of `org-cite-basic-activate`
  • Loading branch information
krisbalintona committed Oct 22, 2024
1 parent 0f1786b commit 64a60aa
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions citar-org.el
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,54 @@ strings by style."
(seq-difference (org-cite-list-bibliography-files)
org-cite-global-bibliography))

(defun citar-org-cite-basic-activate (citation)
"Set various text properties on CITATION object.
Fontify whole citation with org-cite face. Fontify key with error face
when it does not belong to known keys. Otherwise, use org-cite-key face.
Moreover, when mouse is on a known key, display the corresponding
bibliography. On a wrong key, suggest a list of possible keys, and offer
to substitute one of them with a mouse click.
This function activation function is meant to be added to
`citar-org-activation-functions'. It is a modified version of the
built-in `org-cite-basic-activate' that is more performant by leveraging
citar's caching."
(pcase-let ((`(,beg . ,end) (org-cite-boundaries citation))
;; Use citar to retrieve all entries' keys
(keys (let (keys)
(maphash (lambda (key _value) (push key keys))
(citar-get-entries))
keys)))
(put-text-property beg end 'font-lock-multiline t)
(add-face-text-property beg end 'org-cite)
(dolist (reference (org-cite-get-references citation))
(pcase-let* ((`(,beg . ,end) (org-cite-key-boundaries reference))
(key (org-element-property :key reference)))
;; Highlight key on mouse over.
(put-text-property beg end
'mouse-face
org-cite-basic-mouse-over-key-face)
(if (member key keys)
;; Activate a correct key. Face is `org-cite-key' and `help-echo' displays bibliography entry, for
;; reference. <mouse-1> calls `org-open-at-point'.
(let* ((entry (string-trim (citar-format-reference (list key)))) ; Use citar
(bibliography-entry
(org-element-interpret-data entry)))
(add-face-text-property beg end 'org-cite-key)
(put-text-property beg end 'help-echo bibliography-entry)
(org-cite-basic--set-keymap beg end nil))
;; Activate a wrong key. Face is `error', `help-echo' displays possible suggestions.
(add-face-text-property beg end 'error)
(let ((close-keys (org-cite-basic--close-keys key keys)))
(when close-keys
(put-text-property beg end 'help-echo
(concat "Suggestions (mouse-1 to substitute): "
(mapconcat #'identity close-keys " "))))
;; When the are close know keys, <mouse-1> provides completion to fix the current one. Otherwise,
;; call `org-cite-insert'.
(org-cite-basic--set-keymap beg end (or close-keys 'all))))))))

;;; Org note function

(defun citar-org--id-get-create (&optional force)
Expand Down

0 comments on commit 64a60aa

Please sign in to comment.