1 ;;; org-bibtex-extras --- extras for working with org-bibtex entries
3 ;; Copyright (C) 2008-2018 Free Software Foundation, Inc.
5 ;; Author: Eric Schulte <eric dot schulte at gmx dot com>
6 ;; Keywords: outlines, hypermedia, bibtex, d3
7 ;; Homepage: https://orgmode.org
10 ;; This file is not yet part of GNU Emacs.
12 ;; This program is free software; you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 3, or (at your option)
17 ;; This program is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
27 ;; Warning: This should certainly be considered EXPERIMENTAL and still
28 ;; in development, feedback is welcome, but don't expect it
31 ;; This file add some extra functionality to your bibtex entries which
32 ;; are stored as Org-mode headlines using org-bibtex.el. Most
33 ;; features expect that you keep all of your reading notes in a single
34 ;; file, set the `obe-bibtex-file' variable to the path to this file.
36 ;; - d3 view :: d3 is a Javascript library which supports interactive
37 ;; display of graphs. To view your citations as a d3
38 ;; graph, execute the following which will create a .json
39 ;; export of your references file, then grab a copy of
40 ;; d3, edit examples/force/force.js to replace
42 ;; var source`"miserables.json";
46 ;; var source`"your-references.json";
48 ;; then view examples/force/force.html in your browser.
50 ;; - HTML export :: Customize the `obe-html-link-base' variable so
51 ;; that it points to an html export of your
52 ;; references, then add the following to your html
53 ;; export hook, and citations will be resolved during
56 ;; (add-hook 'org-export-first-hook
58 ;; (when (equal org-export-current-backend 'html)
59 ;; (obe-html-export-citations))))
64 (declare-function org-trim
"org" (s &optional keep-lead
))
66 (defcustom obe-bibtex-file nil
"File holding bibtex entries.")
68 (defcustom obe-html-link-base nil
69 "Base of citation links.
70 For example, to point to your `obe-bibtex-file' use the following.
72 (setq obe-html-link-base (format \"file:%s\" obe-bibtex-file))
75 (defvar obe-citations nil
)
76 (defun obe-citations ()
77 "Return all citations from `obe-bibtex-file'."
79 (save-window-excursion
80 (find-file (or obe-bibtex-file
81 (error "`obe-bibtex-file' has not been configured")))
82 (goto-char (point-min))
83 (while (re-search-forward " :CUSTOM_ID: \\(.+\\)$" nil t
)
84 (push (org-no-properties (match-string 1))
88 (defun obe-html-export-citations ()
89 "Convert all \\cite{...} citations in the current file into HTML links."
91 (goto-char (point-min))
92 (while (re-search-forward "\\\\cite{\\([^\000}]+\\)}" nil t
)
95 (mapconcat (lambda (c) (format "[[%s#%s][%s]]" obe-html-link-base c c
))
97 (split-string (match-string 1) ",")) ", "))))))
99 (defun obe-meta-to-json (meta &optional fields
)
100 "Turn a list of META data from citations into a string of json."
101 (let ((counter 1) nodes links
)
102 (flet ((id (it) (position it nodes
:test
#'string
= :key
#'car
))
103 (col (k) (mapcar (lambda (r) (cdr (assoc k r
))) meta
))
105 (dolist (el lst
) (push (cons el counter
) nodes
))
107 ;; build the nodes of the graph
109 (add (remove-if (lambda (author) (string-match "others" author
))
110 (remove-duplicates (apply #'append
(col :authors
))
112 (dolist (field fields
)
113 (add (remove-duplicates (col field
) :test
#'string
=)))
114 ;; build the links in the graph
115 (dolist (citation meta
)
116 (let ((dest (id (cdr (assq :title citation
)))))
117 (dolist (author (mapcar #'id
(cdr (assq :authors citation
))))
118 (when author
(push (cons author dest
) links
)))
119 (let ((jid (id (cdr (assq :journal citation
)))))
120 (when jid
(push (cons jid dest
) links
)))
121 (let ((cid (id (cdr (assq :category citation
)))))
122 (when cid
(push (cons cid dest
) links
)))))
123 ;; build the json string
124 (format "{\"nodes\":[%s],\"links\":[%s]}"
127 (format "{\"name\":%S,\"group\":%d}"
128 (car pair
) (cdr pair
)))
132 (format "{\"source\":%d,\"target\":%d,\"value\":1}"
133 (car link
) (cdr link
)))
134 (meta-to-links meta nodes
) ",")))))
136 (provide 'org-bibtex-extras
)
137 ;;; org-bibtex-extras ends here