emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [PATCH, take 2] Processing language support in Babel
@ 2015-04-14 13:53 Jarmo Hurri
  2015-04-25  8:08 ` Nicolas Goaziou
  0 siblings, 1 reply; 3+ messages in thread
From: Jarmo Hurri @ 2015-04-14 13:53 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1918 bytes --]


Greetings.

Please find two files attached to this message.

1. A patch implementing Processing programming language support in
   Babel. The commit message of the patch is the following:

   ********************************************************************
   ob-processing.el: Support for Processing language in Babel
   
   * lisp/ob-processing.el: Necessary functions for implementing editing
   of Processing code blocks, viewing the resulting sketches in an
   external viewer, and HTML export of the sketches.
   
   Editing Processing blocks requires processing2-emacs mode. Viewing
   Processing blocks embedded in Org buffer in an external viewer also
   requires processing2-emacs. This viewing is bound to C-c C-v C-k and
   produces no results in Org buffer. HTML export of the results of a
   Processing block is also supported, assuming that the processing.js
   module is available: the sketch is then drawn by the browser when the
   HTML page is viewed. This drawing is implemented by embedding the
   Processing code in a script using the processing.js module. The user
   is responsible for making sure that processing.js is available in the
   correct location.
   
   Console output from a Processing block produced e.g. by println() is
   shown in the Processing compilation window when the code is executed
   in Org buffer, and in text area (console) of the browser when the code
   is embedded in HTML.
   ********************************************************************

2. File test.org, illustrating the use of Processing in Org. The HTML
   export of this file can be viewed at

   http://www.syk.fi/~jhurri/org-processing/test.html

   The sketches (figures) on the page will be re-initialised on page
   reload.

I will be writing teaching material using a combination of Org and
Processing, and may add features to Processing support if I find the
need.

All the best,

Jarmo


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-patch, Size: 8978 bytes --]

From c19d5fbca0c7d2faed26fb991430da15114a3dda Mon Sep 17 00:00:00 2001
From: Jarmo Hurri <jarmo.hurri@iki.fi>
Date: Tue, 14 Apr 2015 16:51:15 +0300
Subject: [PATCH] ob-processing.el: Support for Processing language in Babel

* lisp/ob-processing.el: Necessary functions for implementing editing
of Processing code blocks, viewing the resulting sketches in an
external viewer, and HTML export of the sketches.

Editing Processing blocks requires processing2-emacs mode. Viewing
Processing blocks embedded in Org buffer in an external viewer also
requires processing2-emacs. This viewing is bound to C-c C-v C-k and
produces no results in Org buffer. HTML export of the results of a
Processing block is also supported, assuming that the processing.js
module is available: the sketch is then drawn by the browser when the
HTML page is viewed. This drawing is implemented by embedding the
Processing code in a script using the processing.js module. The user
is responsible for making sure that processing.js is available in the
correct location.

Console output from a Processing block produced e.g. by println() is
shown in the Processing compilation window when the code is executed
in Org buffer, and in text area (console) of the browser when the code
is embedded in HTML.
---
 lisp/ob-processing.el | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 206 insertions(+)
 create mode 100644 lisp/ob-processing.el

diff --git a/lisp/ob-processing.el b/lisp/ob-processing.el
new file mode 100644
index 0000000..1971343
--- /dev/null
+++ b/lisp/ob-processing.el
@@ -0,0 +1,206 @@
+;;; ob-processing.el --- org-babel functions for evaluation of processing
+
+;; Copyright (C) 2009-2015 Free Software Foundation, Inc.
+
+;; Author: Jarmo Hurri (adapted from ob-asymptote.el written by Eric Schulte)
+;; Keywords: literate programming, reproducible research
+;; Homepage: http://orgmode.org
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Org-Babel support for evaluating processing source code.
+;;
+;; This differs from most standard languages in that
+;;
+;; 1) there is no such thing as a "session" in processing
+;;
+;; 2) results can only be exported as html; in this case, the
+;;    processing code is embedded via a file into a javascript block
+;;    using the processing.js module; the script then draws the
+;;    resulting output when the web page is viewed in a browser; note
+;;    that the user is responsible for making sure that processing.js
+;;    is available on the website
+;;
+;; 3) C-c C-v C-k is bound to interactive viewing of the sketch of the
+;;    Processing code block via Processing 2.0 Emacs mode
+
+;;; Requirements:
+
+;; - processing2-emacs mode :: https://github.com/ptrv/processing2-emacs
+;; - Processing.js module :: http://processingjs.org/
+
+;;; Code:
+(require 'ob)
+(require 'ox)
+(require 'sha1)
+
+(eval-when-compile (require 'cl))
+
+;; declaration needed because requiring ob does not define the variable
+(defvar org-babel-temporary-directory)
+
+(defvar org-babel-tangle-lang-exts)
+(add-to-list 'org-babel-tangle-lang-exts '("processing" . "pde"))
+
+;; default header tags depend on whether exporting html or not; if not
+;; exporting html, then no results are produced; otherwise results are
+;; html
+(defvar org-babel-default-header-args:processing
+  '((:results . "html") (:exports . "results"))
+  "Default arguments when evaluating a Processing source block.")
+
+(defvar org-babel-processing-processing-js-filename
+  "processing.js"
+  "Filename of the processing.js file.")
+
+;; declaration of needed function from processing mode in case
+;; processing-mode is not available
+(if (null (require 'processing-mode nil :noerror))
+  (declare-function processing-sketch-run "processing-mode.el" nil))
+
+(defun org-babel-processing-view-sketch ()
+  "Show the sketch of the Processing block under point in an external viewer."
+  (interactive)
+  (let ((info (org-babel-get-src-block-info)))
+    (if (string= (nth 0 info) "processing")
+	(let* ((body (nth 1 info))
+	       (params (org-babel-process-params (nth 2 info)))
+	       (sketch-code
+		(org-babel-expand-body:generic
+		 body
+		 params
+		 (org-babel-variable-assignments:processing params))))
+	  ;; note: sketch filename can not contain a hyphen, since it
+	  ;; has to be a valid java class name; for this reason
+	  ;; make-temp-file is repeated until no hyphen is in the
+	  ;; name; also sketch dir name must be the same as the
+	  ;; basename of the sketch file
+	  (let* ((temporary-file-directory org-babel-temporary-directory)
+		 (sketch-dir
+		  (let (sketch-dir-candidate)
+		    (while
+			(progn
+			  (setq sketch-dir-candidate
+				(make-temp-file "processing" t))
+			  (if (string-match
+			       "-"
+			       (file-name-nondirectory sketch-dir-candidate))
+			      (progn
+				(delete-directory sketch-dir-candidate)
+				t)
+			    nil)))
+		    sketch-dir-candidate))
+		 (sketch-filename
+		  (concat sketch-dir
+			  "/"
+			  (file-name-nondirectory sketch-dir)
+			  ".pde")))
+	    (with-temp-file sketch-filename (insert sketch-code))
+	    (find-file sketch-filename)
+	    (processing-sketch-run)
+	    (kill-buffer)))
+      (message "Not inside a Processing source block."))))
+
+(define-key org-babel-map "\C-k" 'org-babel-processing-view-sketch)
+
+(defun org-babel-execute:processing (body params)
+  "Execute a block of Processing code.
+This function is called by `org-babel-execute-src-block'."
+  (let ((sketch-code
+	 (org-babel-expand-body:generic
+	  body
+	  params
+	  (org-babel-variable-assignments:processing params))))
+    ;; results are html
+    (let ((sketch-canvas-id
+	   (concat "ob-" (sha1 sketch-code))))
+      (concat "<script src=\""
+	      org-babel-processing-processing-js-filename
+	      "\"></script>\n <script type=\"text/processing\""
+	      " data-processing-target=\""
+	      sketch-canvas-id
+	      "\">\n"
+	      sketch-code
+	      "\n</script> <canvas id=\""
+	      sketch-canvas-id
+	      "\"></canvas>"))))
+
+(defun org-babel-prep-session:processing (session params)
+  "Return an error if the :session header argument is set.
+Processing does not support sessions"
+  (error "Processing does not support sessions"))
+
+(defun org-babel-variable-assignments:processing (params)
+  "Return list of processing statements assigning the block's variables."
+  (mapcar #'org-babel-processing-var-to-processing
+	  (mapcar #'cdr (org-babel-get-header params :var))))
+
+(defun org-babel-processing-var-to-processing (pair)
+  "Convert an elisp value into a Processing variable.
+The elisp value PAIR is converted into Processing code specifying
+a variable of the same value."
+  (let ((var (car pair))
+        (val (let ((v (cdr pair)))
+	       (if (symbolp v) (symbol-name v) v))))
+    (cond
+     ((integerp val)
+      (format "int %S=%S;" var val))
+     ((floatp val)
+      (format "float %S=%S;" var val))
+     ((stringp val)
+      (format "String %S=\"%s\";" var val))
+     ((and (listp val) (not (listp (car val))))
+      (let* ((type (org-babel-processing-define-type val))
+	     (fmt (if (eq 'String type) "\"%s\"" "%s"))
+	     (vect (mapconcat (lambda (e) (format fmt e)) val ", ")))
+	(format "%s[] %S={%s};" type var vect)))
+     ((listp val)
+      (let* ((type (org-babel-processing-define-type val))
+	     (fmt (if (eq 'String type) "\"%s\"" "%s"))
+             (array (mapconcat (lambda (row)
+				 (concat "{"
+					 (mapconcat (lambda (e) (format fmt e))
+						    row ", ")
+					 "}"))
+			       val ",")))
+        (format "%S[][] %S={%s};" type var array))))))
+
+(defun org-babel-processing-define-type (data)
+  "Determine type of DATA.
+
+DATA is a list.  Return type as a symbol.
+
+The type is `String' if any element in DATA is
+a string.  Otherwise, it is either `float', if some elements are
+floats, or `int'."
+  (let* ((type 'int)
+	 find-type			; for byte-compiler
+	 (find-type
+	  (function
+	   (lambda (row)
+	     (catch 'exit
+	       (mapc (lambda (el)
+		       (cond ((listp el) (funcall find-type el))
+			     ((stringp el) (throw 'exit (setq type 'String)))
+			     ((floatp el) (setq type 'float))))
+		     row))))))
+    (funcall find-type data) type))
+
+(provide 'ob-processing)
+
+;;; ob-processing.el ends here
-- 
1.9.3


[-- Attachment #3: test file --]
[-- Type: application/vnd.lotus-organizer, Size: 1522 bytes --]

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH, take 2] Processing language support in Babel
  2015-04-14 13:53 [PATCH, take 2] Processing language support in Babel Jarmo Hurri
@ 2015-04-25  8:08 ` Nicolas Goaziou
  2015-04-26 14:18   ` Jarmo Hurri
  0 siblings, 1 reply; 3+ messages in thread
From: Nicolas Goaziou @ 2015-04-25  8:08 UTC (permalink / raw)
  To: Jarmo Hurri; +Cc: emacs-orgmode

Hello,

Jarmo Hurri <jarmo.hurri@iki.fi> writes:

> Greetings.
>
> Please find two files attached to this message.
>
> 1. A patch implementing Processing programming language support in
>    Babel. The commit message of the patch is the following:

Thank you. 

Applied, with minor stylistic tweaks. I also removed the binding C-c C-v
C-k but suggested it in the the comments.

I also introduced the new library in the Org manual.

> 2. File test.org, illustrating the use of Processing in Org. The HTML
>    export of this file can be viewed at
>
>    http://www.syk.fi/~jhurri/org-processing/test.html
>
>    The sketches (figures) on the page will be re-initialised on page
>    reload.

Could you turn this file into an appropriate language documentation for
Worg? See <http://orgmode.org/worg/org-contrib/babel/languages.html>.

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH, take 2] Processing language support in Babel
  2015-04-25  8:08 ` Nicolas Goaziou
@ 2015-04-26 14:18   ` Jarmo Hurri
  0 siblings, 0 replies; 3+ messages in thread
From: Jarmo Hurri @ 2015-04-26 14:18 UTC (permalink / raw)
  To: emacs-orgmode

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

>> 1. A patch implementing Processing programming language support in
>>    Babel. The commit message of the patch is the following:
>
> Thank you. 
>
> Applied, with minor stylistic tweaks. I also removed the binding C-c C-v
> C-k but suggested it in the the comments.

Thanks, great news!

>> 2. File test.org, illustrating the use of Processing in Org. The HTML
>>    export of this file can be viewed at
>>
>>    http://www.syk.fi/~jhurri/org-processing/test.html
>>
>>    The sketches (figures) on the page will be re-initialised on page
>>    reload.
>
> Could you turn this file into an appropriate language documentation for
> Worg? See <http://orgmode.org/worg/org-contrib/babel/languages.html>.

I will.

All the best,

Jarmo

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-04-26 14:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-14 13:53 [PATCH, take 2] Processing language support in Babel Jarmo Hurri
2015-04-25  8:08 ` Nicolas Goaziou
2015-04-26 14:18   ` Jarmo Hurri

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).