Klimi's new dotfiles with stow.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

222 lines
9.0 KiB

;;; 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