org-bibtex-extras.el (5202B)
1 ;;; org-bibtex-extras --- extras for working with org-bibtex entries 2 3 ;; Copyright (C) 2008-2021 Free Software Foundation, Inc. 4 5 ;; Author: Eric Schulte <eric dot schulte at gmx dot com> 6 ;; Keywords: outlines, hypermedia, bibtex, d3 7 ;; Homepage: https://git.sr.ht/~bzg/org-contrib 8 ;; Version: 0.01 9 10 ;; This file is not part of GNU Emacs. 11 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) 15 ;; any later version. 16 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. 21 22 ;; You should have received a copy of the GNU General Public License 23 ;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. 24 25 ;;; Commentary: 26 27 ;; Warning: This should certainly be considered EXPERIMENTAL and still 28 ;; in development, feedback is welcome, but don't expect it 29 ;; to work. 30 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. 35 ;; 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 41 ;; 42 ;; var source`"miserables.json"; 43 ;; 44 ;; with 45 ;; 46 ;; var source`"your-references.json"; 47 ;; 48 ;; then view examples/force/force.html in your browser. 49 ;; 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 54 ;; html export. 55 ;; 56 ;; (add-hook 'org-export-first-hook 57 ;; (lambda () 58 ;; (when (equal org-export-current-backend 'html) 59 ;; (obe-html-export-citations)))) 60 61 ;;; Code: 62 (require 'ol-bibtex) 63 64 (declare-function org-trim "org" (s &optional keep-lead)) 65 66 (defcustom obe-bibtex-file nil "File holding bibtex entries.") 67 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. 71 72 (setq obe-html-link-base (format \"file:%s\" obe-bibtex-file)) 73 ") 74 75 (defvar obe-citations nil) 76 (defun obe-citations () 77 "Return all citations from `obe-bibtex-file'." 78 (or obe-citations 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)) 85 obe-citations)) 86 obe-citations))) 87 88 (defun obe-html-export-citations () 89 "Convert all \\cite{...} citations in the current file into HTML links." 90 (save-excursion 91 (goto-char (point-min)) 92 (while (re-search-forward "\\\\cite{\\([^\000}]+\\)}" nil t) 93 (replace-match 94 (save-match-data 95 (mapconcat (lambda (c) (format "[[%s#%s][%s]]" obe-html-link-base c c)) 96 (mapcar #'org-trim 97 (split-string (match-string 1) ",")) ", ")))))) 98 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)) 104 (add (lst) 105 (dolist (el lst) (push (cons el counter) nodes)) 106 (cl-incf counter))) 107 ;; build the nodes of the graph 108 (add (col :title)) 109 (add (cl-remove-if (lambda (author) (string-match "others" author)) 110 (remove-duplicates (apply #'append (col :authors)) 111 :test #'string=))) 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]}" 125 (mapconcat 126 (lambda (pair) 127 (format "{\"name\":%S,\"group\":%d}" 128 (car pair) (cdr pair))) 129 nodes ",") 130 (mapconcat 131 (lambda (link) 132 (format "{\"source\":%d,\"target\":%d,\"value\":1}" 133 (car link) (cdr link))) 134 (meta-to-links meta nodes) ","))))) 135 136 (provide 'org-bibtex-extras) 137 ;;; org-bibtex-extras ends here