From 7697fa4daf3ec84f85711a84035d8f0224afd4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Delafond?= Date: Sun, 13 Jul 2014 13:35:01 +0200 Subject: Imported Upstream version 7.9.2 --- contrib/lisp/org-bibtex-extras.el | 155 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 contrib/lisp/org-bibtex-extras.el (limited to 'contrib/lisp/org-bibtex-extras.el') diff --git a/contrib/lisp/org-bibtex-extras.el b/contrib/lisp/org-bibtex-extras.el new file mode 100644 index 0000000..8424e62 --- /dev/null +++ b/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 +;; 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 . + +;;; 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 -- cgit v1.2.3