X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=org-ref.el;h=46dfbe2c05dbb2f4b105d175d112ebcd94947805;hb=0dbc1db6e2fedffc4725c6cd8680fa8f08098d67;hp=3fdecfb93874389c334334044cc93d37a8ca8175;hpb=e8e9831beeb3f43fcf57483f8fd4efc63deb1261;p=org-ref.git
diff --git a/org-ref.el b/org-ref.el
index 3fdecfb..46dfbe2 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,11 +82,9 @@ 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)
@@ -326,7 +325,7 @@ You will see a message in the minibuffer when on a cite, ref or label link."
(replace-regexp-in-string "\*" "\\\\*" x)
)
org-ref-cite-types "\\|") "\\)"
- ":\\([a-zA-Z0-9-_:\\.]*,?\\)*"))
+ ":\\([a-zA-Z0-9-_:\\./]*,?\\)*"))
(setq org-ref-label-re
@@ -423,7 +422,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
@@ -501,20 +499,24 @@ 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-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 +542,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,7 +574,7 @@ 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))))))
@@ -612,45 +628,53 @@ Format according to the type in `org-ref-bibliography-entry-format'."
;; may contain multiple files. this code finds the
;; one you clicked on and opens it.
(lambda (link-string)
- ;; get link-string boundaries
- ;; we have to go to the beginning of the line, and then search forward
-
+ ;; get link-string boundaries we have to go to the
+ ;; beginning of the line, and then search forward
(let* ((bibfile)
;; object is the link you clicked on
(object (org-element-context))
(link-string-beginning)
- (link-string-end))
-
+ (link-string-end)
+ (cp (point)))
(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)))
- ;; We set the reftex-default-bibliography
- ;; here. it should be a local variable only in
- ;; the current buffer. We need this for using
- ;; reftex to do citations.
- (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
+ ;; Make sure point is in the link-path.
+ (if (< cp link-string-beginning)
+ (goto-char link-string-beginning))
+ ;; We set the reftex-default-bibliography
+ ;; here. it should be a local variable only in
+ ;; the current buffer. We need this for using
+ ;; reftex to do citations.
+ (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)
+ ;; 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)))
- (find-file bibfile))) ; open file on click
+ (setq bibfile (org-ref-strip-string
+ (buffer-substring key-beginning key-end)))
+ ;; open file on click
+ (find-file bibfile)))
- ;; formatting code
+ ;; formatting code
(lambda (keyword desc format)
(cond
((eq format 'org) (org-ref-get-org-bibliography))
@@ -658,10 +682,14 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the latex bibliography command
- (format "\\bibliography{%s}" (replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
- (mapcar 'expand-file-name
- (split-string keyword ","))
- ",")))))))
+ (format "\\bibliography{%s}"
+ (replace-regexp-in-string
+ "\\.bib" ""
+ (mapconcat
+ 'identity
+ (mapcar 'expand-file-name
+ (split-string keyword ","))
+ ",")))))))
(org-add-link-type "nobibliography"
;; this code is run on clicking. The bibliography
@@ -715,20 +743,11 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the latex bibliography command
-
-; (format "{\\setbox0\\vbox{\\bibliography{%s}}}"
-; (replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
-; (mapcar 'expand-file-name
-; (split-string keyword ","))
-; ",")))
-
(format "\\nobibliography{%s}"
(replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
(mapcar 'expand-file-name
(split-string keyword ","))
- ",")))
-
- ))))
+ ",")))))))
(org-add-link-type "printbibliography"
(lambda (arg) (message "Nothing implemented for clicking here."))
@@ -738,8 +757,7 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the biblatex bibliography command
- "\\printbibliography"))
-))
+ "\\printbibliography"))))
(org-add-link-type "bibliographystyle"
(lambda (arg) (message "Nothing implemented for clicking here."))
@@ -747,7 +765,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)
@@ -845,11 +866,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
@@ -888,10 +909,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"
@@ -1202,19 +1223,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)
@@ -1486,9 +1507,9 @@ 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
@@ -2071,8 +2092,8 @@ This assumes you are in an article."
(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)))
@@ -2089,12 +2110,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)))
@@ -2103,14 +2123,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 ()
@@ -2145,8 +2164,8 @@ 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)))
+ (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)))
@@ -2203,7 +2222,7 @@ key author journal year volume pages doi url key org-ref-pdf-directory key))
(re-search-forward (format
":Custom_ID: %s$"
- (first (reftex-citation t)) nil 'end))
+ (cl-first (reftex-citation t)) nil 'end))
(funcall org-ref-open-notes-function))
;; ** Open bibtex entry in browser
@@ -2733,7 +2752,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
@@ -3061,17 +3080,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")
@@ -3099,11 +3118,13 @@ In the helm-bibtex buffer, C-u will give you a helm menu to select a new link ty
C-u C-u will change the key at point to the selected keys."
(let* ((object (org-element-context))
(last-char (save-excursion
- (goto-char (org-element-property :end object))
- (backward-char)
- (if (looking-at " ")
- " "
- ""))))
+ (when (org-element-property :end object)
+ (goto-char (org-element-property :end object))
+ (unless (bobp)
+ (backward-char))
+ (if (looking-at " ")
+ " "
+ "")))))
(cond
;; case where we are in a link
((and (equal (org-element-type object) 'link)
@@ -3137,7 +3158,7 @@ C-u C-u will change the key at point to the selected keys."
;; We are next to a link, and we want to append
;; next to a link means one character back is on a link.
((save-excursion
- (backward-char)
+ (unless (bobp) (backward-char))
(and (equal (org-element-type (org-element-context)) 'link)
(-contains?
org-ref-cite-types
@@ -3295,10 +3316,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 '()