X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=doi-utils.org;h=a29996f6810caf99fed664eba77bf3da816567b1;hp=b6c54334efd2ba98cd856f7bbc79acbadfcc69c6;hb=471e52526e14ad47b0c663fde5799c855703af34;hpb=80a423fd2eee1220ad52a76ce9f3ad5580c7944c diff --git a/doi-utils.org b/doi-utils.org index b6c5433..a29996f 100644 --- a/doi-utils.org +++ b/doi-utils.org @@ -904,6 +904,7 @@ error." * Adding a bibtex entry from a crossref query +The idea here is to perform a query on Crossref, get a helm buffer of candidates, and select the entry(ies) you want to add to your bibtex file. You can select a region, e.g. a free form citation, or set of words, or you can type the query in by hand. #+BEGIN_SRC emacs-lisp :tangle doi-utils.el (defun doi-utils-add-entry-from-crossref-query (query bibtex-file) @@ -914,7 +915,9 @@ error." (cond ;; If region is active assume we want it ((region-active-p) - (buffer-substring (region-beginning) (region-end))) + (replace-regexp-in-string + "\n" " " + (buffer-substring (region-beginning) (region-end)))) ;; type or paste it in (t nil))) @@ -934,7 +937,9 @@ error." (setq json-string (buffer-substring url-http-end-of-headers (point-max))) (setq json-data (json-read-from-string json-string))) - (let* ((name (format "Crossref hits for %s" query)) + (let* ((name (format "Crossref hits for %s" + ;; remove carriage returns. they cause problems in helm. + (replace-regexp-in-string "\n" " " query))) (helm-candidates (mapcar (lambda (x) (cons (concat @@ -948,7 +953,7 @@ error." ;; just return the candidate (action . (("Insert bibtex entry" . (lambda (doi) (doi-utils-add-bibtex-entry-from-doi - (replace-regexp-in-string "^http://dx.doi.org/" "" doi)))) + (replace-regexp-in-string "^http://dx.doi.org/" "" doi) ,bibtex-file))) ("Open url" . (lambda (doi) (browse-url doi)))))))) (helm :sources '(source))))) @@ -1255,7 +1260,7 @@ I found this on the web. It can be handy, but the bibtex entry has a lot of stuf #+BEGIN_SRC emacs-lisp :tangle doi-utils.el (defun isbn-to-bibtex-lead (isbn) "Search lead.to for ISBN bibtex entry. You have to copy the entry if it is on the page to your bibtex file." - (interactive "ISBN: ") + (interactive "sISBN: ") (browse-url (format "http://lead.to/amazon/en/?key=%s+&si=all&op=bt&bn=&so=sa&ht=us" isbn))) #+END_SRC @@ -1267,15 +1272,16 @@ http://xisbn.worldcat.org/xisbnadmin/doc/api.htm#getmetadata #+BEGIN_SRC emacs-lisp :tangle doi-utils.el (defun isbn-to-bibtex (isbn bibfile) "Get bibtex entry for ISBN and insert it into BIBFILE unless an -entry with the generated key already exists in the file. " +entry with the generated key already exists in the file." (interactive (list (read-input "ISBN: " ;; now set initial input (cond - ;; If region is active assume we want it - ((region-active-p) + ;; If region is active and it starts with a number, we use it + ((and (region-active-p) + (s-match "^[0-9]" (buffer-substring (region-beginning) (region-end)))) (buffer-substring (region-beginning) (region-end))) ;; if first entry in kill ring starts with a number assume it is an isbn ;; and use it as the guess @@ -1301,9 +1307,12 @@ entry with the generated key already exists in the file. " (new-entry) (new-key)) + ;; check if we got something (unless (string= "ok" status) (error "Status is %s" status)) + ;; construct an alphabetically sorted bibtex entry. I assume ISBN numbers go + ;; with book entries. (setq new-entry (concat "\n@book{,\n" (mapconcat @@ -1314,7 +1323,7 @@ entry with the generated key already exists in the file. " "\n") "\n}\n")) - ;; build entry in temp buffer to get the key + ;; build entry in temp buffer to get the key so we can check for duplicates (setq new-entry (with-temp-buffer (insert new-entry) (org-ref-clean-bibtex-entry) @@ -1329,16 +1338,19 @@ entry with the generated key already exists in the file. " new-key))) (goto-char (point-max)) (insert new-entry) - ;; set key + ;; set key. It is simplest to just replace it, even if it is the same. (bibtex-beginning-of-entry) (re-search-forward bibtex-entry-maybe-empty-head) (if (match-beginning bibtex-key-in-head) (delete-region (match-beginning bibtex-key-in-head) (match-end bibtex-key-in-head))) (insert new-key) - (bibtex-fill-entry))) + (bibtex-fill-entry) + (save-buffer))) #+END_SRC + + * end of file #+BEGIN_SRC emacs-lisp :tangle doi-utils.el (provide 'doi-utils)