| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | ;;; org-bibtex.el --- Org links to BibTeX entries;;;; Copyright 2007 Bastien Guerry;;;; Author: bzg AT altern DOT org;; Version: 0.2;; Keywords: org, wp, remember;; URL: http://www.cognition.ens.fr/~guerry/u/org-bibtex.el;;;; 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, 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, write to the Free Software;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.;;;;; Commentary:;;;; The Org mode already lets you store/insert links to BibTeX entries.;;;; But what if you want to insert the author or the title of a BibTeX;; item in a *remember* buffer?  This library lets you deal with this ;; by adding more properties to the BibTeX link.;;;; The available properties for each entry are listed here:;;;; :author        :publisher      :volume      :pages;; :editor        :url            :number      :journal;; :title         :year           :series      :address;; :booktitle     :month          :annote      :abstract;; :key           :btype;; ;; Here is an example of a remember template that use some of this;; information (:author :year :title :journal :pages):;; ;; (setq org-remember-templates ;;   '((?b "* READ %?\n\n%a\n\n%:author (%:year): %:title\n   \;;          In %:journal, %:pages.")));; ;; Let's say you want to remember this BibTeX entry:;; ;; @Article{dolev83,;;   author = 	 {Danny Dolev and Andrew C. Yao},;;   title = 	 {On the security of public-key protocols},;;   journal = 	 {IEEE Transaction on Information Theory},;;   year = 	 1983,;;   volume =	 2,;;   number =	 29,;;   pages =	 {198--208},;;   month =	 {Mars};; };; ;; M-x `org-remember' on this entry will produce this buffer:;; ;; =====================================================================;; * READ <== [point here];; ;; [[file:/file.bib::dolev83][Dolev & Yao 1983: security of public key protocols]];; ;; Danny Dolev and Andrew C. Yao (1983): On the security of public-key protocols;; In IEEE Transaction on Information Theory, 198--208.;; =====================================================================;;;;; History:;; ;; This piece of code was inspired by a request of Austin Frank:;;   http://article.gmane.org/gmane.emacs.orgmode/4112;;;; Put this file into your load-path and the following into your ~/.emacs:;;   (require 'org-bibtex);;; Code:(provide 'org-bibtex)(require 'org)(defvar description nil) ; dynamically scoped in org.el(org-add-link-type "bibtex" 'org-bibtex-open)(add-hook 'org-store-link-functions 'org-bibtex-store-link);; (defun org-bibtex-publish (path);;   "Build the description of the BibTeX entry for publishing.";;   (let* ((search (when (string-match "::\\(.+\\)\\'" path);; 		   (match-string 1 path)));; 	 (path (substring path 0 (match-beginning 0)));; 	 key);;     (with-temp-buffer;;       (org-open-file path t nil search);;       (setq key (org-create-file-search-functions)));;     (or description key)))(defun org-bibtex-open (path)  "Visit the bibliography entry on PATH."  (let* ((search (when (string-match "::\\(.+\\)\\'" path)		   (match-string 1 path)))	 (path (substring path 0 (match-beginning 0))))    (org-open-file path t nil search)))(defun org-bibtex-store-link ()  "Store a link to a BibTeX entry."  (when (eq major-mode 'bibtex-mode)    (let* ((search (run-hook-with-args-until-success		    'org-create-file-search-functions))	   (link (concat "file:" (abbreviate-file-name buffer-file-name)			 "::" search))	   (entry (mapcar ; repair strings enclosed in "..." or {...}		   (lambda(c)		     (if (string-match			  "^\\(?:{\\|\"\\)\\(.*\\)\\(?:}\\|\"\\)$" (cdr c))			 (cons (car c) (match-string 1 (cdr c))) c))		   (save-excursion		     (bibtex-beginning-of-entry)		     (bibtex-parse-entry)))))      (org-store-link-props       :key (cdr (assoc "=key=" entry))       :author (or (cdr (assoc "author" entry)) "[no author]")       :editor (or (cdr (assoc "editor" entry)) "[no editor]")       :title (or (cdr (assoc "title" entry)) "[no title]")       :booktitle (or (cdr (assoc "booktitle" entry)) "[no booktitle]")       :journal (or (cdr (assoc "journal" entry)) "[no journal]")       :publisher (or (cdr (assoc "publisher" entry)) "[no publisher]")       :pages (or (cdr (assoc "pages" entry)) "[no pages]")       :url (or (cdr (assoc "url" entry)) "[no url]")       :year (or (cdr (assoc "year" entry)) "[no year]")       :month (or (cdr (assoc "month" entry)) "[no month]")       :address (or (cdr (assoc "address" entry)) "[no address]")       :volume (or (cdr (assoc "volume" entry)) "[no volume]")       :number (or (cdr (assoc "number" entry)) "[no number]")       :annote (or (cdr (assoc "annote" entry)) "[no annotation]")       :series (or (cdr (assoc "series" entry)) "[no series]")       :abstract (or (cdr (assoc "abstract" entry)) "[no abstract]")       :btype (or (cdr (assoc "=type=" entry)) "[no type]")       :type "bibtex"       :link link       :description description))))(provide 'org-bibtex);;;;##########################################################################;;;;  User Options, Variables;;;;##########################################################################;;; org-bibtex.el ends here
 |