dotemacs

My Emacs configuration
git clone git://git.entf.net/dotemacs
Log | Files | Refs | LICENSE

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