X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=doi-utils.org;h=8a9eac00b1295c1c23dc70650422c82720207cee;hp=e0ab22b1cd315e1601fbb1baba4c4651a227880e;hb=dbcde4944ae0a1b4ca977b9b8eb41a1cb56267c3;hpb=0ba84f080814325b87ce0f6782da9bdedd471442 diff --git a/doi-utils.org b/doi-utils.org index e0ab22b..8a9eac0 100644 --- a/doi-utils.org +++ b/doi-utils.org @@ -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 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) - "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))) - (format "%s" results) ; json-data + ;(format "%s" results) ; json-data (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: @@ -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) + ;; 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)) @@ -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))) + #+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 -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) @@ -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 + +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. @@ -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.