ob-mscgen: support for mscgen code blocks by Juan Pechiar

from the comments of the new file

This software provides EMACS org-babel export support for message
sequence charts. The mscgen utility is used for processing the
sequence definition, and must therefore be installed in the system.

Mscgen is available and documented at
http://www.mcternan.me.uk/mscgen/index.html

This code is directly inspired by Eric Schulte's ob-dot.el

Example:

msc {
 A,B;
 A -> B [ label = "send message" ];
 A <- B [ label = "get answer" ];
}

Header for alternative file type:

This differs from most standard languages in that

1) there is no such thing as a "session" in mscgen
2) we are generally only going to return results of type "file"
3) we are adding the "file" and "filetype" header arguments
4) there are no variables
This commit is contained in:
Eric Schulte 2010-07-05 18:43:55 -07:00
parent e4cfd468a0
commit 07b8908903
3 changed files with 102 additions and 7 deletions

View File

@ -131,6 +131,7 @@ LISPF = org.el \
ob-sh.el \
ob-R.el \
ob-dot.el \
ob-mscgen.el \
ob-latex.el \
ob-python.el \
ob-sql.el \

View File

@ -11211,13 +11211,14 @@ Code blocks in the following languages are supported.
@item css @tab css @tab ditaa @tab ditaa
@item Graphviz @tab dot @tab Emacs Lisp @tab emacs-lisp
@item gnuplot @tab gnuplot @tab Haskell @tab haskell
@item Matlab @tab matlab @tab LaTeX @tab latex
@item Objective Caml @tab ocaml @tab Octave @tab octave
@item OZ @tab oz @tab Perl @tab perl
@item Python @tab python @tab R @tab R
@item Ruby @tab ruby @tab Sass @tab sass
@item GNU Screen @tab screen @tab shell @tab sh
@item SQL @tab sql @tab Sqlite @tab sqlite
@item LaTeX @tab latex @tab Matlab @tab matlab
@item Mscgen @tab mscgen @tab Objective Caml @tab ocaml
@item Octave @tab octave @tab OZ @tab oz
@item Perl @tab perl @tab Python @tab python
@item R @tab R @tab Ruby @tab ruby
@item Sass @tab sass @tab GNU Screen @tab screen
@item shell @tab sh @tab SQL @tab sql
@item Sqlite @tab sqlite
@end multitable
Language specific documentation is available for some languages. If

93
lisp/ob-mscgen.el Normal file
View File

@ -0,0 +1,93 @@
;;; ob-msc.el --- org-babel functions for mscgen evaluation
;; Copyright (C) 2010 Free Software Foundation, Inc.
;; Author: Juan Pechiar
;; Keywords: literate programming, reproducible research
;; Homepage: http://orgmode.org
;; Version: 0.01
;; This file is 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 of the License, 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 <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; This software provides EMACS org-babel export support for message
;; sequence charts. The mscgen utility is used for processing the
;; sequence definition, and must therefore be installed in the system.
;;
;; Mscgen is available and documented at http://www.mcternan.me.uk/mscgen/index.html
;;
;; This code is directly inspired by Eric Schulte's ob-dot.el
;;
;; Example:
;;
;; #+begin_src mscgen :file example.png
;; msc {
;; A,B;
;; A -> B [ label = "send message" ];
;; A <- B [ label = "get answer" ];
;; }
;; #+end_src
;;
;; Header for alternative file type:
;;
;; #+begin_src mscgen :file ex2.svg :filetype svg
;; This differs from most standard languages in that
;;
;; 1) there is no such thing as a "session" in mscgen
;; 2) we are generally only going to return results of type "file"
;; 3) we are adding the "file" and "filetype" header arguments
;; 4) there are no variables
;;; Code:
(require 'ob)
(defvar org-babel-default-header-args:mscgen
'((:results . "file") (:exports . "results"))
"Default arguments to use when evaluating a mscgen source block.")
(defun org-babel-expand-body:mscgen (body params &optional processed-params)
"Expand BODY according to PARAMS, return the expanded body." body)
(defun org-babel-execute:mscgen (body params)
"Execute a block of Mscgen code with org-babel. This function is
called by `org-babel-execute-src-block'.
Default filetype is png. Modify by setting :filetype parameter to mscgen supported formats."
(message "executing Mscgen source code block")
(let* ((out-file (or (cdr (assoc :file params)) "output.png" ))
exit-code
(filetype (or (cdr (assoc :filetype params)) "png" ))
(stderr
(with-temp-buffer
(insert body)
(setq exit-code (org-babel-shell-command-on-region
(point-min) (point-max) (concat "mscgen -T " filetype " -o " out-file)
nil 'replace (current-buffer)))
(buffer-string))))
(unless (cdr (assoc :file params)) (setq stderr (concat stderr "\nERROR: no output file specified. Add \":file some_name.png\" to the src header" )) (error stderr))
(if (> exit-code 0) (org-babel-error-notify exit-code stderr))
out-file))
(defun org-babel-prep-session:mscgen (session params)
"Prepare SESSION according to PARAMS."
(error "Mscgen does not support sessions"))
(provide 'ob-mscgen)
;; arch-tag: 74695b1e-715f-4b5a-a3a9-d78ee39ba5c8
;;; ob-msc.el ends here