]> git.donarmstrong.com Git - org-ref.git/blobdiff - doi-utils.org
added an arxiv example
[org-ref.git] / doi-utils.org
index e0ab22b1cd315e1601fbb1baba4c4651a227880e..8a9eac00b1295c1c23dc70650422c82720207cee 100644 (file)
@@ -534,17 +534,21 @@ when the `:type' parameter in the JSON metadata is contained in
 
 (doi-utils-def-bibtex-type book ("book")
                            author title series publisher year pages doi url)
 
 (doi-utils-def-bibtex-type book ("book")
                            author title series publisher year pages doi url)
+
+(doi-utils-def-bibtex-type inbook ("book-chapter")
+                           author title booktitle series publisher year pages doi url)
+
 #+END_SRC
 
 With the code generating the bibtex entry in place, we can glue it to the json retrieval code.
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun doi-utils-doi-to-bibtex-string (doi)
 #+END_SRC
 
 With the code generating the bibtex entry in place, we can glue it to the json retrieval code.
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun doi-utils-doi-to-bibtex-string (doi)
-  "return a bibtex entry as a string for the doi. Only articles are currently supported"
+  "return a bibtex entry as a string for the doi. Not all types are supported yet."
   (let* ((results (doi-utils-get-json-metadata doi))
          (type (plist-get results :type)))
   (let* ((results (doi-utils-get-json-metadata doi))
          (type (plist-get results :type)))
-    (format "%s" results) ; json-data
+    ;(format "%s" results) ; json-data
     (or (some (lambda (g) (funcall g type results)) doi-utils-bibtex-type-generators)
     (or (some (lambda (g) (funcall g type results)) doi-utils-bibtex-type-generators)
-        (message-box "%s not supported yet." type))))
+        (message "%s not supported yet\n%S." type results))))
 #+END_SRC
 
 #+RESULTS:
 #+END_SRC
 
 #+RESULTS:
@@ -599,6 +603,8 @@ org-ref, and tries to download the corresponding pdf."
   (interactive "sDOI :")
   (insert (doi-utils-doi-to-bibtex-string doi))
   (backward-char)
   (interactive "sDOI :")
   (insert (doi-utils-doi-to-bibtex-string doi))
   (backward-char)
+  ;; set date added for the record
+  (bibtex-set-field "DATE_ADDED" (current-time-string))
   (if (bibtex-key-in-head nil)
        (org-ref-clean-bibtex-entry t)
      (org-ref-clean-bibtex-entry))
   (if (bibtex-key-in-head nil)
        (org-ref-clean-bibtex-entry t)
      (org-ref-clean-bibtex-entry))
@@ -606,6 +612,7 @@ org-ref, and tries to download the corresponding pdf."
    (doi-utils-get-bibtex-entry-pdf)
    (save-selected-window
      (org-ref-open-bibtex-notes)))
    (doi-utils-get-bibtex-entry-pdf)
    (save-selected-window
      (org-ref-open-bibtex-notes)))
+
 #+END_SRC
 
 It may be you are in some other place when you want to add a bibtex entry. This next function will open the first entry in org-ref-default-bibliography go to the end, and add the entry. You can sort it later.
 #+END_SRC
 
 It may be you are in some other place when you want to add a bibtex entry. This next function will open the first entry in org-ref-default-bibliography go to the end, and add the entry. You can sort it later.
@@ -687,7 +694,7 @@ There is not bibtex set field function, so I wrote this one.
       (insert value))))
 #+END_SRC
 
       (insert value))))
 #+END_SRC
 
-The updating function looks like this. We get all the keys from the json plist metadata, and update the fields if they exist.
+The updating function for a whole entry looks like this. We get all the keys from the json plist metadata, and update the fields if they exist.
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun plist-get-keys (plist)
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun plist-get-keys (plist)
@@ -741,6 +748,29 @@ The updating function looks like this. We get all the keys from the json plist m
       (org-ref-clean-bibtex-entry t)
     (org-ref-clean-bibtex-entry)))
 #+END_SRC
       (org-ref-clean-bibtex-entry t)
     (org-ref-clean-bibtex-entry)))
 #+END_SRC
+
+A downside to updating an entry is it overwrites what you have already fixed. So, we next develop a function to update the field at point.
+
+#+BEGIN_SRC emacs-lisp
+(defun doi-utils-update-field ()
+  (interactive)
+  (let* ((doi (bibtex-autokey-get-field "doi"))
+        (results (doi-utils-get-json-metadata doi))
+        (field (car (bibtex-find-text-internal nil nil ","))))
+    (cond
+     ((string= field "volume")
+      (bibtex-set-field field (plist-get results :volume)))
+     ((string= field "number")
+      (bibtex-set-field field (plist-get results :issue)))
+     ((string= field "pages")
+      (bibtex-set-field field (plist-get results :page)))
+     ((string= field "year")
+      (bibtex-set-field field (plist-get results :year)))
+     (t
+      (message "%s not supported yet." field)))))
+#+END_SRC
+
+
 * DOI functions for WOS
 I came across this API http://wokinfo.com/media/pdf/OpenURL-guide.pdf to make links to the things I am interested in here. Based on that document, here are three links based on a doi:10.1021/jp047349j that take you to different Web Of Science (WOS) pages.
 
 * DOI functions for WOS
 I came across this API http://wokinfo.com/media/pdf/OpenURL-guide.pdf to make links to the things I am interested in here. Based on that document, here are three links based on a doi:10.1021/jp047349j that take you to different Web Of Science (WOS) pages.
 
@@ -960,6 +990,31 @@ error."
 
 
 
 
 
 
+* Debugging a DOI
+I wrote this function to help debug a DOI. This function generates an org-buffer with the doi, gets the json metadata, shows the bibtex entry, and the pdf link for it.
+
+#+BEGIN_SRC emacs-lisp :tangle doi-utils.el
+(defun doi-utils-debug (doi)
+  "Generate an org-buffer showing data about DOI."
+  (interactive "sDOI: ")
+  (switch-to-buffer "*debug-doi*")
+  (erase-buffer)
+  (org-mode)
+  (insert (concat "doi:" doi) "\n\n")
+  (insert "* JSON
+" (format "%s" (doi-utils-get-json-metadata doi)) "
+
+* Bibtex
+
+" (doi-utils-doi-to-bibtex-string doi) "
+
+* PDF
+" (doi-utils-get-pdf-url doi)))
+#+END_SRC
+
+#+RESULTS:
+: doi-utils-debug
+
 * 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.
 
 * 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.