X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=inline;f=org-ref.el;h=1d9ec6880778cfda2538be488d91694b43273f76;hb=ed52c1ec9545f39007c1df422ffb4407a323c605;hp=aecf1aea111d2ba034ec11f03f54673bbdf4ba18;hpb=c8f07d16dd5ca2df8c0a913ffd5384e68e40a68e;p=org-ref.git
diff --git a/org-ref.el b/org-ref.el
index aecf1ae..1d9ec68 100644
--- a/org-ref.el
+++ b/org-ref.el
@@ -89,6 +89,12 @@ You should use full-paths for each file."
:type 'string
:group 'org-ref)
+(defcustom org-ref-note-title-format
+ "** TODO %y - %t"
+ "String to format the title of a note. See the `org-ref-reftex-format-citation' docstring for the escape codes."
+ :type 'string
+ :group 'org-ref)
+
(defcustom org-ref-open-notes-function
(lambda ()
(org-show-entry)
@@ -105,11 +111,23 @@ You should use full-paths for each file."
(defcustom org-ref-open-pdf-function
'org-ref-open-pdf-at-point
-"User-defined function to open a pdf from a link. The function must get the key at point, and derive a path to the pdf file, then open it. The default function is `org-ref-open-pdf-at-point'."
+ "User-defined function to open a pdf from a link. The
+function must get the key at point, and derive a path to the pdf
+file, then open it. The default function is
+`org-ref-open-pdf-at-point'."
:type 'function
:group 'org-ref)
+(defcustom org-ref-get-pdf-filename-function
+ 'org-ref-get-pdf-filename
+ "User-defined function to get a filename from a bibtex key.
+The function must take a key as an argument, and return the path
+to the corresponding filename. The default is
+`org-ref-get-pdf-filename'. An alternative value is
+`org-ref-get-mendeley-filename'.")
+
+
(defcustom org-ref-insert-cite-function
'org-ref-helm-insert-cite-link
"Function to call to insert citation links. The default is `org-ref-helm-insert-cite-link' which uses `helm-bibtex'. `org-ref' modifies `helm-bibtex' a little bit to give `org-mode' citations, and to reorder default actions. You may use `org-ref-insert-cite-link' if you like the reftex interface."
@@ -442,10 +460,14 @@ environment, only %l is available."
(if reftex-comment-citations
reftex-cite-comment-format
"")))
- ((= l ?a) (reftex-format-names
- (reftex-get-bib-names "author" entry)
- (or n 2)))
- ((= l ?A) (car (reftex-get-bib-names "author" entry)))
+ ((= l ?a) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (reftex-format-names
+ (reftex-get-bib-names "author" entry)
+ (or n 2))))
+ ((= l ?A) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (car (reftex-get-bib-names "author" entry))))
((= l ?b) (org-ref-reftex-get-bib-field "booktitle" entry "in: %s"))
((= l ?B) (reftex-abbreviate-title
(org-ref-reftex-get-bib-field "booktitle" entry "in: %s")))
@@ -458,8 +480,11 @@ environment, only %l is available."
((= l ?E) (car (reftex-get-bib-names "editor" entry)))
((= l ?h) (org-ref-reftex-get-bib-field "howpublished" entry))
((= l ?i) (org-ref-reftex-get-bib-field "institution" entry))
- ((= l ?j) (org-ref-reftex-get-bib-field "journal" entry))
- ((= l ?k) (org-ref-reftex-get-bib-field "key" entry))
+ ((= l ?j) (let ((jt (reftex-get-bib-field "journal" entry)))
+ (if (string= "" jt)
+ (reftex-get-bib-field "journaltitle" entry)
+ jt)))
+ ((= l ?k) (org-ref-reftex-get-bib-field "=key=" entry))
((= l ?m) (org-ref-reftex-get-bib-field "month" entry))
((= l ?n) (org-ref-reftex-get-bib-field "number" entry))
((= l ?o) (org-ref-reftex-get-bib-field "organization" entry))
@@ -473,9 +498,13 @@ environment, only %l is available."
((= l ?U) (org-ref-reftex-get-bib-field "url" entry))
((= l ?r) (org-ref-reftex-get-bib-field "address" entry))
;; strip enclosing brackets from title if they are there
- ((= l ?t) (org-ref-reftex-get-bib-field "title" entry))
- ((= l ?T) (reftex-abbreviate-title
+ ((= l ?t) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
(org-ref-reftex-get-bib-field "title" entry)))
+ ((= l ?T) (reftex-abbreviate-title
+ ((replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (org-ref-reftex-get-bib-field "title" entry)))))
((= l ?v) (org-ref-reftex-get-bib-field "volume" entry))
((= l ?y) (org-ref-reftex-get-bib-field "year" entry)))))
@@ -487,8 +516,6 @@ environment, only %l is available."
(setq format (replace-match "%" t t format)))
(while (string-match "[ ,.;:]*%<" format)
(setq format (replace-match "" t t format)))
- ;; also replace carriage returns, tabs, and multiple whitespaces
- (setq format (replace-regexp-in-string "\n\\|\t\\|\s+" " " format))
format)
(defun org-ref-get-bibtex-entry-citation (key)
@@ -507,6 +534,7 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(with-temp-buffer
(insert-file-contents file)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key nil 0)
(setq bibtex-entry (bibtex-parse-entry))
;; downcase field names so they work in the format-citation code
@@ -581,6 +609,7 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(with-temp-buffer
(insert-file-contents file)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key nil 0)
(setq entry (bibtex-parse-entry))
(format "** %s - %s
@@ -972,7 +1001,7 @@ ARG does nothing."
(org-ref-count-labels label))))
(lambda (keyword desc format)
(cond
- ((eq format 'html) (format "()" keyword))
+ ((eq format 'html) (format "
" keyword))
((eq format 'latex)
(format "\\label{%s}" keyword)))))
@@ -1519,12 +1548,37 @@ falling back to what the user has set in `org-ref-default-bibliography'"
;; *** key at point functions
+(defun org-ref-get-pdf-filename (key)
+ "Return the pdf filename associated with a bibtex KEY."
+ (format (concat org-ref-pdf-directory "%s.pdf") key))
+
+
+(defun org-ref-get-mendeley-filename (key)
+ "Return the pdf filename indicated by mendeley file field.
+Falls back to org-ref-get-pdf-filename if file filed does not exist.
+Contributed by https://github.com/autosquid."
+ (let* ((results (org-ref-get-bibtex-key-and-file key))
+ (bibfile (cdr results)))
+ (with-temp-buffer
+ (insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
+ (bibtex-search-entry key nil 0)
+ (setq entry (bibtex-parse-entry))
+ (let ((e (org-ref-reftex-get-bib-field "file" entry)))
+ (if (> (length e) 4)
+ (remove-if
+ (lambda (ch)
+ (find ch "{}\\"))
+ (format "/%s" (subseq e 1 (- (length e) 4))))
+ (format (concat org-ref-pdf-directory "%s.pdf") key))))))
+
+
(defun org-ref-open-pdf-at-point ()
"Open the pdf for bibtex key under point if it exists."
(interactive)
(let* ((results (org-ref-get-bibtex-key-and-file))
(key (car results))
- (pdf-file (format (concat org-ref-pdf-directory "%s.pdf") key)))
+ (pdf-file (funcall org-ref-get-pdf-filename-function key)))
(if (file-exists-p pdf-file)
(org-open-file pdf-file)
(message "no pdf found for %s" key))))
@@ -1539,6 +1593,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls
@@ -1565,6 +1620,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-open-bibtex-notes)))))
@@ -1579,6 +1635,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(message "%s" (progn
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation))))))
@@ -1651,6 +1708,7 @@ Prompt for NEW-FILE includes bib files in `org-ref-default-bibliography', and bi
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(setq doi (bibtex-autokey-get-field "doi"))
;; in case doi is a url, remove the url part.
@@ -1703,16 +1761,18 @@ get a lot of options. LINK-STRING is used by the link function."
(interactive)
(let* ((results (org-ref-get-bibtex-key-and-file))
(key (car results))
- (pdf-file (format (concat org-ref-pdf-directory "%s.pdf") key))
+ (pdf-file (funcall org-ref-get-pdf-filename-function key))
(bibfile (cdr results))
(url (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(bibtex-autokey-get-field "url"))))
(doi (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls
@@ -1789,6 +1849,7 @@ get a lot of options. LINK-STRING is used by the link function."
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation))))
"\n"
@@ -2103,7 +2164,10 @@ This assumes you are in an article."
(year (reftex-get-bib-field "year" entry))
(author (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "author" entry)))
(key (reftex-get-bib-field "=key=" entry))
- (journal (reftex-get-bib-field "journal" entry))
+ (journal (let ((jt (reftex-get-bib-field "journal" entry)))
+ (if (string= "" jt)
+ (reftex-get-bib-field "journaltitle" entry)
+ jt)))
(volume (reftex-get-bib-field "volume" entry))
(pages (reftex-get-bib-field "pages" entry))
(doi (reftex-get-bib-field "doi" entry))
@@ -2171,16 +2235,7 @@ construct the heading by hand."
(bibtex-expand-strings t)
(entry (cl-loop for (key . value) in (bibtex-parse-entry t)
collect (cons (downcase key) value)))
- (title (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "title" entry)))
- (year (reftex-get-bib-field "year" entry))
- (author (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "author" entry)))
- (key (reftex-get-bib-field "=key=" entry))
- (journal (reftex-get-bib-field "journal" entry))
- (volume (reftex-get-bib-field "volume" entry))
- (pages (reftex-get-bib-field "pages" entry))
- (doi (reftex-get-bib-field "doi" entry))
- (url (reftex-get-bib-field "url" entry))
- )
+ (key (reftex-get-bib-field "=key=" entry)))
;; save key to clipboard to make saving pdf later easier by pasting.
(with-temp-buffer
@@ -2197,38 +2252,41 @@ construct the heading by hand."
(if (re-search-forward (format ":Custom_ID: %s$" key) nil 'end)
(funcall org-ref-open-notes-function)
;; no entry found, so add one
- (insert (format "\n** TODO %s - %s" year title))
- (insert (format"
+ (insert (org-ref-reftex-format-citation entry (concat "\n" org-ref-note-title-format)))
+ (insert (org-ref-reftex-format-citation
+ entry
+ (concat "
:PROPERTIES:
- :Custom_ID: %s
- :AUTHOR: %s
- :JOURNAL: %s
- :YEAR: %s
- :VOLUME: %s
- :PAGES: %s
- :DOI: %s
- :URL: %s
+ :Custom_ID: %k
+ :AUTHOR: %9a
+ :JOURNAL: %j
+ :YEAR: %y
+ :VOLUME: %v
+ :PAGES: %p
+ :DOI: %D
+ :URL: %U
:END:
-[[cite:%s]] [[file:%s/%s.pdf][pdf]]\n\n"
-key author journal year volume pages doi url key org-ref-pdf-directory key))
-(save-buffer))))
+"
+ (format "[[cite:%s]] [[file:%s/%s.pdf][pdf]]\n\n"
+ key org-ref-pdf-directory key))))
+ (save-buffer))))
(defun org-ref-open-notes-from-reftex ()
"Call reftex, and open notes for selected entry."
(interactive)
(let ((bibtex-key )))
- ;; now look for entry in the notes file
- (if org-ref-bibliography-notes
- (find-file-other-window org-ref-bibliography-notes)
- (error "Org-ref-bib-bibliography-notes is not set to anything"))
+ ;; now look for entry in the notes file
+ (if org-ref-bibliography-notes
+ (find-file-other-window org-ref-bibliography-notes)
+ (error "Org-ref-bib-bibliography-notes is not set to anything"))
- (goto-char (point-min))
+ (goto-char (point-min))
- (re-search-forward (format
- ":Custom_ID: %s$"
- (cl-first (reftex-citation t)) nil 'end))
- (funcall org-ref-open-notes-function))
+ (re-search-forward (format
+ ":Custom_ID: %s$"
+ (cl-first (reftex-citation t)) nil 'end))
+ (funcall org-ref-open-notes-function))
;; ** Open bibtex entry in browser
(defun org-ref-open-in-browser ()
@@ -2740,6 +2798,7 @@ Shows bad citations, ref links and labels"
(bibfile (cdr results)))
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key nil 0)
(prog1 (reftex-get-bib-field "year" (bibtex-parse-entry t))
))))
@@ -3227,6 +3286,7 @@ With two prefix args, insert a label link."
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation)))
"!!! No entry found !!!" )))
@@ -3237,16 +3297,18 @@ With two prefix args, insert a label link."
Checks for pdf and doi, and add appropriate functions."
(let* ((results (org-ref-get-bibtex-key-and-file))
(key (car results))
- (pdf-file (format (concat org-ref-pdf-directory "%s.pdf") key))
+ (pdf-file (funcall org-ref-get-pdf-filename-function key))
(bibfile (cdr results))
(url (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(bibtex-autokey-get-field "url"))))
(doi (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls