1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
;;; org-ebib.el --- Support for links to Ebib entries in Org -*- lexical-binding: t -*-
;; Copyright (c) 2014-2016 Grégoire Jadi, Joost Kremers
;; Al rights reserved
;; Author: Grégoire Jadi <daimrod@gmail.com>
;; Maintainer: Joost Kremers <joostkremers@fastmail.fm>
;; This file is not part of GNU Emacs.
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides two functions to integrate Ebib with org-mode.
;; `org-ebib-open' can be called with a BibTeX key as argument. It opens Ebib
;; and shows the entry corresponding to the key. `org-ebib-store-link' creates
;; a link that when followed opens Ebib.
;;; Code:
(require 'org)
;; This is to silence the byte-compiler and flycheck.
(defvar ebib--cur-db)
(defvar ebib-citation-description-function)
(defvar reftex-cite-punctuation)
(declare-function ebib "ebib" (&optional file key))
(declare-function ebib--get-key-at-point "ebib" ())
(declare-function org-link-set-parameters "org" (type &rest parameters))
(declare-function org-element-context "org-element" (&optional element))
(declare-function org-element-property "org-element" (property element))
(declare-function ebib-db-get-entry "ebib-db" (key db &optional noerror))
(declare-function reftex-format-citation "reftex-cite" (entry format))
(org-link-set-parameters "ebib" :follow #'org-ebib-open :store #'org-ebib-store-link)
;;;###autoload
(defun org-ebib-open (key)
"Open Ebib and jump to KEY."
(ebib nil key))
(defun org-ebib-store-link ()
"Store a link to an Ebib entry."
(when (memq major-mode '(ebib-index-mode ebib-entry-mode))
;; This is an Ebib entry
(let* ((key (ebib--get-key-at-point))
(link (concat "ebib:" key))
(description (ignore-errors (funcall ebib-citation-description-function key ebib--cur-db))))
(org-store-link-props :type "ebib"
:link link
:description description))))
(with-eval-after-load "reftex-cite"
(org-link-set-parameters "ebib" :help-echo #'org-ebib-show-citation-info))
(defun org-ebib-show-citation-info (window _object position)
"Help echo function for org-ebib links.
WINDOW is the window displaying the link, POSITION the link's
position in the relevant buffer."
(with-selected-window window
(save-excursion
(goto-char position)
(goto-char (org-element-property :begin (org-element-context)))
(cond
((looking-at org-bracket-link-regexp)
(mapconcat 'org-ebib-make-help-echo-string
(split-string
(cadr (split-string (match-string-no-properties 1)
":" t "[[:punct:]]*"))
"," t)
"\n"))
((looking-at org-plain-link-re)
(mapconcat 'org-ebib-make-help-echo-string
(split-string
(cadr (split-string (match-string-no-properties 0)
":" t "[[:punct:]]*"))
"," t)
"\n"))
(t "Not a link?")))))
(defcustom org-ebib-help-echo-format "%2a (%y), %t, %b, %j %<"
"Citation format used to display citation info in the message area.
Must NOT contain %l. See the variable `reftex-cite-format' for
possible percent escapes."
:group 'ebib
:type 'string)
(defun org-ebib-make-help-echo-string (key &optional format)
"Return the citation string of KEY according to FORMAT.
It is adapted from `reftex-make-cite-echo-string'."
(let ((entry (ebib-db-get-entry key ebib--cur-db 'noerror))
(reftex-cite-punctuation '(" " " & " " et al.")))
(or format (setq format org-ebib-help-echo-format))
(if entry
(replace-regexp-in-string
"[\"{}]" ""
(reftex-format-citation entry format))
(format "Key %s is not found in current database." key))))
(provide 'org-ebib)
;;; org-ebib.el ends here
|