Browse Source

org-bibtex-extras --- extras for working with org-bibtex entries

  A contributed package which is still in early development, but
  should eventually have some fun extras for working with org-mode
  bibtex entries
Eric Schulte 7 years ago
parent
commit
e4ac36225d
1 changed files with 155 additions and 0 deletions
  1. 155 0
      contrib/lisp/org-bibtex-extras.el

+ 155 - 0
contrib/lisp/org-bibtex-extras.el

@@ -0,0 +1,155 @@
+;;; org-bibtex-extras --- extras for working with org-bibtex entries
+
+;; Copyright (C) 2008-2012 Free Software Foundation, Inc.
+
+;; Author: Eric Schulte <eric dot schulte at gmx dot com>
+;; Keywords: outlines, hypermedia, bibtex, d3
+;; Homepage: http://orgmode.org
+;; Version: 0.01
+
+;; This file is not yet 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.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Warning: This should certainly be considered EXPERIMENTAL and still
+;;          in development, feedback is welcome, but don't expect it
+;;          to work.
+
+;; This file add some extra functionality to your bibtex entries which
+;; are stored as Org-mode headlines using org-bibtex.el.  Most
+;; features expect that you keep all of your reading notes in a single
+;; file, set the `obe-bibtex-file' variable to the path to this file.
+;;
+;; - d3 view :: d3 is a Javascript library which supports interactive
+;;              display of graphs.  To view your citations as a d3
+;;              graph, execute the following which will create a .json
+;;              export of your references file, then grab a copy of
+;;              d3, edit examples/force/force.js to replace
+;;
+;;                var source`"miserables.json";
+;;
+;;              with
+;;
+;;                var source`"your-references.json";
+;;
+;;              then view examples/force/force.html in your browser.
+;;
+;; - HTML export :: Customize the `obe-html-link-base' variable so
+;;                  that it points to an html export of your
+;;                  references, then add the following to your html
+;;                  export hook, and citations will be resolved during
+;;                  html export.
+;;
+;;	 (add-hook 'org-export-first-hook
+;;	 	  (lambda ()
+;;	 	    (when (equal org-export-current-backend 'html)
+;;	 	      (obe-html-export-citations))))
+
+;;; Code:
+(require 'org-bibtex)
+
+(defcustom obe-bibtex-file nil "File holding bibtex entries.")
+
+(defcustom obe-html-link-base nil
+  "Base of citation links.
+For example, to point to your `obe-bibtex-file' use the following.
+
+  (setq obe-html-link-base (format \"file:%s\" obe-bibtex-file))
+")
+
+(defvar obe-citations nil)
+(defun obe-citations ()
+  "Return all citations from `obe-bibtex-file'."
+  (or obe-citations
+      (save-window-excursion
+	(find-file obe-bibtex-file)
+	(goto-char (point-min))
+	(while (re-search-forward "  :CUSTOM_ID: \\(.+\\)$" nil t)
+	  (push (org-babel-clean-text-properties (match-string 1))
+		obe-citations))
+	obe-citations)))
+
+(defun obe-goto-citation (&optional citation)
+  "Visit a citation given its ID."
+  (interactive)
+  (let ((citation (or citation
+		      (org-icompleting-read "Citation: "
+					    (obe-citations)))))
+    (find-file obe-bibtex-file)
+    (goto-char (point-min))
+    (when (re-search-forward (format "  :CUSTOM_ID: %s" citation) nil t)
+      (outline-previous-visible-heading 1)
+      t)))
+
+(defun obe-html-export-citations ()
+  "Convert all \\cite{...} citations in the current file into HTML links."
+  (save-excursion
+    (goto-char (point-min))
+    (while (re-search-forward "\\\\cite{\\([^\000}]+\\)}" nil t)
+      (replace-match
+       (save-match-data
+	 (mapconcat (lambda (c) (format "[[%s#%s][%s]]" obe-html-link-base c c))
+		    (mapcar #'org-babel-trim
+			    (split-string (match-string 1) ",")) ", "))))))
+
+(defun obe-get-meta-data (citation)
+  "Collect meta-data for CITATION."
+  (save-excursion
+    (when (obe-goto-citation citation)
+      (let ((pt (point)))
+	`((:authors . ,(split-string (org-entry-get pt "AUTHOR") " and " t))
+	  (:title   . ,(org-babel-clean-text-properties (org-get-heading 1 1)))
+	  (:journal . ,(org-entry-get pt "JOURNAL")))))))
+
+(defun obe-meta-to-json (meta &optional fields)
+  "Turn a list of META data from citations into a string of json."
+  (let ((counter 1) nodes links)
+    (flet ((id (it) (position it nodes :test #'string= :key #'car))
+	   (col (k) (mapcar (lambda (r) (cdr (assoc k r))) meta))
+	   (add (lst)
+		(dolist (el lst) (push (cons el counter) nodes))
+		(incf counter)))
+      ;; build the nodes of the graph
+      (add (col :title))
+      (add (remove-if (lambda (author) (string-match "others" author))
+		      (remove-duplicates (apply #'append (col :authors))
+					 :test #'string=)))
+      (dolist (field fields)
+	(add (remove-duplicates (col field) :test #'string=)))
+      ;; build the links in the graph
+      (dolist (citation meta)
+        (let ((dest (id (cdr (assoc :title citation)))))
+          (dolist (author (mapcar #'id (cdr (assoc :authors citation))))
+            (when author (push (cons author dest) links)))
+          (let ((jid (id (cdr (assoc :journal citation)))))
+            (when jid (push (cons jid dest) links)))
+          (let ((cid (id (cdr (assoc :category citation)))))
+            (when cid (push (cons cid dest) links)))))
+      ;; build the json string
+      (format "{\"nodes\":[%s],\"links\":[%s]}"
+	      (mapconcat
+	       (lambda (pair)
+		 (format "{\"name\":%S,\"group\":%d}"
+			 (car pair) (cdr pair)))
+	       nodes ",")
+	      (mapconcat
+	       (lambda (link)
+		 (format "{\"source\":%d,\"target\":%d,\"value\":1}"
+			 (car link) (cdr link)))
+	       (meta-to-links meta nodes) ",")))))
+
+(provide 'org-bibtex-extras)
+;;; org-bibtex-extras ends here