Browse Source

Merge branch 'master' of orgmode.org:org-mode

Bastien Guerry 12 years ago
parent
commit
e29a4703c7
1 changed files with 55 additions and 14 deletions
  1. 55 14
      contrib/lisp/ox-bibtex.el

+ 55 - 14
contrib/lisp/ox-bibtex.el

@@ -28,6 +28,8 @@
 ;;
 ;;
 ;;   http://www.lri.fr/~filliatr/bibtex2html/
 ;;   http://www.lri.fr/~filliatr/bibtex2html/
 ;;
 ;;
+;; It also introduces "cite" syntax for Org links.
+;;
 ;; The usage is as follows:
 ;; The usage is as follows:
 ;;
 ;;
 ;;   #+BIBLIOGRAPHY: bibfilebasename stylename optional-options
 ;;   #+BIBLIOGRAPHY: bibfilebasename stylename optional-options
@@ -64,9 +66,18 @@
 ;; into the TeX file when exporting.
 ;; into the TeX file when exporting.
 ;;
 ;;
 ;; For HTML export it:
 ;; For HTML export it:
-;; 1) converts all \cite{foo} to links to the bibliography,
+;; 1) converts all \cite{foo} and [[cite:foo]] to links to the
+;;    bibliography,
 ;; 2) creates a foo.html and foo_bib.html,
 ;; 2) creates a foo.html and foo_bib.html,
 ;; 3) includes the contents of foo.html in the exported HTML file.
 ;; 3) includes the contents of foo.html in the exported HTML file.
+;;
+;; For LaTeX export it:
+;; 1) converts all [[cite:foo]] to \cite{foo}.
+
+;; Initialization
+
+(eval-when-compile (require 'cl))
+(org-add-link-type "cite" 'ebib)
 
 
 
 
 ;;; Internal Functions
 ;;; Internal Functions
@@ -109,18 +120,22 @@ contains a list of strings to be passed as options ot
                       (setq limit (not (equal "nil" value))))
                       (setq limit (not (equal "nil" value))))
                      ((equal "option" key) (push value options)))))))))
                      ((equal "option" key) (push value options)))))))))
 
 
-(defun org-bibtex-citation-p (fragment)
-  "Non-nil when a LaTeX macro is a citation.
-FRAGMENT is a `latex-fragment' type object."
-  (string-match "\\`\\\\cite{" (org-element-property :value fragment)))
+(defun org-bibtex-citation-p (object)
+  "Non-nil when OBJECT is a citation."
+  (case (org-element-type object)
+    (link (equal (org-element-property :type object) "cite"))
+    (latex-fragment
+     (string-match "\\`\\\\cite{" (org-element-property :value object)))))
 
 
 (defun org-bibtex-get-citation-key (citation)
 (defun org-bibtex-get-citation-key (citation)
   "Return key for a given citation, as a string.
   "Return key for a given citation, as a string.
-CITATION is a `latex-fragment' type object satisfying to
-`org-bibtex-citation-p' predicate."
-  (let ((value (org-element-property :value citation)))
-    (and (string-match "\\`\\\\cite{" value)
-         (substring value (match-end 0) -1))))
+CITATION is a `latex-fragment' or `link' type object satisfying
+to `org-bibtex-citation-p' predicate."
+  (if (eq (org-element-type citation) 'link)
+      (org-element-property :path citation)
+    (let ((value (org-element-property :value citation)))
+      (and (string-match "\\`\\\\cite{" value)
+	   (substring value (match-end 0) -1)))))
 
 
 
 
 
 
@@ -139,7 +154,16 @@ Fallback to `latex' back-end for other keywords."
                 (concat (and style (format "\\bibliographystyle{%s}\n" style))
                 (concat (and style (format "\\bibliographystyle{%s}\n" style))
                         (format "\\bibliography{%s}" file))))))))
                         (format "\\bibliography{%s}" file))))))))
 
 
+(defadvice org-latex-link (around bibtex-link)
+  "Translate \"cite\" type links into LaTeX syntax.
+Fallback to `latex' back-end for other keywords."
+  (let ((link (ad-get-arg 0)))
+    (if (not (org-bibtex-citation-p link)) ad-do-it
+      (setq ad-return-value
+	    (format "\\cite{%s}" (org-bibtex-get-citation-key link))))))
+
 (ad-activate 'org-latex-keyword)
 (ad-activate 'org-latex-keyword)
+(ad-activate 'org-latex-link)
 
 
 
 
 
 
@@ -176,8 +200,25 @@ Fallback to `html' back-end for other keywords."
              (org-split-string (org-bibtex-get-citation-key fragment) ",")
              (org-split-string (org-bibtex-get-citation-key fragment) ",")
              "")))))
              "")))))
 
 
+(defadvice org-html-link (around bibtex-link)
+  "Translate \"cite:\" type links into HTML syntax.
+Fallback to `html' back-end for other types."
+  (let ((link (ad-get-arg 0)))
+    (if (not (org-bibtex-citation-p link)) ad-do-it
+      (setq ad-return-value
+	    (mapconcat
+	     (lambda (key)
+	       (format "[<a href=\"#%s\">%s</a>]"
+		       key
+		       (or (cdr (assoc key org-bibtex-html-entries-alist))
+			   key)))
+	     (org-split-string (org-bibtex-get-citation-key link)
+			       "[ \t]*,[ \t]*")
+	     "")))))
+
 (ad-activate 'org-html-keyword)
 (ad-activate 'org-html-keyword)
 (ad-activate 'org-html-latex-fragment)
 (ad-activate 'org-html-latex-fragment)
+(ad-activate 'org-html-link)
 
 
 
 
 ;;;; Filter
 ;;;; Filter
@@ -202,10 +243,10 @@ Return new parse tree.  This function assumes current back-end is HTML."
           ;; argument.
           ;; argument.
           (when (plist-get arguments :limit)
           (when (plist-get arguments :limit)
             (let ((citations
             (let ((citations
-                   (org-element-map tree 'latex-fragment
-                     (lambda (fragment)
-                       (and (org-bibtex-citation-p fragment)
-                            (org-bibtex-get-citation-key fragment))))))
+                   (org-element-map tree '(latex-fragment link)
+                     (lambda (object)
+                       (and (org-bibtex-citation-p object)
+			    (org-bibtex-get-citation-key object))))))
               (with-temp-file (setq temp-file (make-temp-file "ox-bibtex"))
               (with-temp-file (setq temp-file (make-temp-file "ox-bibtex"))
                 (insert (mapconcat 'identity citations "\n")))
                 (insert (mapconcat 'identity citations "\n")))
               (setq arguments
               (setq arguments