summaryrefslogtreecommitdiff
path: root/contrib/lisp/ob-mathomatic.el
diff options
context:
space:
mode:
authorSebastien Delafond <seb@debian.org>2013-08-11 16:27:56 +0200
committerSébastien Delafond <sdelafond@gmail.com>2014-07-13 13:35:27 +0200
commit53b246b7d66bfa03ab9bcf47d4647913b401e3d6 (patch)
treeb5ea4e732c2219456d13048feb05b37b22a76391 /contrib/lisp/ob-mathomatic.el
parent8606e2621fc00fd8b334a06924aeef3aab7a2e4d (diff)
parente32a45ed36d6000db4b39171149072d11b77af72 (diff)
Imported Debian patch 8.0.7-1
Diffstat (limited to 'contrib/lisp/ob-mathomatic.el')
-rw-r--r--contrib/lisp/ob-mathomatic.el145
1 files changed, 145 insertions, 0 deletions
diff --git a/contrib/lisp/ob-mathomatic.el b/contrib/lisp/ob-mathomatic.el
new file mode 100644
index 0000000..585604e
--- /dev/null
+++ b/contrib/lisp/ob-mathomatic.el
@@ -0,0 +1,145 @@
+;;; ob-mathomatic.el --- Org-babel functions for mathomatic evaluation
+
+;; Copyright (C) 2009-2013 Free Software Foundation, Inc.
+
+;; Author: Eric S Fraga
+;; Eric Schulte
+;; Luis Anaya (Mathomatic)
+
+;; Keywords: literate programming, reproducible research, mathomatic
+;; Homepage: http://orgmode.org
+
+;; This file is not part of GNU Emacs.
+
+;; This program 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 of the License, or
+;; (at your option) any later version.
+
+;; This program 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:
+
+;; Org-Babel support for evaluating mathomatic entries.
+;;
+;; This differs from most standard languages in that
+;;
+;; 1) there is no such thing as a "session" in mathomatic
+;;
+;; 2) we are adding the "cmdline" header argument
+
+;;; Code:
+(require 'ob)
+
+(defvar org-babel-tangle-lang-exts)
+(add-to-list 'org-babel-tangle-lang-exts '("mathomatic" . "math"))
+
+(defvar org-babel-default-header-args:mathomatic '())
+
+(defcustom org-babel-mathomatic-command
+ (if (boundp 'mathomatic-command) mathomatic-command "mathomatic")
+ "Command used to call mathomatic on the shell."
+ :group 'org-babel)
+
+(defun org-babel-mathomatic-expand (body params)
+ "Expand a block of Mathomatic code according to its header arguments."
+ (let ((vars (mapcar #'cdr (org-babel-get-header params :var))))
+ (mapconcat 'identity
+ (list
+ ;; graphic output
+ (let ((graphic-file (org-babel-mathomatic-graphical-output-file params)))
+ (if graphic-file
+ (cond
+ ((string-match ".\.eps$" graphic-file)
+ (format ;; Need to add command to send to file.
+ "set plot set terminal postscript eps\\;set output %S "
+ graphic-file))
+ ((string-match ".\.ps$" graphic-file)
+ (format ;; Need to add command to send to file.
+ "set plot set terminal postscript\\;set output %S "
+ graphic-file))
+
+ ((string-match ".\.pic$" graphic-file)
+ (format ;; Need to add command to send to file.
+ "set plot set terminal gpic\\;set output %S "
+ graphic-file))
+ (t
+ (format ;; Need to add command to send to file.
+ "set plot set terminal png\\;set output %S "
+ graphic-file)))
+ ""))
+ ;; variables
+ (mapconcat 'org-babel-mathomatic-var-to-mathomatic vars "\n")
+ ;; body
+ body
+ "")
+ "\n")))
+
+(defun org-babel-execute:mathomatic (body params)
+ "Execute a block of Mathomatic entries with org-babel. This function is
+called by `org-babel-execute-src-block'."
+ (message "executing Mathomatic source code block")
+ (let ((result-params (split-string (or (cdr (assoc :results params)) "")))
+ (result
+ (let* ((cmdline (or (cdr (assoc :cmdline params)) ""))
+ (in-file (org-babel-temp-file "mathomatic-" ".math"))
+ (cmd (format "%s -t -c -q %s %s"
+ org-babel-mathomatic-command in-file cmdline)))
+ (with-temp-file in-file (insert (org-babel-mathomatic-expand body params)))
+ (message cmd)
+ ((lambda (raw) ;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
+ (mapconcat
+ #'identity
+ (delq nil
+ (mapcar (lambda (line)
+ (unless (or (string-match "batch" line)
+ (string-match "^rat: replaced .*$" line)
+ (= 0 (length line)))
+ line))
+ (split-string raw "[\r\n]"))) "\n"))
+ (org-babel-eval cmd "")))))
+ (if (org-babel-mathomatic-graphical-output-file params)
+ nil
+ (if (or (member "scalar" result-params)
+ (member "verbatim" result-params)
+ (member "output" result-params))
+ result
+ (let ((tmp-file (org-babel-temp-file "mathomatic-res-")))
+ (with-temp-file tmp-file (insert result))
+ (org-babel-import-elisp-from-file tmp-file))))))
+
+(defun org-babel-prep-session:mathomatic (session params)
+ (error "Mathomatic does not support sessions"))
+
+(defun org-babel-mathomatic-var-to-mathomatic (pair)
+ "Convert an elisp val into a string of mathomatic code specifying a var
+of the same value."
+ (let ((var (car pair))
+ (val (cdr pair)))
+ (when (symbolp val)
+ (setq val (symbol-name val))
+ (when (= (length val) 1)
+ (setq val (string-to-char val))))
+ (format "%s=%s" var
+ (org-babel-mathomatic-elisp-to-mathomatic val))))
+
+(defun org-babel-mathomatic-graphical-output-file (params)
+ "Name of file to which mathomatic should send graphical output."
+ (and (member "graphics" (cdr (assq :result-params params)))
+ (cdr (assq :file params))))
+
+(defun org-babel-mathomatic-elisp-to-mathomatic (val)
+ "Return a string of mathomatic code which evaluates to VAL."
+ (if (listp val)
+ (mapconcat #'org-babel-mathomatic-elisp-to-mathomatic val " ")
+ (format "%s" val)))
+
+(provide 'ob-mathomatic)
+
+;;; ob-mathomatic.el ends here