Files
emacs.d/elpa/org-ref-20180608.1130/org-ref-scopus.el
Mateus Pinto Rodrigues f6ec2ebf59 Update packages/ Add org-ref
2018-06-11 13:50:46 -03:00

223 lines
9.0 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; 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