]> git.donarmstrong.com Git - org-ref.git/blobdiff - doi-utils.org
add date added to the entry
[org-ref.git] / doi-utils.org
index e806fcf1c7700414931994c787eb7cec7ca5dbe9..8428cc8358ee8c02ddc8efb4a416bd06fa507918 100644 (file)
@@ -461,37 +461,33 @@ 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))))
+#+BEGIN_SRC emacs-lisp :tangle doi-utils.el
+(setq 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)
+(setq doi-utils-bibtex-type-generators nil)
 
-(defun concat-prepare (lst &optional acc)
+(defun doi-utils-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'
@@ -499,10 +495,9 @@ 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))
+         (doi-utils-concat-prepare (cdr lst) (cons (concat (car acc) (car lst))
                                          (cdr acc))))
-        (t (concat-prepare (cdr lst) (cons (car lst) acc)))))
-
+        (t (doi-utils-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
@@ -520,7 +515,7 @@ when the `:type' parameter in the JSON metadata is contained in
                                    (error "unknown bibtex field type %s" field))))
                            fields)
                (concat
-                ,@(concat-prepare
+                ,@(doi-utils-concat-prepare
                    (-flatten
                     (list (concat "@" (symbol-name name) "{,\n")
                           ;; there seems to be some bug with mapcan,
@@ -539,17 +534,21 @@ when the `:type' parameter in the JSON metadata is contained in
 
 (doi-utils-def-bibtex-type book ("book")
                            author title series publisher year pages doi url)
+
+(doi-utils-def-bibtex-type inbook ("book-chapter")
+                           author title booktitle 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"
+  "return a bibtex entry as a string for the doi. Not all types are supported yet."
   (let* ((results (doi-utils-get-json-metadata doi))
          (type (plist-get results :type)))
-    (format "%s" results) ; json-data
+    ;(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))))
+        (message "%s not supported yet\n%S." type results))))
 #+END_SRC
 
 #+RESULTS:
@@ -604,6 +603,8 @@ org-ref, and tries to download the corresponding pdf."
   (interactive "sDOI :")
   (insert (doi-utils-doi-to-bibtex-string doi))
   (backward-char)
+  ;; set date added for the record
+  (bibtex-set-field "DATE_ADDED" (current-time-string))
   (if (bibtex-key-in-head nil)
        (org-ref-clean-bibtex-entry t)
      (org-ref-clean-bibtex-entry))
@@ -611,6 +612,7 @@ org-ref, and tries to download the corresponding pdf."
    (doi-utils-get-bibtex-entry-pdf)
    (save-selected-window
      (org-ref-open-bibtex-notes)))
+
 #+END_SRC
 
 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.