Browse Source

org-babel: now supports pp results (emacs-lisp, ruby, python)

Eric Schulte 15 years ago
parent
commit
3db817fb02

+ 2 - 1
contrib/babel/lisp/langs/org-babel-emacs-lisp.el

@@ -45,7 +45,8 @@ function is called by `org-babel-execute-src-block' via multiple-value-bind."
              (let ((print-level nil) (print-length nil))
                (eval `(let ,(mapcar (lambda (var) `(,(car var) ',(cdr var))) vars)
                         ,(read (concat "(progn "
-                                       (if (member "code" result-params)
+                                       (if (or (member "code" result-params)
+                                               (member "pp" result-params))
                                            (concat "(pp " body ")") body)
                                        ")")))))))))
 

+ 25 - 6
contrib/babel/lisp/langs/org-babel-python.el

@@ -109,6 +109,12 @@ then create.  Return the initialized session."
 
 (defvar org-babel-python-last-value-eval "_"
   "When evaluated by Python this returns the return value of the last statement.")
+(defvar org-babel-python-pp-last-value-eval
+  '("results = _"
+    "import pprint"
+    "org_babel_pp = pprint.PrettyPrinter()"
+    "org_babel_pp.pprint(results)")
+  "When evaluated by Python this pretty prints the value of the last statement.")
 (defvar org-babel-python-eoe-indicator "'org_babel_python_eoe'"
   "Used to indicate that evaluation is has completed.")
 (defvar org-babel-python-wrapper-method
@@ -117,6 +123,13 @@ def main():
 %s
 
 open('%s', 'w').write( str(main()) )")
+(defvar org-babel-python-pp-wrapper-method
+  "
+import pprint
+def main():
+%s
+
+open('%s', 'w').write( pprint.pformat(main()) )")
 
 (defun org-babel-python-evaluate (buffer body &optional result-type)
   "Pass BODY to the Python process in BUFFER.  If RESULT-TYPE equals
@@ -138,7 +151,9 @@ last statement in BODY, as elisp."
              (with-temp-buffer
                (insert
 		(format
-		 org-babel-python-wrapper-method
+		 (if (member "pp" result-params)
+                     org-babel-python-pp-wrapper-method
+                   org-babel-python-wrapper-method)
 		 (let ((lines (split-string
 			       (org-remove-indentation (org-babel-trim body)) "[\r\n]")))
 		   (concat
@@ -150,7 +165,7 @@ last statement in BODY, as elisp."
                ;; (message "buffer=%s" (buffer-string)) ;; debugging
                (shell-command-on-region (point-min) (point-max) "python"))
              (let ((raw (with-temp-buffer (insert-file-contents tmp-file) (buffer-string))))
-               (if (member "code" result-params)
+               (if (or (member "code" result-params) (member "pp" result-params))
                    raw
                  (org-babel-python-table-or-string raw)))))))
     ;; comint session evaluation
@@ -160,18 +175,22 @@ last statement in BODY, as elisp."
                     (mapc (lambda (statement) (insert statement) (comint-send-input nil t))
                           (split-string (org-babel-trim full-body) "[\r\n]+"))
                     (comint-send-input nil t) (comint-send-input nil t)
-                    (insert org-babel-python-last-value-eval)
-                    (comint-send-input nil t)
+                    (if (member "pp" result-params)
+                        (mapc (lambda (statement) (insert statement) (comint-send-input nil t))
+                              org-babel-python-pp-last-value-eval)
+                      (insert org-babel-python-last-value-eval))
+                    (comint-send-input nil t) (comint-send-input nil t)
                     (insert org-babel-python-eoe-indicator)
                     (comint-send-input nil t)))
              (results (delete org-babel-python-eoe-indicator
                               (cdr (member org-babel-python-eoe-indicator
                                            (reverse (mapcar #'org-babel-trim raw)))))))
-        (setq results (mapcar #'org-babel-python-read-string results))
+        (unless (or (member "code" result-params) (member "pp" result-params))
+          (setq results (mapcar #'org-babel-python-read-string results)))
         (case result-type
 	  (output (org-babel-trim (mapconcat #'identity (reverse (cdr results)) "\n")))
 	  (value
-           (if (member "code" result-params)
+           (if (or (member "code" result-params) (member "pp" result-params))
                (car results)
              (org-babel-python-table-or-string (org-babel-trim (car results))))))))))
 

+ 23 - 4
contrib/babel/lisp/langs/org-babel-ruby.el

@@ -113,6 +113,8 @@ then create.  Return the initialized session."
 
 (defvar org-babel-ruby-last-value-eval "_"
   "When evaluated by Ruby this returns the return value of the last statement.")
+(defvar org-babel-ruby-pp-last-value-eval "require 'pp'; pp(_)"
+  "When evaluated by Ruby this pretty prints value of the last statement.")
 (defvar org-babel-ruby-eoe-indicator ":org_babel_ruby_eoe"
   "Used to indicate that evaluation is has completed.")
 (defvar org-babel-ruby-wrapper-method
@@ -123,6 +125,18 @@ end
 results = main()
 File.open('%s', 'w'){ |f| f.write((results.class == String) ? results : results.inspect) }
 ")
+(defvar org-babel-ruby-pp-wrapper-method
+  "
+require 'pp'
+def main()
+%s
+end
+results = main()
+File.open('%s', 'w') do |f|
+  $stdout = f
+  pp results
+end
+")
 
 (defun org-babel-ruby-evaluate (buffer body &optional result-type)
   "Pass BODY to the Ruby process in BUFFER.  If RESULT-TYPE equals
@@ -142,19 +156,24 @@ last statement in BODY, as elisp."
           (value
            (let ((tmp-file (make-temp-file "ruby-functional-results")))
              (with-temp-buffer
-               (insert (format org-babel-ruby-wrapper-method body tmp-file))
+               (insert (format (if (member "pp" result-params)
+                                   org-babel-ruby-pp-wrapper-method
+                                 org-babel-ruby-wrapper-method) body tmp-file))
                ;; (message "buffer=%s" (buffer-string)) ;; debugging
                (shell-command-on-region (point-min) (point-max) "ruby"))
              (let ((raw (with-temp-buffer (insert-file-contents tmp-file)
                                           (buffer-string))))
-               (if (member "code" result-params)
+               (if (or (member "code" result-params) (member "pp" result-params))
                    raw
                  (org-babel-ruby-table-or-string raw)))))))
     ;; comint session evaluation
     (let* ((full-body
 	    (mapconcat
 	     #'org-babel-chomp
-	     (list body org-babel-ruby-last-value-eval org-babel-ruby-eoe-indicator) "\n"))
+	     (list body (if (member "pp" result-params)
+                            org-babel-ruby-pp-last-value-eval
+                          org-babel-ruby-last-value-eval)
+                   org-babel-ruby-eoe-indicator) "\n"))
            (raw (org-babel-comint-with-output buffer org-babel-ruby-eoe-indicator t
                   (insert full-body) (comint-send-input nil t)))
            (results (cdr (member org-babel-ruby-eoe-indicator
@@ -163,7 +182,7 @@ last statement in BODY, as elisp."
       (case result-type
         (output (mapconcat #'identity (reverse (cdr results)) "\n"))
         (value
-         (if (member "code" result-params)
+         (if (or (member "code" result-params) (member "pp" result-params))
              (car results)
            (org-babel-ruby-table-or-string (car results))))))))
 

+ 1 - 1
contrib/babel/lisp/org-babel.el

@@ -669,7 +669,7 @@ elements of PLISTS override the values of previous element.  This
 takes into account some special considerations for certain
 parameters when merging lists."
   (let ((results-exclusive-groups
-	 '(("file" "vector" "table" "scalar" "raw" "org" "html" "latex" "code")
+	 '(("file" "vector" "table" "scalar" "raw" "org" "html" "latex" "code" "pp")
 	   ("replace" "silent")
 	   ("output" "value")))
 	params results exports tangle vars var ref)