Browse Source

ob-table: Fix org-sbe's handling of list arguments

* ob-table.el (org-sbe): Add an explicit case for handling list
arguments. This avoids doing the wrong thing (%s-formatting a list,
thus losing syntax like double-quotes). This enables passing org-table
ranges through org-sbe in a simple and correct manner.

* test-ob-table.el: Add test.
Vladimir Panteleev 1 year ago
parent
commit
c9d617b322
2 changed files with 34 additions and 6 deletions
  1. 11 6
      lisp/ob-table.el
  2. 23 0
      testing/lisp/test-ob-table.el

+ 11 - 6
lisp/ob-table.el

@@ -132,12 +132,17 @@ as shown in the example below.
                                  "("
                                  (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))))
+                                    (cond
+				     ((> (length (cdr var-spec)) 1)
+				      (format "%S='%S"
+					      (car var-spec)
+					      (mapcar #'read (cdr var-spec))))
+				     ((stringp (cadr var-spec))
+				      (format "%S=%s"
+                                              (car var-spec) (cadr var-spec)))
+				     (t
+				      (format "%S=%S"
+                                              (car var-spec) (cadr var-spec)))))
                                   ',variables ", ")
                                  ")")))))
                    (org-babel-execute-src-block

+ 23 - 0
testing/lisp/test-ob-table.el

@@ -52,6 +52,29 @@
    1
    "#+TBLFM: $2 = '(org-sbe identity (x $$1))"))
 
+(ert-deftest test-ob-table/sbe-list ()
+  "Test that `org-sbe' can correctly handle ranges as lists."
+  (org-test-table-target-expect
+   "
+#+name: concat
+#+begin_src emacs-lisp :eval yes
+  (mapconcat #'identity x \"\")
+#+end_src
+
+| foo | bar | replace |
+"
+   "
+#+name: concat
+#+begin_src emacs-lisp :eval yes
+  (mapconcat #'identity x \"\")
+#+end_src
+
+| foo | bar | foobar |
+"
+   1
+   "#+TBLFM: $3 = '(org-sbe concat (x   (list $1..$2)))"
+   "#+TBLFM: $3 = '(org-sbe concat (x $ (list $1..$2)))"))
+
 (provide 'test-ob-table)
 
 ;;; test-ob-table.el ends here