diff options
author | Eric Schulte <schulte.eric@gmail.com> | 2010-09-01 08:48:21 -0600 |
---|---|---|
committer | Eric Schulte <schulte.eric@gmail.com> | 2010-09-01 08:48:21 -0600 |
commit | c7ed188859a93a45ea1e7b8ae27f6d41db60d02d (patch) | |
tree | 8212cebbc91f48143e6e406557b2edd7959115ae | |
parent | 3d6c1090cbaf2a58d65d827be8d2caff4c02b802 (diff) | |
download | org-mode-c7ed188859a93a45ea1e7b8ae27f6d41db60d02d.tar.gz |
ob-js: now supports session based evaluation through mozrepl
* lisp/ob-js.el (org-babel-js-eoe): indicate end of input
(org-babel-execute:js): support for session evaluation
(org-babel-prep-session:js): fleshed out definition
(org-babel-js-initiate-session): can initiate a session using
mozrepl
-rw-r--r-- | lisp/ob-js.el | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/lisp/ob-js.el b/lisp/ob-js.el index 9c48552..a59a134 100644 --- a/lisp/ob-js.el +++ b/lisp/ob-js.el @@ -33,15 +33,28 @@ ;;; Requirements: -;; node.js | http://nodejs.org/ +;; - a non-browser javascript engine such as node.js http://nodejs.org/ +;; or mozrepl http://wiki.github.com/bard/mozrepl/ +;; +;; - for session based evaluation mozrepl and moz.el are required see +;; http://wiki.github.com/bard/mozrepl/emacs-integration for +;; configuration instructions ;;; Code: (require 'ob) +(require 'ob-ref) +(require 'ob-comint) (require 'ob-eval) +(eval-when-compile (require 'cl)) + +(declare-function run-mozilla "ext:moz" (arg)) (defvar org-babel-default-header-args:js '() "Default header arguments for js code blocks.") +(defvar org-babel-js-eoe "org-babel-js-eoe" + "String to indicate that evaluation has completed.") + (defcustom org-babel-js-cmd "node" "Name of command used to evaluate js blocks." :group 'org-babel @@ -64,12 +77,22 @@ "Execute a block of Javascript code with org-babel. This function is called by `org-babel-execute-src-block'" (let* ((processed-params (org-babel-process-params params)) - (session (not (string= (nth 0 processed-params) "none"))) + (org-babel-js-cmd (or (cdr (assoc :cmd params)) org-babel-js-cmd)) (result-type (nth 3 processed-params)) (full-body (org-babel-expand-body:js body params processed-params))) (org-babel-js-read - (if session - (error "javascript sessions are not yet supported.") + (if (not (string= (nth 0 processed-params) "none")) + ;; session evaluation + (let ((session (org-babel-prep-session:js + (nth 0 processed-params) params))) + (nth 1 + (org-babel-comint-with-output + (session (format "%S" org-babel-js-eoe) t body) + (mapc + (lambda (line) + (insert (org-babel-chomp line)) (comint-send-input nil t)) + (list body (format "%S" org-babel-js-eoe)))))) + ;; external evaluation (let ((script-file (org-babel-temp-file "js-script-"))) (with-temp-file script-file (insert @@ -104,12 +127,41 @@ specifying a variable of the same value." (defun org-babel-prep-session:js (session params) "Prepare SESSION according to the header arguments specified in PARAMS." - (error "not yet implemented")) + (let* ((session (org-babel-js-initiate-session session)) + (vars (org-babel-ref-variables params)) + (var-lines + (mapcar + (lambda (pair) (format "var %s=%s;" + (car pair) (org-babel-js-var-to-js (cdr pair)))) + vars))) + (when session + (org-babel-comint-in-buffer session + (sit-for .5) (goto-char (point-max)) + (mapc (lambda (var) + (insert var) (comint-send-input nil t) + (org-babel-comint-wait-for-output session) + (sit-for .1) (goto-char (point-max))) var-lines))) + session)) (defun org-babel-js-initiate-session (&optional session) "If there is not a current inferior-process-buffer in SESSION then create. Return the initialized session." - (error "Javascript sessions are not yet supported.")) + (unless (string= session "none") + (cond + ((string= "mozrepl" org-babel-js-cmd) + (require 'moz) + (let ((session-buffer (save-window-excursion + (run-mozilla nil) + (rename-buffer session) + (current-buffer)))) + (if (org-babel-comint-buffer-livep session-buffer) + (progn (sit-for .25) session-buffer) + (sit-for .5) + (org-babel-js-initiate-session session)))) + ((string= "node" org-babel-js-cmd ) + (error "session evaluation with node.js is not supported")) + (t + (error "sessions are only supported with mozrepl add \":cmd mozrepl\""))))) (provide 'ob-js) |