]> git.donarmstrong.com Git - org-ref.git/blobdiff - doi-utils.org
remove limitations description in bibtex entry.
[org-ref.git] / doi-utils.org
index fa499763c910a7871bf2d8dbd2564de1458f8c74..5e539dbff3147bee8be0b3535df4e62a83255b68 100644 (file)
@@ -335,14 +335,14 @@ until one is found"
 : doi-utils-get-pdf-url
 
 
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (doi-utils-get-pdf-url "10.1126/science.1158722")
 #+END_SRC
 
 #+RESULTS:
 : http://www.sciencemag.org/content/321/5890/792.full.pdf
 
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (doi-utils-get-pdf-url  "10.1021/nl500037x")
 #+END_SRC
 
@@ -350,7 +350,7 @@ until one is found"
 : http://pubs.acs.org/doi/pdf/10.1021/nl500037x
 
 
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (doi-utils-get-pdf-url  "10.1002/anie.201402680")
 #+END_SRC
 
@@ -411,20 +411,24 @@ I [[http://homepages.see.leeds.ac.uk/~eeaol/notes/2013/02/doi-metadata/][found]]
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (defun doi-utils-get-json-metadata (doi)
+
   (let ((url-request-method "GET") 
-       (url-mime-accept-string "application/citeproc+json")
-       (json-object-type 'plist))
+       (url-mime-accept-string "application/citeproc+json")
+       (json-object-type 'plist)
+       (json-data))
     (with-current-buffer
        (url-retrieve-synchronously
         (concat "http://dx.doi.org/" doi))
-      (json-read-from-string (buffer-substring url-http-end-of-headers (point-max))))))       
+      (setq json-data (buffer-substring url-http-end-of-headers (point-max)))
+      (message "%s" json-data)
+      (json-read-from-string json-data))))
 #+END_SRC
 
 #+RESULTS:
 : doi-utils-get-json-metadata
 
 For example:
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (doi-utils-get-json-metadata "10.1103/PhysRevLett.99.016105")
 #+END_SRC
 
@@ -451,6 +455,7 @@ Now we define a function that fills in that template from the metadata.
        results
        author
        title
+       booktitle
        journal
        year
        volume
@@ -473,7 +478,7 @@ Now we define a function that fills in that template from the metadata.
          doi (plist-get results :DOI)
          url (plist-get results :URL))
     (cond
-     ((string= type "journal-article")
+     ((or (string= type "journal-article") (string= type "article-journal"))
       (doi-utils-expand-template "@article{,
   author =      {%{author}},
   title =       {%{title}},
@@ -485,6 +490,20 @@ Now we define a function that fills in that template from the metadata.
   doi =          {%{doi}},
   url =          {%{url}},
 }"))
+     
+     ((string= type "proceedings-article")
+      (setq booktitle (plist-get results :container-title))
+      (doi-utils-expand-template "@inproceedings{,
+  author =      {%{author}},
+  title =       {%{title}},
+  booktitle =    {%{booktitle}},
+  year =        {%{year}},
+  month =       {%{month}},
+  pages =       {%{pages}},
+  doi =          {%{doi}},
+  url =          {%{url}},
+}"))
+     
     (t (message-box "%s not supported yet." type)))))
 #+END_SRC
 
@@ -492,7 +511,7 @@ Now we define a function that fills in that template from the metadata.
 : doi-utils-doi-to-bibtex-string
 
 To see that in action:
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (doi-utils-doi-to-bibtex-string "10.1103/PhysRevLett.99.016105")
 #+END_SRC
 
@@ -532,13 +551,23 @@ org-ref, and tries to download the corresponding pdf."
 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.
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
-(defun doi-utils-add-bibtex-entry-from-doi (doi)
-  "add entry to end of first entry in `org-ref-default-bibliography'."
-  (interactive "sDOI: ")
-  (find-file (car org-ref-default-bibliography))
-  (end-of-buffer)
-  (insert "\n\n")
-  (doi-utils-insert-bibtex-entry-from-doi doi))
+(defun doi-utils-add-bibtex-entry-from-doi (doi bibfile)
+  "add entry to end of a file in `org-ref-default-bibliography' or in the current directory ending with .bib."
+  (interactive
+   (list
+    (read-string "DOI: ")
+    (ido-completing-read
+     "Bibfile: "
+     (append org-ref-default-bibliography
+            (f-entries "." (lambda (f) (f-ext? f "bib")))))))
+  (find-file bibfile)
+  (goto-char (point-min))
+  (if (search-forward doi nil t)
+      (message "%s is already in this file" doi)
+    (end-of-buffer)
+    (insert "\n\n")
+    (doi-utils-insert-bibtex-entry-from-doi doi)
+    (save-buffer)))
 #+END_SRC
 
 It may be you want to just highlight a doi, and then add it. Here is that function.
@@ -563,7 +592,7 @@ I wrote this code because it is pretty common for me to copy bibtex entries from
 There is not bibtex set field function, so I wrote this one.
 
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
-(defun bibtex-set-field (field value)
+(defun bibtex-set-field (field value &optional nodelim)
   "set field to value in bibtex file. create field if it does not exist"
   (interactive "sfield: \nsvalue: ")
   (bibtex-beginning-of-entry)
@@ -574,7 +603,7 @@ There is not bibtex set field function, so I wrote this one.
          (goto-char (car (cdr found)))
          (when value
            (bibtex-kill-field)
-           (bibtex-make-field field)
+           (bibtex-make-field field nil nil nodelim)
            (backward-char)
            (insert value)))
       ;; make a new field
@@ -583,7 +612,7 @@ There is not bibtex set field function, so I wrote this one.
       (forward-line) (beginning-of-line)
       (bibtex-next-field nil)
       (forward-char)
-      (bibtex-make-field field)
+      (bibtex-make-field field nil nil nodelim)
       (backward-char)
       (insert value))))
 #+END_SRC
