From dbf4fc3bfed591ebffab129abc3ad6359bea97fa Mon Sep 17 00:00:00 2001 From: John Kitchin Date: Mon, 2 Mar 2015 09:20:18 -0500 Subject: [PATCH] uses defpar which causes an issue on loading for me. reverting until this is tested better. Revert "Merge pull request #17 from OlafMerkert/master" This reverts commit 76d034e93e50bd1765bcfe66dff7049db8df8963, reversing changes made to 5daa3edea34cadf60484be3d8c613275b3edbb9b. --- doi-utils.org | 192 +++++++++++++++++--------------------------------- 1 file changed, 65 insertions(+), 127 deletions(-) diff --git a/doi-utils.org b/doi-utils.org index e806fcf..c18345d 100644 --- a/doi-utils.org +++ b/doi-utils.org @@ -436,15 +436,7 @@ For example: #+END_SRC #+RESULTS: -| :member | http://id.crossref.org/member/16 | :volume | 99 | :indexed | (:timestamp 1423435577602 :date-parts [[2015 2 8]]) | :publisher | American Physical Society (APS) | :source | CrossRef | :URL | http://dx.doi.org/10.1103/PhysRevLett.99.016105 | :ISSN | [0031-9007 1079-7114] | :DOI | 10.1103/physrevlett.99.016105 | :type | journal-article | :title | Scaling Properties of Adsorption Energies for Hydrogen-Containing Molecules on Transition-Metal Surfaces | :issue | 1 | :deposited | (:timestamp 1313712000000 :date-parts [[2011 8 19]]) | :reference-count | 26 | :container-title | Phys. Rev. Lett. | :author | [(:given F. :family Abild-Pedersen) (:given J. :family Greeley) (:given F. :family Studt) (:given J. :family Rossmeisl) (:given T. :family Munter) (:given P. :family Moses) (:given E. :family Skúlason) (:given T. :family Bligaard) (:given J. :family Nørskov)] | :prefix | http://id.crossref.org/prefix/10.1103 | :score | 1.0 | :issued | (:date-parts [[2007 7]]) | :subject | [Physics and Astronomy(all)] | :subtitle | [] | - -or for a book: -#+BEGIN_SRC emacs-lisp :tangle no -(doi-utils-get-json-metadata "10.1007/978-1-4612-4968-9") -#+END_SRC - -#+RESULTS: -| :member | nil | :indexed | (:timestamp 1423773021494 :date-parts [[2015 2 12]]) | :publisher | Springer New York | :source | CrossRef | :URL | http://dx.doi.org/10.1007/978-1-4612-4968-9 | :ISBN | [http://id.crossref.org/isbn/978-0-387-96347-1 http://id.crossref.org/isbn/978-1-4612-4968-9] | :ISSN | [0172-6056] | :DOI | 10.1007/978-1-4612-4968-9 | :type | book | :title | Constructive Combinatorics | :deposited | (:timestamp 1378684800000 :date-parts [[2013 9 9]]) | :reference-count | 0 | :container-title | Undergraduate Texts in Mathematics | :author | [(:given Dennis :family Stanton) (:given Dennis :family White)] | :prefix | none | :score | 1.0 | :issued | (:date-parts [[1986]]) | :subtitle | [] | +| :volume | 99 | :indexed | (:timestamp 1399964115538.0 :date-parts [[2014 5 13]]) | :publisher | American Physical Society (APS) | :source | CrossRef | :URL | http://dx.doi.org/10.1103/PhysRevLett.99.016105 | :ISSN | [0031-9007 1079-7114] | :DOI | 10.1103/physrevlett.99.016105 | :type | journal-article | :title | Scaling Properties of Adsorption Energies for Hydrogen-Containing Molecules on Transition-Metal Surfaces | :issue | 1 | :deposited | (:timestamp 1313712000000.0 :date-parts [[2011 8 19]]) | :reference-count | 26 | :container-title | Phys. Rev. Lett. | :author | [(:given F. :family Abild-Pedersen) (:given J. :family Greeley) (:given F. :family Studt) (:given J. :family Rossmeisl) (:given T. :family Munter) (:given P. :family Moses) (:given E. :family Skúlason) (:given T. :family Bligaard) (:given J. :family Nørskov)] | :prefix | http://id.crossref.org/prefix/10.1103 | :score | 1.0 | :issued | (:date-parts [[2007 7]]) | :subject | [Physics and Astronomy(all)] | :subtitle | [] | We can use that data to construct a bibtex entry. We do that by defining a template, and filling it in. I wrote this template expansion code which makes it easy to substitute values like %{} in emacs lisp. @@ -459,97 +451,63 @@ We can use that data to construct a bibtex entry. We do that by defining a templ Now we define a function that fills in that template from the metadata. -As different bibtex types share common keys, it is advantageous to separate data extraction from json, and the formatting of the bibtex entry. - -#+BEGIN_SRC emacs-lisp :notangle doi-utils.el -(defmacro defpar (name &optional value) - `(progn (defvar ,name) - (setf ,name ,value))) - -(defpar doi-utils-json-metadata-extract - '((type (plist-get results :type)) - (author (mapconcat (lambda (x) (concat (plist-get x :given) " " (plist-get x :family))) - (plist-get results :author) " and ")) - (title (plist-get results :title)) - (subtitle (plist-get results :subtitle)) - (journal (plist-get results :container-title)) - (series (plist-get results :container-title)) - (publisher (plist-get results :publisher)) - (volume (plist-get results :volume)) - (issue (plist-get results :issue)) - (number (plist-get results :issue)) - (year (elt (elt (plist-get (plist-get results :issued) :date-parts) 0) 0)) - (month (elt (elt (plist-get (plist-get results :issued) :date-parts) 0) 1)) - (pages (plist-get results :page)) - (doi (plist-get results :DOI)) - (url (plist-get results :URL)) - (booktitle (plist-get results :container-title)))) -#+END_SRC - -Next, we need to define the different bibtex types. Each type has a bibtex type (for output) and the type as provided in the doi record. Finally, we have to declare the fields we want to output. - -#+BEGIN_SRC emacs-lisp :tangle doi-utils.el :results none -(defpar doi-utils-bibtex-type-generators nil) - -(defun concat-prepare (lst &optional acc) - "Given a list `lst' of strings and other expressions, which are -intented to passed to `concat', concat any subsequent strings, -minimising the number of arguments being passed to `concat' -without changing the results." - (cond ((null lst) (nreverse acc)) - ((and (stringp (car lst)) - (stringp (car acc))) - (concat-prepare (cdr lst) (cons (concat (car acc) (car lst)) - (cdr acc)))) - (t (concat-prepare (cdr lst) (cons (car lst) acc))))) - - -(defmacro doi-utils-def-bibtex-type (name matching-types &rest fields) - "Define a BibTeX type identified by (symbol) `name' with -`fields' (given as symbols), matching to retrieval expressions in -`doi-utils-json-metadata-extract'. This type will only be used -when the `:type' parameter in the JSON metadata is contained in -`matching-types' - a list of strings." - `(push (lambda (type results) - (when (or ,@(mapcar (lambda (match-type) `(string= type ,match-type)) matching-types)) - (let ,(mapcar (lambda (field) - (let ((field-expr (assoc field doi-utils-json-metadata-extract))) - (if field-expr - ;; need to convert to string first - `(,(car field-expr) (format "%s" ,(cadr field-expr))) - (error "unknown bibtex field type %s" field)))) - fields) - (concat - ,@(concat-prepare - (-flatten - (list (concat "@" (symbol-name name) "{,\n") - ;; there seems to be some bug with mapcan, - ;; so we fall back to flatten - (mapcar (lambda (field) - `(" " ,(symbol-name field) " = {" ,field "},\n")) - fields) - "}\n"))))))) - doi-utils-bibtex-type-generators)) - -(doi-utils-def-bibtex-type article ("journal-article" "article-journal") - author title journal year volume number pages doi url) - -(doi-utils-def-bibtex-type inproceedings ("proceedings-article") - author title booktitle year month pages doi url) - -(doi-utils-def-bibtex-type book ("book") - author title 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 :notangle doi-utils.el +#+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" - (let* ((results (doi-utils-get-json-metadata doi)) - (type (plist-get results :type))) - (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)))) + (let (type + results + author + title + booktitle + journal + year + volume + number + pages + month + url + json-data) + (setq results (doi-utils-get-json-metadata doi) + json-data (format "%s" results) + type (plist-get results :type) + author (mapconcat (lambda (x) (concat (plist-get x :given) " " (plist-get x :family))) + (plist-get results :author) " and ") + title (plist-get results :title) + journal (plist-get results :container-title) + volume (plist-get results :volume) + issue (plist-get results :issue) + year (elt (elt (plist-get (plist-get results :issued) :date-parts) 0) 0) + pages (plist-get results :page) + doi (plist-get results :DOI) + url (plist-get results :URL)) + (cond + ((or (string= type "journal-article") (string= type "article-journal")) + (doi-utils-expand-template "@article{, + author = {%{author}}, + title = {%{title}}, + journal = {%{journal}}, + year = {%{year}}, + volume = {%{volume}}, + number = {%{issue}}, + pages = {%{pages}}, + 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 #+RESULTS: @@ -563,35 +521,15 @@ To see that in action: #+RESULTS: #+begin_example @article{, - author = {F. Abild-Pedersen and J. Greeley and F. Studt and J. Rossmeisl and T. Munter and P. Moses and E. Skúlason and T. Bligaard and J. Nørskov}, - title = {Scaling Properties of Adsorption Energies for Hydrogen-Containing Molecules on Transition-Metal Surfaces}, - journal = {Phys. Rev. Lett.}, - year = {2007}, - volume = {99}, - number = {1}, - pages = {nil}, - doi = {10.1103/physrevlett.99.016105}, - url = {http://dx.doi.org/10.1103/PhysRevLett.99.016105}, -} -#+end_example - -and for a book: - -#+BEGIN_SRC emacs-lisp :tangle no -(doi-utils-doi-to-bibtex-string "10.1007/978-1-4612-4968-9") -#+END_SRC - -#+RESULTS: -#+begin_example -@book{, - author = {Dennis Stanton and Dennis White}, - title = {Constructive Combinatorics}, - series = {Undergraduate Texts in Mathematics}, - publisher = {Springer New York}, - year = {1986}, - pages = {nil}, - doi = {10.1007/978-1-4612-4968-9}, - url = {http://dx.doi.org/10.1007/978-1-4612-4968-9}, + author = {F. Abild-Pedersen and J. Greeley and F. Studt and J. Rossmeisl and T. Munter and P. Moses and E. Skúlason and T. Bligaard and J. Nørskov}, + title = {Scaling Properties of Adsorption Energies for Hydrogen-Containing Molecules on Transition-Metal Surfaces}, + journal = {Phys. Rev. Lett.}, + year = {2007}, + volume = {99}, + number = {1}, + pages = {nil}, + doi = {10.1103/physrevlett.99.016105}, + url = {http://dx.doi.org/10.1103/PhysRevLett.99.016105}, } #+end_example -- 2.39.2