diff options
author | Michael Gauland <mike_gauland@stanfordalumni.org> | 2013-10-26 19:16:54 +1300 |
---|---|---|
committer | Eric Schulte <schulte.eric@gmail.com> | 2013-10-26 11:37:46 -0600 |
commit | 416f5ee423a3a0661d5f25f880d15fd4af0320e0 (patch) | |
tree | c78d231a05eb4272ba58554a32b07dbee6b9566b | |
parent | 2668d9e9cecce37d5598275fce380842f5a4a28c (diff) | |
download | org-mode-416f5ee423a3a0661d5f25f880d15fd4af0320e0.tar.gz |
Add ebnf support to babel.
-rw-r--r-- | lisp/ob-ebnf.el | 87 | ||||
-rw-r--r-- | lisp/org.el | 3 |
2 files changed, 89 insertions, 1 deletions
diff --git a/lisp/ob-ebnf.el b/lisp/ob-ebnf.el new file mode 100644 index 0000000..10ec1b2 --- /dev/null +++ b/lisp/ob-ebnf.el @@ -0,0 +1,87 @@ +;;; ob-ebnf.el --- org-babel functions for ebnf evaluation + +;; Copyright (C) your name here + +;; Author: Michael Gauland +;; Keywords: literate programming, reproducible research +;; Homepage: http://orgmode.org +;; Version: 1.00 + +;;; License: + +;; 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, 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; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;;; Org-Babel support for using ebnf2ps to generate encapsulated postscript +;;; railroad diagrams. It recogises these arguments: +;;; +;;; :file is required; it must include the extension '.eps.' All the rules +;;; in the block will be drawn in the same file. This is done by +;;; inserting a '[<file>' comment at the start of the block (see the +;;; documentation for ebnf-eps-buffer for more information). +;;; +;;; :style specifies a value in ebnf-style-database. This provides the +;;; ability to customise the output. The style can also specify the +;;; gramnmar syntax (by setting ebnf-syntax); note that only ebnf, +;;; iso-ebnf, and yacc are supported by this file. + +;;; Requirements: + +;;; Code: +(require 'ob) +(require 'ebnf2ps) + +;; optionally declare default header arguments for this language +(defvar org-babel-default-header-args:ebnf '((:style . nil))) + +;; Use ebnf-eps-buffer to produce an encapsulated postscript file. +;; +(defun org-babel-execute:ebnf (body params) + "Execute a block of Ebnf code with org-babel. This function is +called by `org-babel-execute-src-block'" + (save-excursion + (let* ((dest-file (cdr (assoc :file params))) + (dest-dir (file-name-directory dest-file)) + (dest-root (file-name-sans-extension + (file-name-nondirectory dest-file))) + (dest-ext (file-name-extension dest-file)) + (style (cdr (assoc :style params))) + (current-dir default-directory) + (result nil)) + (with-temp-buffer + (when style (ebnf-push-style style)) + (let + ((comment-format + (cond ((string= ebnf-syntax 'yacc) "/*%s*/") + ((string= ebnf-syntax 'ebnf) ";%s") + ((string= ebnf-syntax 'iso-ebnf) "(*%s*)") + (t (setq result + (format "EBNF error: format %s not supported." + ebnf-syntax)))))) + (setq ebnf-eps-prefix dest-dir) + (insert (format comment-format (format "[%s" dest-root))) + (newline) + (insert body) + (newline) + (insert (format comment-format (format "]%s" dest-root))) + (ebnf-eps-buffer) + (when style (ebnf-pop-style)))) + result + ))) + +(provide 'ob-ebnf) +;;; ob-ebnf.el ends here diff --git a/lisp/org.el b/lisp/org.el index 8c4b5e7..0fd531d 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -262,7 +262,8 @@ requirements) is loaded." (const :tag "Shell Script" sh) (const :tag "Shen" shen) (const :tag "Sql" sql) - (const :tag "Sqlite" sqlite)) + (const :tag "Sqlite" sqlite) + (const :tag "ebnf2ps" ebnf2ps)) :value-type (boolean :tag "Activate" :value t))) ;;;; Customization variables |