@@ -642,12 +671,144 @@ 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
+* 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.
+
+
+1. go to article in WOS: http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info:doi/10.1021/jp047349j
+2. citing articles: http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info%3Adoi%2F10.1021/jp047349j&svc_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Asch_svc&svc.citing=yes
+3. related articles: http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info%3Adoi%2F10.1021/jp047349j&svc_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Asch_svc&svc.related=yes
+
+These are pretty easy to construct, so we can write functions that will create them and open the url in our browser. There are some other options that could be considered, but since we usually have a doi, it seems like the best way to go for creating the links. Here are the functions.
+
+#+BEGIN_SRC emacs-lisp  :tangle doi-utils.el
+(defun doi-utils-wos (doi)
+  "Open Web of Science entry for DOI"
+  (interactive "sDOI: ")
+  (browse-url
+   (format
+    "http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info:doi/%s" doi)))
+
+(defun doi-utils-wos-citing (doi)
+  "Open Web of Science citing articles entry. May be empty if none are found"
+  (interactive "sDOI: ")
+  (browse-url
+   (concat
+    "http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info%3Adoi%2F"
+    doi
+    "&svc_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Asch_svc&svc.citing=yes")))
+
+(defun doi-utils-wos-related (doi)
+  "Open Web of Science related articles page."
+  (interactive "sDOI: ")
+  (browse-url
+   (concat "http://ws.isiknowledge.com/cps/openurl/service?url_ver=Z39.88-2004&rft_id=info%3Adoi%2F"
+          doi
+          "&svc_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Asch_svc&svc.related=yes")))
+
+#+END_SRC
+
+* A new doi link for org-mode
+The idea is to add a menu to the doi link, so rather than just clicking to open the article, you can do other things.
+1. open doi
+2. open in wos
+3. open citing articles
+4. open related articles
+5. open bibtex entry
+6. get bibtex entry
+
+#+BEGIN_SRC emacs-lisp :tangle doi-utils.el :results silent
+(defun doi-utils-open (doi)
+ (interactive "sDOI: ")
+ (browse-url (concat "http://dx.doi.org/" doi)))
+
+
+(defun doi-utils-open-bibtex (doi)
+  "Search through `reftex-default-bibliography' for DOI."
+  (interactive "sDOI: ")
+  (catch 'file
+    (dolist (f reftex-default-bibliography)
+      (find-file f)
+      (when (search-forward doi (point-max) t)
+       (bibtex-beginning-of-entry)
+       (throw 'file t)))))
+
+
+(defun doi-utils-crossref (doi)
+  "Search DOI in CrossRef."
+  (interactive "sDOI: ")
+  (browse-url
+   (format
+    "http://search.crossref.org/?q=%s" doi)))
+
+
+(defun doi-utils-google-scholar (doi)
+  "Google scholar the word at point or selection."
+  (interactive "sDOI: ")
+  (browse-url
+   (format
+    "http://scholar.google.com/scholar?q=%s" doi)))
+
+
+(defun doi-utils-pubmed (doi)
+  "Pubmed the word at point or selection."
+  (interactive "sDOI: ")
+  (browse-url
+   (format
+    "http://www.ncbi.nlm.nih.gov/pubmed/?term=%s"
+    (url-hexify-string doi))))
+
+
+(defvar doi-link-menu-funcs '()
+ "Functions to run in doi menu. Each entry is a list of (key menu-name function). 
+The function must take one argument, the doi.")
+
+(setq doi-link-menu-funcs
+      '(("o" "pen" doi-utils-open)
+       ("w" "os" doi-utils-wos)
+       ("c" "iting articles" doi-utils-wos-citing)
+       ("r" "elated articles" doi-utils-wos-related)
+        ("s" "Google Scholar" doi-utils-google-scholar)
+        ("f" "CrossRef" doi-utils-crossref)
+        ("p" "ubmed" doi-utils-pubmed)
+       ("b" "open in bibtex" doi-utils-open-bibtex)
+       ("g" "et bibtex entry" doi-utils-add-bibtex-entry-from-doi)))
+
+
+(defun doi-link-menu (link-string)
+   "Generate the link menu message, get choice and execute it. 
+Options are stored in `doi-link-menu-funcs'."
+   (interactive)
+   (message
+   (concat
+    (mapconcat
+     (lambda (tup)
+       (concat "[" (elt tup 0) "]"
+              (elt tup 1) " "))
+     doi-link-menu-funcs "") ": "))
+   (let* ((input (read-char-exclusive))
+         (choice (assoc
+                  (char-to-string input) doi-link-menu-funcs)))
+     (when choice
+       (funcall
+       (elt 
+        choice
+        2)
+       link-string))))
+
+(org-add-link-type
+ "doi"
+ 'doi-link-menu)
+#+END_SRC
+
+doi:10.1021/jp047349j  
+
 * end of file
 #+BEGIN_SRC emacs-lisp :tangle doi-utils.el
 (provide 'doi-utils)
 #+END_SRC
 * load
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle no
 (org-babel-load-file "doi-utils.org")
 #+END_SRC