]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.el
Use cl-lib macros instead of cl.el macros
[org-ref.git] / org-ref.el
index 6c7c4377eed69fe353c0599e6379e011c3bf3841..46dfbe2c05dbb2f4b105d175d112ebcd94947805 100644 (file)
@@ -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, <i>%j</i>, <b>%v(%n)</b>, %p (%y). <a href=\"%U\">link</a>. <a href=\"http://dx.doi.org/%D\">doi</a>.")
 
     ("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)
@@ -500,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)))))
@@ -539,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 "<li><a id=\"%s\">[%s] %s</a></li>"
-         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 " <a href=\"\">link</a>\\." "" output))
+    ;; change double dash to single dash
+    (setq output (replace-regexp-in-string "--" "-" output))
+    (setq output (replace-regexp-in-string " <a href=\"http://dx\\.doi\\.org/\">doi</a>\\." "" output))
+    (format "<li><a id=\"%s\">[%s] %s</a></li>"
+           key key output)))
 
 (defun org-ref-get-html-bibliography ()
   "Create an html bibliography when there are keys."
@@ -557,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))))))
@@ -849,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
@@ -892,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"
@@ -1206,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)
@@ -1490,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
@@ -2075,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)))
@@ -2096,8 +2113,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)))
@@ -2147,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)))
@@ -2205,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
@@ -2735,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
@@ -3064,16 +3081,16 @@ User is prompted for tags.  This function is called from `helm-bibtex'.
 Argument CANDIDATES helm candidates."
   (message "")
   (let ((keywords (read-string "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)))))
+    (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")
@@ -3299,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 '()