org-babel: export of functional-style source blocks

A "functional-style" source block is one in which the name is followed
immediately by a parenthesised argument. An example is the following
"function", which generates n uniform random numbers:

\#+srcname: rand(n)
\#+begin_src R
runif(n)
\#+end_src

With these changes, such source blocks are passed over to the export
machinery in the following form:

\#+begin_src org-babel-lob
<function-def-keyword> rand(n):
\#+end_src
\#+begin_src R <switches>
<indent>runif(n)
\#+end_src

where <function-def-keyword> is the value of
org-babel-function-def-export-keyword, which defaults to "function",
<switches> are the src block switches that belonged to the original
block, and <indent> is the whitespace indent of the function body, the
width of which is determined by org-babel-function-def-export-indent.
org-babel-lob is a simple major mode responsible for fontification of
the blocks corresponding to the function definition line (as opposed
to the function body).
This commit is contained in:
Dan Davison 2009-10-31 21:22:38 -04:00
parent 75299025d6
commit c84903f1b3
2 changed files with 44 additions and 4 deletions

View File

@ -35,6 +35,27 @@
(add-to-list 'org-export-interblocks '(src org-babel-exp-inline-src-blocks))
(add-to-list 'org-export-interblocks '(lob org-babel-exp-lob-one-liners))
(defvar org-babel-function-def-export-keyword "function"
"When exporting a source block function, this keyword will
appear in the exported version in the place of #+srcname:. A
source block is considered to be a source block function if the
srcname is present and is followed by a parenthesised argument
list. The parentheses may be empty or contain whitespace. An
example is the following which generates n random
(uniform) numbers.
#+srcname: rand(n)
#+begin_src R
runif(n)
#+end_src
")
(defvar org-babel-function-def-export-indent 4
"When exporting a source block function, the block contents
will be indented by this many characters. See
`org-babel-function-def-export-name' for the definition of a
source block function.")
(defun org-babel-exp-src-blocks (body &rest headers)
"Process src block for export. Depending on the 'export'
headers argument in replace the source code block with...
@ -107,11 +128,29 @@ options are taken from `org-babel-default-header-args'."
(defun org-babel-exp-code (info type)
(let ((lang (first info))
(body (second info))
(switches (fourth info)))
(switches (fourth info))
(name (fifth info))
(args (sixth info))
(function-def-line ""))
(case type
('inline (format "=%s=" (second info)))
('block (format "#+BEGIN_SRC %s %s\n%s%s#+END_SRC" lang switches body
(if (string-match "\n$" body) "" "\n")))
('block
(when args
(unless (string-match "-i\\>" switches)
(setq switches (concat switches " -i")))
(setq body (with-temp-buffer
(insert body)
(indent-code-rigidly (point-min) (point-max) org-babel-function-def-export-indent)
(buffer-string)))
(setq args (mapconcat #'identity
(delq nil (mapcar (lambda (el) (and (length (cdr el)) (cdr el))) args))
", "))
(setq function-def-line
(format "#+BEGIN_SRC org-babel-lob\n%s %s(%s):\n#+END_SRC\n"
org-babel-function-def-export-keyword name args)))
(concat function-def-line
(format "#+BEGIN_SRC %s %s\n%s%s#+END_SRC" lang switches body
(if (string-match "\n$" body) "" "\n"))))
('lob (save-excursion
(re-search-backward org-babel-lob-one-liner-regexp)
(format "#+BEGIN_SRC org-babel-lob\n%s\n#+END_SRC"

View File

@ -31,6 +31,7 @@
;;; Code:
(require 'org-babel)
(require 'org-babel-table)
(require 'org-babel-exp)
(defvar org-babel-library-of-babel nil
"Library of source-code blocks. This is an association list.
@ -94,7 +95,7 @@ the word 'call'."
(org-babel-execute-src-block nil (list "emacs-lisp" "results" params))))
(define-generic-mode org-babel-lob-mode
'("#") nil nil nil nil
'("#") (list org-babel-function-def-export-keyword) nil nil nil
"Major mode for fontification of library of babel lines on export")
(provide 'org-babel-lob)