emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to org-bibtex.el


From: Carsten Dominik
Subject: [Emacs-diffs] Changes to org-bibtex.el
Date: Sun, 27 Apr 2008 18:33:44 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Carsten Dominik <cdominik>      08/04/27 18:33:39

Index: org-bibtex.el
===================================================================
RCS file: org-bibtex.el
diff -N org-bibtex.el
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ org-bibtex.el       27 Apr 2008 18:33:37 -0000      1.1
@@ -0,0 +1,204 @@
+;;; org-bibtex.el --- Org links to BibTeX entries
+;;
+;; Copyright 2007, 2008 Free Software Foundation, Inc.
+;;
+;; Author: Bastien Guerry <bzg at altern dot org>
+;;         Carsten Dominik <carsten dot dominik at gmail dot com>
+;; Keywords: org, wp, remember
+;; Version: 6.02b
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs 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.
+
+;; GNU Emacs 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+;;
+;;; Commentary:
+;;
+;; This file implements links to database entries in BibTeX files.
+;; Instead of defining a special link prefix, it uses the normal file
+;; links combined with a custom search mechanism to find entries
+;; by reference key.  And it constucts a nice description tag for
+;; the link that contains the author name, the year and a short title.
+;;
+;; It also stores detailed information about the entry so that
+;; remember templates can access and enter this information easily.
+;;
+;; 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:
+;;
+;; The link creation part has been part of Org-mode for a long time.
+;;
+;; Creating better remember template information was inspired by a request
+;; of Austin Frank: http://article.gmane.org/gmane.emacs.orgmode/4112
+;; and then imlemented by Bastien Guerry.
+;;
+;; Org-mode loads this module by default - if this is not what you want,
+;; configure the variable `org-modules'.
+
+;;; Code:
+
+(require 'org)
+
+(defvar description nil) ; dynamically scoped from org.el
+
+(declare-function bibtex-beginning-of-entry "bibtex" ())
+(declare-function bibtex-generate-autokey "bibtex" ())
+(declare-function bibtex-parse-entry "bibtex" (&optional content))
+(declare-function bibtex-url "bibtex" (&optional pos no-browse))
+
+(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 (org-create-file-search-in-bibtex))
+          (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))))
+
+(defun org-create-file-search-in-bibtex ()
+  "Create the search string and description for a BibTeX database entry."
+  ;; Make a good description for this entry, using names, year and the title
+  ;; Put it into the `description' variable which is dynamically scoped.
+  (let ((bibtex-autokey-names 1)
+       (bibtex-autokey-names-stretch 1)
+       (bibtex-autokey-name-case-convert-function 'identity)
+       (bibtex-autokey-name-separator " & ")
+       (bibtex-autokey-additional-names " et al.")
+       (bibtex-autokey-year-length 4)
+       (bibtex-autokey-name-year-separator " ")
+       (bibtex-autokey-titlewords 3)
+       (bibtex-autokey-titleword-separator " ")
+       (bibtex-autokey-titleword-case-convert-function 'identity)
+       (bibtex-autokey-titleword-length 'infty)
+       (bibtex-autokey-year-title-separator ": "))
+    (setq description (bibtex-generate-autokey)))
+  ;; Now parse the entry, get the key and return it.
+  (save-excursion
+    (bibtex-beginning-of-entry)
+    (cdr (assoc "=key=" (bibtex-parse-entry)))))
+
+(defun org-execute-file-search-in-bibtex (s)
+  "Find the link search string S as a key for a database entry."
+  (when (eq major-mode 'bibtex-mode)
+    ;; Yes, we want to do the search in this file.
+    ;; We construct a regexp that searches for "@entrytype{" followed by the 
key
+    (goto-char (point-min))
+    (and (re-search-forward (concat "@[a-zA-Z]+[ \t\n]*{[ \t\n]*"
+                                   (regexp-quote s) "[ \t\n]*,") nil t)
+        (goto-char (match-beginning 0)))
+    (if (and (match-beginning 0) (equal current-prefix-arg '(16)))
+       ;; Use double prefix to indicate that any web link should be browsed
+       (let ((b (current-buffer)) (p (point)))
+         ;; Restore the window configuration because we just use the web link
+         (set-window-configuration org-window-config-before-follow-link)
+         (save-excursion (set-buffer b) (goto-char p)
+           (bibtex-url)))
+      (recenter 0))  ; Move entry start to beginning of window
+  ;; return t to indicate that the search is done.
+    t))
+
+;; Finally add the link search function to the right hook.
+(add-hook 'org-execute-file-search-functions 
'org-execute-file-search-in-bibtex)
+
+(provide 'org-bibtex)
+
+;;; org-bibtex.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]