Browse Source

ob-table: babel scripts called from tables can accept ranges

* lisp/ob-table.el (sbe): now able to accept range references from tables
Eric Schulte 14 years ago
parent
commit
6f825152d9
1 changed files with 27 additions and 10 deletions
  1. 27 10
      lisp/ob-table.el

+ 27 - 10
lisp/ob-table.el

@@ -79,13 +79,25 @@ 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 ((variables (mapcar
-                    (lambda (var)
-                      (if (and (= 3 (length var)) (eq (nth 1 var) '$))
-                          (list (car var) (format "\"%s\"" (last var)))
-                        var))
-                    variables)))
-    (unless (stringp source-block) (setq source-block (symbol-name source-block)))
+  (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)))
     (org-babel-table-truncate-at-newline ;; org-table cells can't be multi-line
      (if (and source-block (> (length source-block) 0))
          (let ((params
@@ -93,9 +105,14 @@ example above."
                         (concat ":var results="
                                 ,source-block
                                 "("
-                                (mapconcat (lambda (var-spec)
-                                             (format "%S=%s" (nth 0 var-spec) (nth 1 var-spec)))
-                                           ',variables ", ")
+                                (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"