|
;;; org-ref-scopus.el --- Emacs-lisp interface to the Scopus API -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 2015 John Kitchin
|
|
|
|
;; Author: John Kitchin <jkitchin@andrew.cmu.edu>
|
|
;; Keywords:
|
|
|
|
;; This program is free software; you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; This program is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
;; See http://dev.elsevier.com/index.html for more information about the Scopus API
|
|
;;
|
|
;; New org-links:
|
|
;; eid:2-s2.0-72649092395 with a hydra menu
|
|
;; [[scopus-search:alloy Au segregation]]
|
|
;; [[scopus-advanced-search:au-id(24176978500)]]
|
|
|
|
;;; Code:
|
|
|
|
(require 'org)
|
|
(require 'hydra)
|
|
(require 'xml)
|
|
(require 'org-ref-utils)
|
|
|
|
(defvar url-request-method)
|
|
(defvar url-mime-accept-string)
|
|
(defvar url-http-end-of-headers)
|
|
(defvar url-request-extra-headers)
|
|
|
|
(defvar *scopus-api-key* nil
|
|
"Your Scopus API key.
|
|
You need to set this in your init files. Get a key here:
|
|
http://dev.elsevier.com/myapikey.html.")
|
|
|
|
|
|
;; (defun scopus-doi-to-xml (doi)
|
|
;; "Return a parsed xml from the Scopus article retrieval api for DOI.
|
|
;; This does not always seem to work for the most recent DOIs."
|
|
;; (let* ((url-request-method "GET")
|
|
;; (url-request-extra-headers (list (cons "X-ELS-APIKey" *scopus-api-key*)))
|
|
;; (url (format "http://api.elsevier.com/content/article/doi/%s" doi))
|
|
;; (xml))
|
|
;; (setq xml
|
|
;; (with-current-buffer (url-retrieve-synchronously url)
|
|
;; (xml-parse-region url-http-end-of-headers (point-max))))
|
|
;; (if (eq 'service-error (caar xml))
|
|
;; (progn (message-box "%s\n%s\n%s" doi url xml)
|
|
;; nil)
|
|
;; xml)))
|
|
|
|
(defun scopus-doi-to-eid (doi)
|
|
"Get a Scopus eid from a DOI.
|
|
Requires `*scopus-api-key*' to be defined."
|
|
(unless *scopus-api-key* (error "You must define `*scopus-api-key*'"))
|
|
(let* ((url-request-method "GET")
|
|
(url-mime-accept-string "application/xml")
|
|
(url-request-extra-headers (list (cons "X-ELS-APIKey" *scopus-api-key*)
|
|
'("field" . "eid")))
|
|
(url (format "http://api.elsevier.com/content/search/scopus?query=doi(%s)" doi))
|
|
(xml (with-current-buffer (url-retrieve-synchronously url)
|
|
(xml-parse-region url-http-end-of-headers (point-max))))
|
|
(results (car xml))
|
|
(entry (car (xml-get-children results 'entry))))
|
|
(car (xml-node-children (car (xml-get-children entry 'eid))))))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-related-by-keyword-url (doi)
|
|
"Return a Scopus url to articles related by keyword for DOI."
|
|
(interactive)
|
|
(unless *scopus-api-key* (error "You must define `*scopus-api-key*'"))
|
|
(let ((eid (scopus-doi-to-eid doi)))
|
|
(when eid (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=key&zone=relatedDocuments" eid))))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-related-by-author-url (doi)
|
|
"Return a Scopus url to articles related by author for DOI."
|
|
(interactive)
|
|
(unless *scopus-api-key* (error "You must define `*scopus-api-key*'"))
|
|
(let ((eid (scopus-doi-to-eid doi)))
|
|
(when eid (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=aut&zone=relatedDocuments" eid))))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-related-by-references-url (doi)
|
|
"Return a Scopus url to articles related by references for DOI."
|
|
(interactive)
|
|
(unless *scopus-api-key* (error "You must define `*scopus-api-key*'"))
|
|
(let ((eid (scopus-doi-to-eid doi)))
|
|
(when eid (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=ref&zone=relatedDocuments" eid))))
|
|
|
|
|
|
(defun scopus-citing-url (doi)
|
|
"Return a Scopus url to articles citing DOI."
|
|
(format "http://www.scopus.com/results/citedbyresults.url?sort=plf-f&cite=%s&src=s&imp=t&sot=cite&sdt=a&sl=0&origin=recordpage" (scopus-doi-to-eid doi)))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-open-eid (eid)
|
|
"Open article with EID in browser."
|
|
(interactive "sEID: ")
|
|
(browse-url (format "http://www.scopus.com/record/display.url?eid=%s&origin=resultslist" eid)))
|
|
|
|
|
|
(defun scopus ()
|
|
"Open http://scopus.com is a browser."
|
|
(browse-url "http://www.scopus.com"))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-basic-search (query)
|
|
"Open QUERY as a basic title-abstract-keyword search at scopus.com."
|
|
(interactive "sQuery: ")
|
|
(browse-url
|
|
(format
|
|
"http://www.scopus.com/results/results.url?sort=plf-f&src=s&sot=b&sdt=b&sl=%s&s=TITLE-ABS-KEY%%28%s%%29&origin=searchbasic"
|
|
(length (url-unhex-string (concat "TITLE-ABS-KEY%28" (url-hexify-string query) "%29")))
|
|
(url-hexify-string query))))
|
|
|
|
|
|
;;;###autoload
|
|
(defun scopus-advanced-search (query)
|
|
"Open QUERY as an advanced search at scopus.com."
|
|
(interactive "sQuery: ")
|
|
(browse-url
|
|
(format
|
|
"http://www.scopus.com/results/results.url?sort=plf-f&src=s&sot=a&sdt=a&sl=%s&s=%s&origin=searchadvanced"
|
|
(length query)
|
|
(url-hexify-string query))))
|
|
|
|
|
|
;;; Org-mode EID link and an action menu
|
|
;; These functions use a global var *hydra-eid*
|
|
(defvar *hydra-eid* nil
|
|
"Global variable to pass an EID from an ‘org-mode’ link to a hydra function.")
|
|
|
|
|
|
(defhydra scopus-hydra (:color blue)
|
|
("o" (scopus-open-eid *hydra-eid*) "Open in Scopus")
|
|
("a" (browse-url (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=aut&zone=relatedDocuments" *hydra-eid*))
|
|
"Related by author")
|
|
("k" (browse-url (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=key&zone=relatedDocuments" *hydra-eid*))
|
|
"Related by keyword")
|
|
("r" (browse-url (format "http://www.scopus.com/search/submit/mlt.url?eid=%s&src=s&all=true&origin=recordpage&method=ref&zone=relatedDocuments" *hydra-eid*))
|
|
"Related by references")
|
|
("c" (browse-url (format "http://www.scopus.com/results/citedbyresults.url?sort=plf-f&cite=%s&src=s&imp=t&sot=cite&sdt=a&sl=0&origin=recordpage" *hydra-eid*))
|
|
"Citing articles"))
|
|
|
|
|
|
(org-ref-link-set-parameters "eid"
|
|
:follow (lambda (eid)
|
|
"Opens the hydra menu."
|
|
(setq *hydra-eid* eid)
|
|
(scopus-hydra/body))
|
|
:export (lambda (keyword desc format)
|
|
(cond
|
|
((eq format 'html)
|
|
(format "<a href=\" http://www.scopus.com/record/display.url?eid=%s&origin=resultslist\">%s</a>" keyword (or desc keyword)))
|
|
((eq format 'latex)
|
|
(format "\\href{http://www.scopus.com/record/display.url?eid=%s&origin=resultslist}{%s}"
|
|
keyword (or desc keyword))))))
|
|
|
|
|
|
(org-ref-link-set-parameters "scopus-search"
|
|
:follow (lambda (query)
|
|
(scopus-basic-search query))
|
|
:export (lambda (query desc format)
|
|
(let ((url (format
|
|
"http://www.scopus.com/results/results.url?sort=plf-f&src=s&sot=b&sdt=b&sl=%s&s=TITLE-ABS-KEY%%28%s%%29&origin=searchbasic"
|
|
(length (url-unhex-string (concat "TITLE-ABS-KEY%28" (url-hexify-string query) "%29")))
|
|
(url-hexify-string query))))
|
|
(cond
|
|
((eq format 'html)
|
|
(format "<a href=\"%s\">%s</a>" url (or desc query)))
|
|
((eq format 'latex)
|
|
(format "\\href{%s}{%s}" url (or desc query)))))))
|
|
|
|
(org-ref-link-set-parameters "scopus-advanced-search"
|
|
:follow (lambda (query)
|
|
(scopus-advanced-search query))
|
|
:export (lambda (query desc format)
|
|
(let ((url (format
|
|
"http://www.scopus.com/results/results.url?sort=plf-f&src=s&sot=a&sdt=a&sl=%s&s=%s&origin=searchadvanced"
|
|
(length (url-hexify-string query))
|
|
(url-hexify-string query))))
|
|
(cond
|
|
((eq format 'html)
|
|
(format "<a href=\"%s\">%s</a>" url (or desc query)))
|
|
((eq format 'latex)
|
|
(format "\\href{%s}{%s}" url (or desc query)))))))
|
|
|
|
(org-ref-link-set-parameters "scopusid"
|
|
:follow (lambda
|
|
(link-string)
|
|
(browse-url
|
|
(format
|
|
"http://www.scopus.com/authid/detail.url?origin=AuthorProfile&authorId=%s"
|
|
link-string)))
|
|
:export (lambda (keyword desc format)
|
|
(cond
|
|
((eq format 'latex)
|
|
(format "\\href{http://www.scopus.com/authid/detail.url?origin=AuthorProfile&authorId=%s}{%s}"
|
|
keyword (or desc (concat "scopusid:" keyword))))
|
|
((eq format 'html)
|
|
(format "<a href=\"http://www.scopus.com/authid/detail.url?origin=AuthorProfile&authorId=%s\">%s</a>"
|
|
keyword (or desc (concat "scopusid:" keyword)))))))
|
|
|
|
|
|
(provide 'org-ref-scopus)
|
|
;;; org-ref-scopus.el ends here
|