X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.el;h=72b4b528d9741b8722b4377d751474e5f0b60542;hp=7a54058c150a8eee5c0ded7fbf7f17de85fcc888;hb=8758611b7670699ecaf4335933666a5967f39065;hpb=a5df44410adb84103c2e44c74ba6d0c4ce0fe9b3 diff --git a/org-ref.el b/org-ref.el index 7a54058..72b4b52 100644 --- a/org-ref.el +++ b/org-ref.el @@ -41,6 +41,7 @@ (require 'helm-config) (require 'helm-bibtex) (require 'org) +(require 'org-element) ;; * Custom variables (defgroup org-ref nil @@ -81,15 +82,19 @@ You should use full-paths for each file." '(("article" . "%a, %t, %j, %v(%n), %p (%y). link. doi.") ("book" . "%a, %t, %u (%y).") - + ("techreport" . "%a, %t, %i, %u (%y).") ("proceedings" . "%e, %t in %S, %u (%y).") - ("inproceedings" . "%a, %t, %p, in %b, edited by %e, %u (%y)")) - "String to format an entry. Just the reference, no numbering at the beginning, etc... see the `org-ref-reftex-format-citation' docstring for the escape codes." :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) @@ -106,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." @@ -329,12 +346,12 @@ You will see a message in the minibuffer when on a cite, ref or label link." ":\\([a-zA-Z0-9-_:\\./]*,?\\)*")) -(setq org-ref-label-re - "label:\\([a-zA-Z0-9-_:]*,?\\)*") +(defvar org-ref-label-re + "label:\\([a-zA-Z0-9-_:]*,?\\)*") -(setq org-ref-ref-re - "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*") +(defvar org-ref-ref-re + "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*") (defface org-ref-cite-face @@ -423,7 +440,6 @@ Beware that all this only works with BibTeX database files. When citations are made from the \bibitems in an explicit thebibliography environment, only %l is available." ;; Format a citation from the info in the BibTeX ENTRY - (unless (stringp format) (setq format "\\cite{%l}")) (if (and reftex-comment-citations @@ -444,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"))) @@ -460,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)) @@ -475,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))))) @@ -489,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) @@ -501,20 +526,25 @@ Format according to the type in `org-ref-bibliography-entry-format'." (file) (entry) (bibtex-entry) (entry-type) (format)) (setq file (catch 'result - (loop for file in org-ref-bibliography-files do - (if (org-ref-key-in-file-p key (file-truename file)) - (throw 'result file) - (message "%s not found in %s" - key (file-truename file)))))) + (cl-loop for file in org-ref-bibliography-files do + (if (org-ref-key-in-file-p key (file-truename file)) + (throw 'result file) + (message "%s not found in %s" + key (file-truename file)))))) (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 + (dolist (cons-cell bibtex-entry) + (setf (car cons-cell) (downcase (car cons-cell)))) (setq entry-type (downcase (cdr (assoc "=type=" bibtex-entry)))) (setq format (cdr (assoc entry-type org-ref-bibliography-entry-format))) (if format (setq entry (org-ref-reftex-format-citation bibtex-entry format)) + ;; if no format, we use the bibtex entry itself as a fallback (save-restriction (bibtex-narrow-to-entry) (setq entry (buffer-string))))) @@ -540,8 +570,22 @@ Format according to the type in `org-ref-bibliography-entry-format'." (defun org-ref-get-bibtex-entry-html (key) "Return an html string for the bibliography entry corresponding to KEY." - - (format "
  • [%s] %s
  • " key key (org-ref-get-bibtex-entry-citation key))) + (let ((output)) + (setq output (org-ref-get-bibtex-entry-citation key)) + ;; unescape the & + (setq output (replace-regexp-in-string "\\\\&" "&" output)) + ;; hack to replace {} around text + (setq output (replace-regexp-in-string "{" "" output)) + (setq output (replace-regexp-in-string "}" "" output)) + ;; get rid of empty parens + (setq output (replace-regexp-in-string "()" "" output)) + ;; get rid of empty link and doi + (setq output (replace-regexp-in-string " link\\." "" output)) + ;; change double dash to single dash + (setq output (replace-regexp-in-string "--" "-" output)) + (setq output (replace-regexp-in-string " doi\\." "" output)) + (format "
  • [%s] %s
  • " + key key output))) (defun org-ref-get-html-bibliography () "Create an html bibliography when there are keys." @@ -558,13 +602,14 @@ Format according to the type in `org-ref-bibliography-entry-format'." (file) (entry) (bibtex-entry) (entry-type) (format)) (setq file (catch 'result - (loop for file in org-ref-bibliography-files do + (cl-loop for file in org-ref-bibliography-files do (if (org-ref-key-in-file-p key (file-truename file)) (throw 'result file) (message "%s not found in %s" key (file-truename file)))))) (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 @@ -637,26 +682,27 @@ Format according to the type in `org-ref-bibliography-entry-format'." (split-string (org-element-property :path object) ",")) - ;; now if we have comma separated bibliographies - ;; we find the one clicked on. we want to - ;; search forward to next comma from point - (save-excursion - (if (search-forward "," link-string-end 1 1) - ;; we found a match - (setq key-end (- (match-end 0) 1)) - ;; no comma found so take the point - (setq key-end (point)))) - ;; and backward to previous comma from point - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - ;; we found a match - (setq key-beginning (+ (match-beginning 0) 1)) - (setq key-beginning (point)))) ; no match found + (let (key-beginning key-end) + ;; now if we have comma separated bibliographies + ;; we find the one clicked on. we want to + ;; search forward to next comma from point + (save-excursion + (if (search-forward "," link-string-end 1 1) + ;; we found a match + (setq key-end (- (match-end 0) 1)) + ;; no comma found so take the point + (setq key-end (point)))) + ;; and backward to previous comma from point + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + ;; we found a match + (setq key-beginning (+ (match-beginning 0) 1)) + (setq key-beginning (point)))) ; no match found ;; save the key we clicked on. - (setq bibfile (org-ref-strip-string - (buffer-substring key-beginning key-end))) - ;; open file on click - (find-file bibfile))) + (setq bibfile (org-ref-strip-string + (buffer-substring key-beginning key-end))) + ;; open file on click + (find-file bibfile)))) ;; formatting code (lambda (keyword desc format) @@ -703,21 +749,22 @@ Format according to the type in `org-ref-bibliography-entry-format'." (set (make-local-variable 'reftex-default-bibliography) (split-string (org-element-property :path object) ",")) - ;; now if we have comma separated bibliographies - ;; we find the one clicked on. we want to - ;; search forward to next comma from point - (save-excursion - (if (search-forward "," link-string-end 1 1) - (setq key-end (- (match-end 0) 1)) ; we found a match - (setq key-end (point)))) ; no comma found so take the point - ;; and backward to previous comma from point - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match - (setq key-beginning (point)))) ; no match found - ;; save the key we clicked on. - (setq bibfile (org-ref-strip-string (buffer-substring key-beginning key-end))) - (find-file bibfile))) ; open file on click + (let (key-beginning key-end) + ;; now if we have comma separated bibliographies + ;; we find the one clicked on. we want to + ;; search forward to next comma from point + (save-excursion + (if (search-forward "," link-string-end 1 1) + (setq key-end (- (match-end 0) 1)) ; we found a match + (setq key-end (point)))) ; no comma found so take the point + ;; and backward to previous comma from point + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match + (setq key-beginning (point)))) ; no match found + ;; save the key we clicked on. + (setq bibfile (org-ref-strip-string (buffer-substring key-beginning key-end))) + (find-file bibfile)))) ; open file on click ;; formatting code (lambda (keyword desc format) @@ -749,7 +796,10 @@ Format according to the type in `org-ref-bibliography-entry-format'." (cond ((eq format 'latex) ;; write out the latex bibliography command - (format "\\bibliographystyle{%s}" keyword))))) + (format "\\bibliographystyle{%s}" keyword)) + ;; Other styles should not have an output for this + (t + "")))) (defun org-bibliographystyle-complete-link (&optional arg) @@ -806,21 +856,22 @@ ARG does nothing." (set (make-local-variable 'reftex-default-addbibresource) (split-string (org-element-property :path object) ",")) - ;; now if we have comma separated bibliographies - ;; we find the one clicked on. we want to - ;; search forward to next comma from point - (save-excursion - (if (search-forward "," link-string-end 1 1) - (setq key-end (- (match-end 0) 1)) ; we found a match - (setq key-end (point)))) ; no comma found so take the point - ;; and backward to previous comma from point - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match - (setq key-beginning (point)))) ; no match found - ;; save the key we clicked on. - (setq bibfile (org-ref-strip-string (buffer-substring key-beginning key-end))) - (find-file bibfile))) ; open file on click + (let (key-beginning key-end) + ;; now if we have comma separated bibliographies + ;; we find the one clicked on. we want to + ;; search forward to next comma from point + (save-excursion + (if (search-forward "," link-string-end 1 1) + (setq key-end (- (match-end 0) 1)) ; we found a match + (setq key-end (point)))) ; no comma found so take the point + ;; and backward to previous comma from point + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match + (setq key-beginning (point)))) ; no match found + ;; save the key we clicked on. + (setq bibfile (org-ref-strip-string (buffer-substring key-beginning key-end))) + (find-file bibfile)))) ; open file on click ;; formatting code (lambda (keyword desc format) @@ -847,11 +898,11 @@ ARG does nothing." (string-match-p "[^.]*\\.\\(png\\|jpg\\|eps\\|pdf\\)$" (org-element-property :path link))) - (incf counter) + (cl-incf counter) (let* ((start (org-element-property :begin link)) (parent (car (cdr (org-element-property :parent link)))) - (caption (caaar (plist-get parent :caption))) + (caption (cl-caaar (plist-get parent :caption))) (name (plist-get parent :name))) (if caption (format @@ -890,10 +941,10 @@ ARG does nothing." (org-element-map (org-element-parse-buffer 'element) 'table (lambda (table) "create a link for to the table" - (incf counter) + (cl-incf counter) (let ((start (org-element-property :begin table)) (name (org-element-property :name table)) - (caption (caaar (org-element-property :caption table)))) + (caption (cl-caaar (org-element-property :caption table)))) (if caption (format "[[elisp:(progn (switch-to-buffer \"%s\")(widen)(goto-char %s))][table %s: %s]] %s\n" @@ -950,7 +1001,7 @@ ARG does nothing." (org-ref-count-labels label)))) (lambda (keyword desc format) (cond - ((eq format 'html) (format "()" path)) + ((eq format 'html) (format "
    " keyword)) ((eq format 'latex) (format "\\label{%s}" keyword))))) @@ -1029,7 +1080,7 @@ ARG does nothing." ;formatting (lambda (keyword desc format) (cond - ((eq format 'html) (format "(%s)" path)) + ((eq format 'html) (format "%s" keyword keyword)) ((eq format 'latex) (format "\\ref{%s}" keyword))))) @@ -1204,19 +1255,19 @@ Use C-u C-u to insert a [[#custom-id]] link" (helm :input (thing-at-point 'word) :sources `(((name . "Available labels to ref") - (candidates . ,(loop for label in labels - for context in contexts - ;; we do some kludgy adding spaces - ;; and bars to make it "easier" to - ;; see in helm. - collect (cons (concat - label "\n" - (mapconcat - (lambda (x) - (concat " |" x)) - (split-string context "\n") - "\n" - ) "\n\n") label))) + (candidates . ,(cl-loop for label in labels + for context in contexts + ;; we do some kludgy adding spaces + ;; and bars to make it "easier" to + ;; see in helm. + collect (cons (concat + label "\n" + (mapconcat + (lambda (x) + (concat " |" x)) + (split-string context "\n") + "\n" + ) "\n\n") label))) ;; default action to replace or insert ref link. (action . (lambda (label) (switch-to-buffer ,cb) @@ -1372,9 +1423,10 @@ Optional argument ARG Does nothing." ;formatting (lambda (keyword desc format) (cond - ((eq format 'html) (format "(%s)" path)) - ((eq format 'latex) - (format "\\eqref{%s}" keyword))))) + ((eq format 'latex) (format "\\eqref{%s}" keyword)) + ;;considering the fact that latex's the standard of math formulas, just use mathjax to render the html + ;;customize the variable 'org-html-mathjax-template' and 'org-html-mathjax-options' refering to 'autonumber' + ((eq format 'html) (format "\\eqref{%s}" keyword))))) ;; ** cite link @@ -1400,28 +1452,30 @@ keyword we clicked on. We also strip the text properties." ;; this means no description in the link (progn ;; we need the link path start and end - (save-excursion - (goto-char (org-element-property :begin object)) - (search-forward link-string nil nil 1) - (setq link-string-beginning (match-beginning 0)) - (setq link-string-end (match-end 0))) + (let (link-string-beginning link-string-end) + (save-excursion + (goto-char (org-element-property :begin object)) + (search-forward link-string nil nil 1) + (setq link-string-beginning (match-beginning 0)) + (setq link-string-end (match-end 0))) - ;; The key is the text between commas, or the link boundaries - (save-excursion - (if (search-forward "," link-string-end t 1) - (setq key-end (- (match-end 0) 1)) ; we found a match - (setq key-end link-string-end))) ; no comma found so take the end - ;; and backward to previous comma from point which defines the start character - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match - (setq key-beginning link-string-beginning))) ; no match found - ;; save the key we clicked on. - (setq bibtex-key - (org-ref-strip-string - (buffer-substring key-beginning key-end))) - (set-text-properties 0 (length bibtex-key) nil bibtex-key) - bibtex-key) + (let (key-beginning key-end) + ;; The key is the text between commas, or the link boundaries + (save-excursion + (if (search-forward "," link-string-end t 1) + (setq key-end (- (match-end 0) 1)) ; we found a match + (setq key-end link-string-end))) ; no comma found so take the end + ;; and backward to previous comma from point which defines the start character + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match + (setq key-beginning link-string-beginning))) ; no match found + ;; save the key we clicked on. + (let ((bibtex-key + (org-ref-strip-string + (buffer-substring key-beginning key-end)))) + (set-text-properties 0 (length bibtex-key) nil bibtex-key) + bibtex-key)))) ;; link with description. assume only one key link-string))) @@ -1488,19 +1542,44 @@ falling back to what the user has set in `org-ref-default-bibliography'" (unless key (setq key (org-ref-get-bibtex-key-under-cursor))) (setq file (catch 'result - (loop for file in org-ref-bibliography-files do - (if (org-ref-key-in-file-p key (file-truename file)) - (throw 'result file))))) + (cl-loop for file in org-ref-bibliography-files do + (if (org-ref-key-in-file-p key (file-truename file)) + (throw 'result file))))) (cons key file))) ;; *** 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)))) @@ -1515,6 +1594,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 @@ -1541,6 +1621,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))))) @@ -1555,6 +1636,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)))))) @@ -1627,6 +1709,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. @@ -1679,16 +1762,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 @@ -1765,6 +1850,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" @@ -2069,17 +2155,20 @@ arg (ALTERNATIVE-CITE) to get a menu of citation types." (defun org-ref-bib-citation () "From a bibtex entry, create and return a simple citation string. This assumes you are in an article." - + (bibtex-set-dialect nil t) (bibtex-beginning-of-entry) (let* ((cb (current-buffer)) (bibtex-expand-strings t) - (entry (loop for (key . value) in (bibtex-parse-entry t) - collect (cons (downcase key) value))) + (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)) + (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)) @@ -2091,12 +2180,11 @@ This assumes you are in an article." (defun org-ref-bib-html-citation () "From a bibtex entry, create and return a simple citation with html links." - (bibtex-beginning-of-entry) (let* ((cb (current-buffer)) (bibtex-expand-strings t) - (entry (loop for (key . value) in (bibtex-parse-entry t) - collect (cons (downcase key) value))) + (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))) @@ -2105,14 +2193,13 @@ This assumes you are in an article." (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)) - ) + (url (reftex-get-bib-field "url" entry))) ;;authors, "title", Journal, vol(iss):pages (year). (concat (format "%s, \"%s\", %s, %s:%s (%s)." author title journal volume pages year) (when url (format " link" url)) - (when doi (format " doi" doi))) - )) + (when doi + (format " doi" doi))))) ;; ** Open pdf in bibtex entry (defun org-ref-open-bibtex-pdf () @@ -2147,18 +2234,9 @@ construct the heading by hand." (bibtex-beginning-of-entry) (let* ((cb (current-buffer)) (bibtex-expand-strings t) - (entry (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)) - ) + (entry (cl-loop for (key . value) in (bibtex-parse-entry t) + collect (cons (downcase key) value))) + (key (reftex-get-bib-field "=key=" entry))) ;; save key to clipboard to make saving pdf later easier by pasting. (with-temp-buffer @@ -2175,38 +2253,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$" - (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 () @@ -2718,6 +2799,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)) )))) @@ -2735,7 +2817,7 @@ Shows bad citations, ref links and labels" (setq keys (org-ref-split-and-strip-string link-string)) (setq years (mapcar 'org-ref-get-citation-year keys)) (setq data (mapcar* (lambda (a b) `(,a . ,b)) years keys)) - (setq data (cl-sort data (lambda (x y) (< (string-to-int (car x)) (string-to-int (car y)))))) + (setq data (cl-sort data (lambda (x y) (< (string-to-number (car x)) (string-to-number (car y)))))) ;; now get the keys separated by commas (setq keys (mapconcat (lambda (x) (cdr x)) data ",")) ;; and replace the link with the sorted keys @@ -2909,26 +2991,27 @@ Shows bad citations, ref links and labels" (when (> link-string-beginning (point)) (goto-char link-string-beginning)) - ;; now if we have comma separated bibliographies - ;; we find the one clicked on. we want to - ;; search forward to next comma from point - (save-excursion - (if (search-forward "," link-string-end 1 1) - (setq key-end (- (match-end 0) 1)) ; we found a match - (setq key-end (point)))) ; no comma found so take the point + (let (key-beginning key-end) + ;; now if we have comma separated bibliographies + ;; we find the one clicked on. we want to + ;; search forward to next comma from point + (save-excursion + (if (search-forward "," link-string-end 1 1) + (setq key-end (- (match-end 0) 1)) ; we found a match + (setq key-end (point)))) ; no comma found so take the point - ;; and backward to previous comma from point - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match - (setq key-beginning (point)))) ; no match found - ;; save the key we clicked on. - (setq bibfile - (org-ref-strip-string - (buffer-substring key-beginning key-end))) - (if (file-exists-p bibfile) - (message "%s exists." bibfile) - (message "!!! %s NOT FOUND !!!" bibfile)))))))))) + ;; and backward to previous comma from point + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match + (setq key-beginning (point)))) ; no match found + ;; save the key we clicked on. + (setq bibfile + (org-ref-strip-string + (buffer-substring key-beginning key-end))) + (if (file-exists-p bibfile) + (message "%s exists." bibfile) + (message "!!! %s NOT FOUND !!!" bibfile))))))))))) ;; ** aliases (defalias 'oro 'org-ref-open-citation-at-point) @@ -3063,17 +3146,17 @@ first key that partially matches. This version avoids that." User is prompted for tags. This function is called from `helm-bibtex'. Argument CANDIDATES helm candidates." (message "") - (let ((keywords (read-input "Keywords (comma separated): "))) - (loop for key in (helm-marked-candidates) - do - (save-window-excursion - (helm-bibtex-show-entry key) - (bibtex-set-field - "keywords" - (concat - keywords - ", " (bibtex-autokey-get-field "keywords"))) - (save-buffer))))) + (let ((keywords (read-string "Keywords (comma separated): "))) + (cl-loop for key in (helm-marked-candidates) + do + (save-window-excursion + (helm-bibtex-show-entry key) + (bibtex-set-field + "keywords" + (concat + keywords + ", " (bibtex-autokey-get-field "keywords"))) + (save-buffer))))) (setq helm-source-bibtex '((name . "BibTeX entries") @@ -3204,6 +3287,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 !!!" ))) @@ -3214,16 +3298,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 @@ -3299,10 +3385,10 @@ Checks for pdf and doi, and add appropriate functions." (email-bibtex-entry)))) t) ;; finally return a numbered list of the candidates - (loop for i from 0 - for cell in candidates - collect (cons (format "%2s. %s" i (car cell)) - (cdr cell))))) + (cl-loop for i from 0 + for cell in candidates + collect (cons (format "%2s. %s" i (car cell)) + (cdr cell))))) (defvar org-ref-helm-user-candidates '() @@ -3312,7 +3398,13 @@ This is a list of cons cells '((\"description\" . action)). The action function ;; example of adding your own function (add-to-list 'org-ref-helm-user-candidates - '("Example" . (lambda () (message-box "You did it!"))) + '("Open pdf in emacs" . (lambda () + + (find-file + (concat + org-ref-pdf-directory + (car (org-ref-get-bibtex-key-and-file)) + ".pdf")))) t) ;;;###autoload