add hydra menu
[org-ref.git] / doi-utils.org
index b6c5433..68c74bc 100644 (file)
@@ -904,6 +904,7 @@ error."
 
 
 * Adding a bibtex entry from a crossref query
+The idea here is to perform a query on Crossref, get a helm buffer of candidates, and select the entry(ies) you want to add to your bibtex file. You can select a region, e.g. a free form citation, or set of words, or you can type the query in by hand.
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun doi-utils-add-entry-from-crossref-query (query bibtex-file)
@@ -914,7 +915,9 @@ error."
                 (cond
                  ;; If region is active assume we want it
                  ((region-active-p)
-                  (buffer-substring (region-beginning) (region-end)))
+                  (replace-regexp-in-string
+                   "\n" " "
+                   (buffer-substring (region-beginning) (region-end))))
                  ;; type or paste it in
                  (t
                   nil)))
@@ -934,7 +937,9 @@ error."
       (setq json-string (buffer-substring url-http-end-of-headers (point-max)))
       (setq json-data (json-read-from-string json-string)))
 
-    (let* ((name (format "Crossref hits for %s" query))
+    (let* ((name (format "Crossref hits for %s"
+                        ;; remove carriage returns. they cause problems in helm.
+                        (replace-regexp-in-string "\n" " " query)))
           (helm-candidates (mapcar (lambda (x)
                                      (cons
                                       (concat
@@ -948,7 +953,7 @@ error."
                     ;; just return the candidate
                     (action . (("Insert bibtex entry" . (lambda (doi)
                                                           (doi-utils-add-bibtex-entry-from-doi
-                                                           (replace-regexp-in-string "^http://dx.doi.org/" "" doi))))
+                                                           (replace-regexp-in-string "^http://dx.doi.org/" "" doi) ,bibtex-file)))
                                ("Open url" . (lambda (doi)
                                                (browse-url doi))))))))
       (helm :sources '(source)))))
@@ -1162,7 +1167,8 @@ Here is a list of helm candidates
 #+END_SRC
 
 #+RESULTS:
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
+
 (((fullCitation . "Ann M. Deml, Vladan Stevanovi\304\207, Christopher L. Muhich, Charles B. Musgrave, Ryan O'Hayre, 2014, 'Oxide enthalpy of formation and band gap energy as accurate descriptors of oxygen vacancy formation energetics', <i>Energy &amp; Environmental Science</i>, vol. 7, no. 6, p. 1996")
   (year . "2014")
   (coins . "ctx_ver=Z39.88-2004&amp;rft_id=info%3Adoi%2Fhttp%3A%2F%2Fdx.doi.org%2F10.1039%2Fc3ee43874k&amp;rfr_id=info%3Asid%2Fcrossref.org%3Asearch&amp;rft.atitle=Oxide+enthalpy+of+formation+and+band+gap+energy+as+accurate+descriptors+of+oxygen+vacancy+formation+energetics&amp;rft.jtitle=Energy+%26+Environmental+Science&amp;rft.date=2014&amp;rft.volume=7&amp;rft.issue=6&amp;rft.spage=1996&amp;rft.aufirst=Ann+M.&amp;rft.aulast=Deml&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.au=Ann+M.+Deml&amp;rft.au=+Vladan+Stevanovi%C4%87&amp;rft.au=+Christopher+L.+Muhich&amp;rft.au=+Charles+B.+Musgrave&amp;rft.au=+Ryan+O%27Hayre")
@@ -1255,7 +1261,7 @@ I found this on the web. It can be handy, but the bibtex entry has a lot of stuf
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun isbn-to-bibtex-lead (isbn)
  "Search lead.to for ISBN bibtex entry. You have to copy the entry if it is on the page to your bibtex file."
- (interactive "ISBN: ")
+ (interactive "sISBN: ")
 (browse-url
 (format "http://lead.to/amazon/en/?key=%s+&si=all&op=bt&bn=&so=sa&ht=us" isbn)))
 #+END_SRC
@@ -1267,15 +1273,16 @@ http://xisbn.worldcat.org/xisbnadmin/doc/api.htm#getmetadata
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun isbn-to-bibtex (isbn bibfile)
   "Get bibtex entry for ISBN and insert it into BIBFILE unless an
-entry with the generated key already exists in the file. "
+entry with the generated key already exists in the file."
   (interactive
    (list
     (read-input
      "ISBN: "
      ;; now set initial input
      (cond
-      ;; If region is active assume we want it
-      ((region-active-p)
+      ;; If region is active and it starts with a number, we use it
+      ((and  (region-active-p)
+            (s-match "^[0-9]" (buffer-substring (region-beginning) (region-end))))
        (buffer-substring (region-beginning) (region-end)))
       ;; if first entry in kill ring starts with a number assume it is an isbn
       ;; and use it as the guess
@@ -1301,9 +1308,12 @@ entry with the generated key already exists in the file. "
         (new-entry)
         (new-key))
 
+    ;; check if we got something
     (unless (string= "ok" status)
       (error "Status is %s" status))
 
+    ;; construct an alphabetically sorted bibtex entry. I assume ISBN numbers go
+    ;; with book entries.
     (setq new-entry
          (concat "\n@book{,\n"
                  (mapconcat
@@ -1314,7 +1324,7 @@ entry with the generated key already exists in the file. "
                   "\n")
                  "\n}\n"))
 
-    ;; build entry in temp buffer to get the key
+    ;; build entry in temp buffer to get the key so we can check for duplicates
     (setq new-entry (with-temp-buffer
                      (insert new-entry)
                      (org-ref-clean-bibtex-entry)
@@ -1329,16 +1339,19 @@ entry with the generated key already exists in the file. "
                     new-key)))
     (goto-char (point-max))
     (insert new-entry)
-    ;; set key
+    ;; set key. It is simplest to just replace it, even if it is the same.
     (bibtex-beginning-of-entry)
     (re-search-forward bibtex-entry-maybe-empty-head)
     (if (match-beginning bibtex-key-in-head)
        (delete-region (match-beginning bibtex-key-in-head)
                       (match-end bibtex-key-in-head)))
     (insert new-key)
-    (bibtex-fill-entry)))
+    (bibtex-fill-entry)
+    (save-buffer)))
 #+END_SRC
 
+
+
 * end of file
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (provide 'doi-utils)
@@ -1350,25 +1363,3 @@ entry with the generated key already exists in the file. "
 
 #+RESULTS:
 : Loaded doi-utils.el
-
-
-
-
-
-#+BEGIN_SRC emacs-lisp
-(setq data '(("John" . "john@email.com")
-             ("Jim" . "jim@email.com")
-             ("Jane" . "jane@email.com")
-             ("Jill" . "jill@email.com")))
-
-(setq some-helm-source
-      `((name . "HELM at the Emacs")
-        (candidates . ,(mapcar 'car data))
-        (action . (lambda (candidate)
-                    (message-box "%s" (cdr (assoc candidate data)))))))
-
-(message-box "you chose %s" (helm :sources '(some-helm-source)))
-#+END_SRC
-
-#+RESULTS:
-: you chose jim@email.com