Browse Source

sbe now allows specification of header arguments

* lisp/ob-table.el (sbe): If first variable is a string and not a cons
  cell, then interpret it as a string of header arguments to be passed
  to the code block.
Eric Schulte 13 years ago
parent
commit
75e65de150
1 changed files with 53 additions and 40 deletions
  1. 53 40
      lisp/ob-table.el

+ 53 - 40
lisp/ob-table.el

@@ -77,46 +77,59 @@ NOTE: by default string variable names are interpreted as
 references to source-code blocks, to force interpretation of a
 cell's value as a string, prefix the identifier with two \"$\"s
 rather than a single \"$\" (i.e. \"$$2\" instead of \"$2\" in the
-example above."
-  (let* (quote
-	 (variables
-	  (mapcar
-	   (lambda (var)
-	     ;; ensure that all cells prefixed with $'s are strings
-	     (cons (car var)
-		   (delq nil (mapcar
-			      (lambda (el)
-				(if (eq '$ el)
-				    (setq quote t)
-				  (prog1 (if quote
-					     (format "\"%s\"" el)
-					   (org-babel-clean-text-properties el))
-				    (setq quote nil))))
-			      (cdr var)))))
-	   variables)))
-    (unless (stringp source-block)
-      (setq source-block (symbol-name source-block)))
-    ((lambda (result)
-       (org-babel-trim (if (stringp result) result (format "%S" result))))
-     (if (and source-block (> (length source-block) 0))
-         (let ((params
-                (eval `(org-babel-parse-header-arguments
-                        (concat ":var results="
-                                ,source-block
-                                "("
-                                (mapconcat
-				 (lambda (var-spec)
-				   (if (> (length (cdr var-spec)) 1)
-				       (format "%S='%S"
-					       (car var-spec)
-					       (mapcar #'read (cdr var-spec)))
-				     (format "%S=%s"
-					     (car var-spec) (cadr var-spec))))
-				 ',variables ", ")
-                                ")")))))
-           (org-babel-execute-src-block
-            nil (list "emacs-lisp" "results" params) '((:results . "silent"))))
-       ""))))
+example above.
+
+NOTE: it is also possible to pass header arguments to the code
+block.  In this case a table cell should hold the string value of
+the header argument which can then be passed before all variables
+as shown in the example below.
+
+| 1 | 2 | :file nothing.png | nothing.png |
+#+TBLFM: @1$4='(sbe test-sbe $3 (x $1) (y $2))"
+  (let* ((header-args (if (stringp (car variables)) (car variables) ""))
+	 (variables (if (stringp (car variables)) (cdr variables) variables)))
+    (let* (quote
+	   (variables
+	    (mapcar
+	     (lambda (var)
+	       ;; ensure that all cells prefixed with $'s are strings
+	       (cons (car var)
+		     (delq nil (mapcar
+				(lambda (el)
+				  (if (eq '$ el)
+				      (setq quote t)
+				    (prog1 (if quote
+					       (format "\"%s\"" el)
+					     (org-babel-clean-text-properties el))
+				      (setq quote nil))))
+				(cdr var)))))
+	     variables)))
+      (unless (stringp source-block)
+	(setq source-block (symbol-name source-block)))
+      ((lambda (result)
+	 (org-babel-trim (if (stringp result) result (format "%S" result))))
+       (if (and source-block (> (length source-block) 0))
+	   (let ((params
+		  (eval `(org-babel-parse-header-arguments
+			  (concat
+			   ,header-args " "
+			   ":var results="
+			   ,source-block
+			   "("
+			   (mapconcat
+			    (lambda (var-spec)
+			      (if (> (length (cdr var-spec)) 1)
+				  (format "%S='%S"
+					  (car var-spec)
+					  (mapcar #'read (cdr var-spec)))
+				(format "%S=%s"
+					(car var-spec) (cadr var-spec))))
+			    ',variables ", ")
+			   ")")))))
+	     (org-babel-execute-src-block
+	      nil (list "emacs-lisp" "results" params)
+	      '((:results . "silent"))))
+	 "")))))
 (def-edebug-spec sbe (form form))
 
 (provide 'ob-table)