Browse Source

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

Eric Schulte 16 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))
              (let ((print-level nil) (print-length nil))
                (eval `(let ,(mapcar (lambda (var) `(,(car var) ',(cdr var))) vars)
                (eval `(let ,(mapcar (lambda (var) `(,(car var) ',(cdr var))) vars)
                         ,(read (concat "(progn "
                         ,(read (concat "(progn "
-                                       (if (member "code" result-params)
+                                       (if (or (member "code" result-params)
+                                               (member "pp" result-params))
                                            (concat "(pp " body ")") body)
                                            (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 "_"
 (defvar org-babel-python-last-value-eval "_"
   "When evaluated by Python this returns the return value of the last statement.")
   "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'"
 (defvar org-babel-python-eoe-indicator "'org_babel_python_eoe'"
   "Used to indicate that evaluation is has completed.")
   "Used to indicate that evaluation is has completed.")
 (defvar org-babel-python-wrapper-method
 (defvar org-babel-python-wrapper-method
@@ -117,6 +123,13 @@ def main():
 %s
 %s
 
 
 open('%s', 'w').write( str(main()) )")
 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)
 (defun org-babel-python-evaluate (buffer body &optional result-type)
   "Pass BODY to the Python process in BUFFER.  If RESULT-TYPE equals
   "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
              (with-temp-buffer
                (insert
                (insert
 		(format
 		(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
 		 (let ((lines (split-string
 			       (org-remove-indentation (org-babel-trim body)) "[\r\n]")))
 			       (org-remove-indentation (org-babel-trim body)) "[\r\n]")))
 		   (concat
 		   (concat
@@ -150,7 +165,7 @@ last statement in BODY, as elisp."
                ;; (message "buffer=%s" (buffer-string)) ;; debugging
                ;; (message "buffer=%s" (buffer-string)) ;; debugging
                (shell-command-on-region (point-min) (point-max) "python"))
                (shell-command-on-region (point-min) (point-max) "python"))
              (let ((raw (with-temp-buffer (insert-file-contents tmp-file) (buffer-string))))
              (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
                    raw
                  (org-babel-python-table-or-string raw)))))))
                  (org-babel-python-table-or-string raw)))))))
     ;; comint session evaluation
     ;; comint session evaluation
@@ -160,18 +175,22 @@ last statement in BODY, as elisp."
                     (mapc (lambda (statement) (insert statement) (comint-send-input nil t))
                     (mapc (lambda (statement) (insert statement) (comint-send-input nil t))
                           (split-string (org-babel-trim full-body) "[\r\n]+"))
                           (split-string (org-babel-trim full-body) "[\r\n]+"))
                     (comint-send-input nil t) (comint-send-input nil t)
                     (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)
                     (insert org-babel-python-eoe-indicator)
                     (comint-send-input nil t)))
                     (comint-send-input nil t)))
              (results (delete org-babel-python-eoe-indicator
              (results (delete org-babel-python-eoe-indicator
                               (cdr (member org-babel-python-eoe-indicator
                               (cdr (member org-babel-python-eoe-indicator
                                            (reverse (mapcar #'org-babel-trim raw)))))))
                                            (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
         (case result-type
 	  (output (org-babel-trim (mapconcat #'identity (reverse (cdr results)) "\n")))
 	  (output (org-babel-trim (mapconcat #'identity (reverse (cdr results)) "\n")))
 	  (value
 	  (value
-           (if (member "code" result-params)
+           (if (or (member "code" result-params) (member "pp" result-params))
                (car results)
                (car results)
              (org-babel-python-table-or-string (org-babel-trim (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 "_"
 (defvar org-babel-ruby-last-value-eval "_"
   "When evaluated by Ruby this returns the return value of the last statement.")
   "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"
 (defvar org-babel-ruby-eoe-indicator ":org_babel_ruby_eoe"
   "Used to indicate that evaluation is has completed.")
   "Used to indicate that evaluation is has completed.")
 (defvar org-babel-ruby-wrapper-method
 (defvar org-babel-ruby-wrapper-method
@@ -123,6 +125,18 @@ end
 results = main()
 results = main()
 File.open('%s', 'w'){ |f| f.write((results.class == String) ? results : results.inspect) }
 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)
 (defun org-babel-ruby-evaluate (buffer body &optional result-type)
   "Pass BODY to the Ruby process in BUFFER.  If RESULT-TYPE equals
   "Pass BODY to the Ruby process in BUFFER.  If RESULT-TYPE equals
@@ -142,19 +156,24 @@ last statement in BODY, as elisp."
           (value
           (value
            (let ((tmp-file (make-temp-file "ruby-functional-results")))
            (let ((tmp-file (make-temp-file "ruby-functional-results")))
              (with-temp-buffer
              (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
                ;; (message "buffer=%s" (buffer-string)) ;; debugging
                (shell-command-on-region (point-min) (point-max) "ruby"))
                (shell-command-on-region (point-min) (point-max) "ruby"))
              (let ((raw (with-temp-buffer (insert-file-contents tmp-file)
              (let ((raw (with-temp-buffer (insert-file-contents tmp-file)
                                           (buffer-string))))
                                           (buffer-string))))
-               (if (member "code" result-params)
+               (if (or (member "code" result-params) (member "pp" result-params))
                    raw
                    raw
                  (org-babel-ruby-table-or-string raw)))))))
                  (org-babel-ruby-table-or-string raw)))))))
     ;; comint session evaluation
     ;; comint session evaluation
     (let* ((full-body
     (let* ((full-body
 	    (mapconcat
 	    (mapconcat
 	     #'org-babel-chomp
 	     #'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
            (raw (org-babel-comint-with-output buffer org-babel-ruby-eoe-indicator t
                   (insert full-body) (comint-send-input nil t)))
                   (insert full-body) (comint-send-input nil t)))
            (results (cdr (member org-babel-ruby-eoe-indicator
            (results (cdr (member org-babel-ruby-eoe-indicator
@@ -163,7 +182,7 @@ last statement in BODY, as elisp."
       (case result-type
       (case result-type
         (output (mapconcat #'identity (reverse (cdr results)) "\n"))
         (output (mapconcat #'identity (reverse (cdr results)) "\n"))
         (value
         (value
-         (if (member "code" result-params)
+         (if (or (member "code" result-params) (member "pp" result-params))
              (car results)
              (car results)
            (org-babel-ruby-table-or-string (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
 takes into account some special considerations for certain
 parameters when merging lists."
 parameters when merging lists."
   (let ((results-exclusive-groups
   (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")
 	   ("replace" "silent")
 	   ("output" "value")))
 	   ("output" "value")))
 	params results exports tangle vars var ref)
 	params results exports tangle vars var ref)