diff --git a/features/ob-ein.feature b/features/ob-ein.feature index 9336d87..4aefc4d 100644 --- a/features/ob-ein.feature +++ b/features/ob-ein.feature @@ -112,7 +112,7 @@ Scenario: Specific port, portless localhost refers to same, concurrent execution And I wait for buffer to say "3.1415" And I should not see "[....]" -@org +@imogene Scenario: portless url with path, image When I open temp file "path.org" And I call "org-mode" diff --git a/features/support/env.el b/features/support/env.el index 0ae22a3..376fa82 100644 --- a/features/support/env.el +++ b/features/support/env.el @@ -1,3 +1,4 @@ +;;; -*- lexical-binding: t; -*- (require 'f) (require 'espuds) (require 'ert) diff --git a/lisp/ein-cell.el b/lisp/ein-cell.el index 1a8813c..db9559d 100644 --- a/lisp/ein-cell.el +++ b/lisp/ein-cell.el @@ -42,6 +42,10 @@ (require 'ein-kernel) (require 'ein-output-area) +(declare-function mm-encode-buffer "mm-encode") +(declare-function mm-possibly-verify-or-decrypt "mm-decode") +(declare-function mm-dissect-singlepart "mm-decode") + (defun ein:cell--ewoc-delete (ewoc &rest nodes) "Delete NODES from EWOC." (ewoc--set-buffer-bind-dll-let* ewoc @@ -156,7 +160,6 @@ Delete current text first, thus effecting a \"refresh\"." "Face for tooltip when using pos-tip backend." :group 'ein) - ;;; Customization (make-obsolete-variable 'ein:enable-dynamic-javascript nil "0.17.0") @@ -182,18 +185,6 @@ is on. See also `ein:connect-aotoexec-lighter'." :type 'string :group 'ein) -(defcustom ein:slice-image nil - "[EXPERIMENTAL] When non-`nil', use `insert-sliced-image' when -drawing images. If it is of the form of ``(ROWS COLS)``, it is -passed to the corresponding arguments of `insert-sliced-image'. - -.. FIXME: ROWS and COLS must be determined dynamically by measuring - the size of iamge and Emacs window. - -See also: https://github.com/tkf/emacs-ipython-notebook/issues/94" - :type 'boolean - :group 'ein) - (defcustom ein:truncate-long-cell-output nil "When nil do not truncate cells with long outputs. When set to a number will limit the number of lines in a cell output." @@ -209,7 +200,6 @@ a number will limit the number of lines in a cell output." :type 'list :group 'ein) - ;;; EIEIO related utils (defmacro ein:oset-if-empty (obj slot value) @@ -220,26 +210,64 @@ a number will limit the number of lines in a cell output." `(when (slot-boundp ,obj ,slot) (slot-value ,obj ,slot))) - ;;; Utils -(defvar ein:mime-type-map - '((image/svg+xml . svg) (image/png . png) (image/jpeg . jpeg))) + +(defun ein:make-mm-handle (image) + (let ((mime-type (mailcap-extension-to-mime + (symbol-name (plist-get (cdr image) :type))))) + (with-temp-buffer + (save-excursion (insert (plist-get (cdr image) :data))) + (let ((encoding (mm-encode-buffer (list mime-type)))) + (mm-possibly-verify-or-decrypt + (mm-dissect-singlepart (list mime-type) encoding) + (list mime-type)))))) + +(defun ein:external-image-viewer (image-type) + (let (major ; Major encoding (text, etc) + minor ; Minor encoding (html, etc) + info ; Other info + major-info ; (assoc major mailcap-mime-data) + viewers ; Possible viewers + passed ; Viewers that passed the test + viewer ; The one and only viewer + (ctl (mail-header-parse-content-type (concat "image/" image-type)))) + (mailcap-parse-mailcaps nil t) + (setq major (split-string (car ctl) "/")) + (setq minor (cadr major) + major (car major)) + (when (setq major-info (cdr (assoc major mailcap-mime-data))) + (when (setq viewers (mailcap-possible-viewers major-info minor)) + (setq info (mapcar (lambda (a) + (cons (symbol-name (car a)) (cdr a))) + (cdr ctl))) + (dolist (entry viewers) + (when (mailcap-viewer-passes-test entry info) + (push entry passed))) + (setq passed (sort (nreverse passed) 'mailcap-viewer-lessp)) + ;; When we want to prefer entries from the user's + ;; ~/.mailcap file, then we filter out the system entries + ;; and see whether we have anything left. + (when (if (boundp 'mailcap-prefer-mailcap-viewers) + mailcap-prefer-mailcap-viewers + t) + (when-let ((user-entry + (seq-find (lambda (elem) + (eq (cdr (assq 'source elem)) 'user)) + passed))) + (setq passed (list user-entry)))) + (setq viewer (car passed)))) + (when (and (stringp (cdr (assq 'viewer viewer))) + passed) + (setq viewer (car passed))) + (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))) (defun ein:insert-image (&rest args) - ;; Try to insert the image, otherwise emit a warning message and proceed. (condition-case-unless-debug err - (let* ((img (apply #'create-image args)) - (buffer-undo-list t)) - (if ein:slice-image - (destructuring-bind (&optional rows cols) - (when (listp ein:slice-image) ein:slice-image) - (insert-sliced-image img "." nil (or rows 20) cols)) - (insert-image img "."))) - (error (ein:log 'warn "Could not insert image: %s" - (error-message-string err)) - nil))) + (let ((img (apply #'create-image args)) + (buffer-undo-list t)) + (insert-image img ".")) + (error (ein:log 'warn "Could not insert image: %s" (error-message-string err))))) - ;;; Cell factory (defun ein:cell-class-from-type (type) @@ -364,7 +392,6 @@ a number will limit the number of lines in a cell output." for en in (ein:cell-all-element cell) do (ein:cell--ewoc-invalidate ewoc en)))) - ;;; Getter/setter (cl-defmethod ein:cell-num-outputs ((cell ein:codecell)) @@ -430,7 +457,6 @@ Return language name as a string or `nil' when not defined. (cl-defmethod ein:cell-language ((cell ein:htmlcell)) nil "html") (cl-defmethod ein:cell-language ((cell ein:rawcell)) nil "rst") - ;; EWOC (defun ein:cell-make-element (make-node num-outputs) @@ -776,7 +802,6 @@ If END is non-`nil', return the location of next element." "Return a buffer associated by CELL (if any)." (ein:aand (ein:oref-safe cell 'ewoc) (ewoc-buffer it))) - ;; Data manipulation (cl-defmethod ein:cell-clear-output ((cell ein:codecell) stdout stderr other) @@ -836,7 +861,7 @@ If END is non-`nil', return the location of next element." (list 'output-stream 'output-subarea (intern (format "output-%s" (plist-get json :stream))))))) -(cl-defmethod ein:cell-append-output ((cell ein:codecell) json dynamic) +(cl-defmethod ein:cell-append-output ((cell ein:codecell) json) ;; When there is a python error, we actually get two identical tracebacks back ;; from the kernel, one from the "shell" channel, and one from the "iopub" ;; channel. As a workaround, we remember the cell's traceback and ignore @@ -847,10 +872,10 @@ If END is non-`nil', return the location of next element." (null old-tb) (null new-tb) (not (cl-equalp new-tb old-tb))) - (ein:cell-actually-append-output cell json dynamic)) + (ein:cell-actually-append-output cell json)) (setf (slot-value cell 'traceback) new-tb))) -(cl-defmethod ein:cell-actually-append-output ((cell ein:codecell) json dynamic) +(cl-defmethod ein:cell-actually-append-output ((cell ein:codecell) json) (ein:cell-expand cell) ;; (ein:flush-clear-timeout) (setf (slot-value cell 'outputs) @@ -876,7 +901,7 @@ Called from ewoc pretty printer via `ein:cell-insert-output'." (or (plist-get json :prompt_number) " ")) 'font-lock-face 'ein:cell-output-prompt) (ein:insert-read-only "\n") - (ein:cell-append-mime-type json (slot-value cell 'dynamic)) + (ein:cell-append-mime-type json) (ein:insert-read-only "\n")) (cl-defmethod ein:cell-append-pyerr ((cell ein:codecell) json) @@ -923,86 +948,33 @@ Called from ewoc pretty printer via `ein:cell-insert-output'." (cl-defmethod ein:cell-append-display-data ((cell ein:codecell) json) "Insert display-data type output in the buffer. Called from ewoc pretty printer via `ein:cell-insert-output'." - (ein:cell-append-mime-type json (slot-value cell 'dynamic)) + (ein:cell-append-mime-type json) (ein:insert-read-only "\n")) -(defcustom ein:output-type-preference - (if (and (fboundp 'shr-insert-document) - (fboundp 'libxml-parse-xml-region)) - #'ein:output-type-prefer-pretty-text-over-html - '(emacs-lisp svg image/svg+xml png image/png jpeg image/jpeg html text/html latex text/latex javascript text/javascript text text/plain)) - "Output types to be used in notebook. -First output-type found in this list will be used. -This variable can be a list or a function returning a list given -DATA plist. -See also `ein:output-type-prefer-pretty-text-over-html'. +(make-obsolete-variable 'ein:output-type-preference nil "0.17.0") -**Example**: -If you prefer HTML type over text type, you can set it as:: +(defsubst ein:cell-output-type (mime-type) + "Investigate why :image/svg+xml to :svg and :text/plain to :text" + (let* ((mime-str (if (symbolp mime-type) (symbol-name mime-type) mime-type)) + (minor (car (nreverse (split-string mime-str "/"))))) + (intern (concat ":" + (cond ((string= minor "plain") "text") + (t (intern (cl-subseq minor 0 (cl-search "+" minor))))))))) - (setq ein:output-type-preference - '(emacs-lisp svg png jpeg html text latex javascript)) - -Note that ``html`` comes before ``text``." - :type '(choice function (repeat symbol)) - :group 'ein) - -(defvar ein:output-types-text-preferred - '(emacs-lisp svg image/svg+xml png image/png jpeg image/jpeg text text/plain html text/html latex text/latex javascript text/javascript)) - -(defvar ein:output-types-html-preferred - '(emacs-lisp svg image/svg+xml png image/png jpeg image/jpeg html text/html latex text/latex javascript text/javascript text text/plain)) - -(defun ein:output-type-prefer-pretty-text-over-html (data) - "Use text type if it is a \"prettified\" text instead of HTML. -This is mostly for *not* using HTML table for pandas but using -HTML for other object. - -If the text type output contains a newline, it is assumed be a -prettified text thus be used instead of HTML type." - (if (ein:aand (or (plist-get data :text) - (plist-get data :text/plain)) - (string-match-p "\n" it)) - ein:output-types-text-preferred - ein:output-types-html-preferred)) - -(defun ein:fix-mime-type (type) - (aif (assoc type ein:mime-type-map) - (cdr it) - type)) - -(defun ein:cell-append-mime-type (json dynamic) - (when (plist-get json :data) - (setq json (plist-get json :data))) ;; For nbformat v4 support. - (cl-loop - for key in (cond - ((functionp ein:output-type-preference) - (funcall ein:output-type-preference json)) - (t ein:output-type-preference)) - for type = (intern (format ":%s" key)) ; something like `:text' - for value = (plist-get json type) ; FIXME: optimize - when (plist-member json type) - return - (case key - ;; NOTE: Normally `javascript' and `html' will not be inserted as - ;; they come out after `text'. Maybe it is better to inform user - ;; when one of them is inserted. - ((javascript text/javascript) - (when dynamic - (ein:log 'info (concat "ein:cell-append-mime-type does not support " - "dynamic javascript. got: %s") value)) - (ein:insert-read-only (plist-get json type))) - (emacs-lisp - (when dynamic - (ein:cell-safe-read-eval-insert (plist-get json type)))) - ((html text/html) - (funcall (ein:output-area-get-html-renderer) (plist-get json type))) - ((latex text/latex text text/plain) - (ein:insert-read-only (plist-get json type))) - ((svg image/svg+xml) - (ein:insert-image value (ein:fix-mime-type key) t)) - ((png image/png jpeg image/jpeg) - (ein:insert-image (base64-decode-string value) (ein:fix-mime-type key) t))))) +(defun ein:cell-append-mime-type (json) + (ein:output-area-case-type + json + (cl-case type + ((:html) + (funcall (ein:output-area-get-html-renderer) value)) + ((:svg :png :jpeg) + (ein:insert-image (condition-case nil + (base64-decode-string value) + (error value)) + type + t)) + (otherwise + (ein:insert-read-only value))))) (defun ein:cell-append-text (data &rest properties) ;; escape ANSI in plaintext: @@ -1154,7 +1126,6 @@ prettified text thus be used instead of HTML type." (when (cl-typep cell 'ein:basecell) cell)))) - ;;; Kernel related calls. (cl-defmethod ein:cell-set-kernel ((cell ein:codecell) kernel) @@ -1172,7 +1143,6 @@ prettified text thus be used instead of HTML type." (ein:cell-running-set cell t) (ein:cell-clear-output cell t t t) (ein:cell-set-input-prompt cell "*") - (setf (slot-value cell 'dynamic) t) (apply #'ein:kernel-execute kernel code (ein:cell-make-callbacks cell) args)) (cl-defmethod ein:cell-make-callbacks ((cell ein:codecell)) @@ -1201,7 +1171,6 @@ prettified text thus be used instead of HTML type." )) - ;;; Output area ;; These function should go to ein-output-area.el. But as cell and @@ -1220,31 +1189,28 @@ prettified text thus be used instead of HTML type." (when (or (equal msg-type "pyout") (equal msg-type "execute_result")) (plist-put json :prompt_number (plist-get content :execution_count))) - (setq json - (ein:output-area-convert-mime-types json (plist-get content :data)))) + (setq json (ein:output-area-convert-mime-types json (plist-get content :data)))) (("pyerr" "error") (plist-put json :ename (plist-get content :ename)) (plist-put json :evalue (plist-get content :evalue)) (plist-put json :traceback (plist-get content :traceback)))) - (ein:cell-append-output cell json t) + (ein:cell-append-output cell json) ;; (setf (slot-value cell 'dirty) t) (ein:events-trigger (slot-value cell 'events) 'maybe_reset_undo.Worksheet cell))) - (defun ein:output-area-convert-mime-types (json data) - (cl-loop for (prop . mime) in '((:text . :text/plain) - (:html . :text/html) - (:svg . :image/svg+xml) - (:png . :image/png) - (:jpeg . :image/jpeg) - (:latex . :text/latex) - (:json . :application/json) - (:javascript . :application/javascript) - (:emacs-lisp . :application/emacs-lisp)) - when (plist-member data mime) - do (plist-put json prop (plist-get data mime))) - json) - + (let ((known-mimes (cl-remove-if-not + #'identity + (mapcar (lambda (x) (intern-soft (concat ":" x))) + (mailcap-mime-types))))) + (or (seq-some (lambda (x) + (-when-let* ((mime-val + (plist-get data x)) + (minor-kw + (ein:cell-output-type x))) + (plist-put json minor-kw mime-val))) + known-mimes) + json))) (cl-defmethod ein:cell--handle-clear-output ((cell ein:codecell) content _metadata) @@ -1256,7 +1222,6 @@ prettified text thus be used instead of HTML type." ) (ein:events-trigger (slot-value cell 'events) 'maybe_reset_undo.Worksheet cell)) - ;;; Misc. (cl-defmethod ein:cell-has-image-ouput-p ((cell ein:codecell)) diff --git a/lisp/ein-classes.el b/lisp/ein-classes.el index 610963b..83fdfc6 100644 --- a/lisp/ein-classes.el +++ b/lisp/ein-classes.el @@ -270,17 +270,6 @@ Typed `:input-prompt-number' becomes a problem when reading a notebook that saved "*". So don't add `:type'!") (collapsed :initarg :collapsed :initform nil :type boolean) (running :initarg :running :initform nil :type boolean) - (dynamic :initarg :dynamic :initform nil :type boolean - :documentation "\ -Whether cell output is evaluated dynamically or not. - -Only Emacs lisp type output data will be affected by this -slot (Javascript will not be evaluated). This value must be set -to `t' when executing cell. See `ein:notebook-execute-cell'. -In the implantation of IPython web client it is passed around via -argument, but since it is difficult to pass argument to EWOC -pretty printer, `ein:codecell' instance holds this setting in a -slot.") (autoexec :initarg :autoexec :initform nil :type boolean :documentation "Auto-execution flag. diff --git a/lisp/ein-connect.el b/lisp/ein-connect.el index d6e265c..5d6cd20 100644 --- a/lisp/ein-connect.el +++ b/lisp/ein-connect.el @@ -100,13 +100,14 @@ Same as `ein:connect-run-command'." (const :tag "Ask" ask)) :group 'ein) -(defcustom ein:connect-aotoexec-lighter nil +(defcustom ein:connect-autoexec-lighter nil "String appended to the lighter of `ein:connect-mode' (`ein:c') when auto-execution mode is on. When `nil', use the same string as `ein:cell-autoexec-prompt'." :type '(choice (string :tag "String appended to ein:c" "@") (const :tag "Use `ein:cell-autoexec-prompt'." nil)) :group 'ein) +(define-obsolete-variable-alias 'ein:connect-aotoexec-lighter 'ein:connect-autoexec-lighter "0.17.0") (defcustom ein:connect-default-notebook nil "Notebook to be connect when `ein:connect-to-default-notebook' is called. @@ -383,7 +384,7 @@ notebook." (defun ein:connect-mode-get-lighter () (if (slot-value ein:%connect% 'autoexec) - (format " ein:c%s" (or ein:connect-aotoexec-lighter + (format " ein:c%s" (or ein:connect-autoexec-lighter ein:cell-autoexec-prompt)) " ein:c")) diff --git a/lisp/ein-output-area.el b/lisp/ein-output-area.el index 90b3bfe..78b5ca7 100644 --- a/lisp/ein-output-area.el +++ b/lisp/ein-output-area.el @@ -64,16 +64,11 @@ when REPLACE-P returns non-`nil'." (setcdr attr-cell (funcall replacer val)) t)))) - -;;; HTML renderer (defun ein:output-area-get-html-renderer () - ;; FIXME: make this configurable - (cond - ((and (fboundp 'shr-insert-document) - (fboundp 'libxml-parse-xml-region)) - #'ein:insert-html-shr) - (t #'ein:insert-read-only))) + (if (and (fboundp 'shr-insert-document) (fboundp 'libxml-parse-xml-region)) + #'ein:insert-html-shr + #'ein:insert-read-only)) (defcustom ein:shr-env '((shr-table-horizontal-line ?-) @@ -125,6 +120,12 @@ Usage:: (ein:xml-replace-attributes dom 'a 'href replace-p replacer) (ein:xml-replace-attributes dom 'img 'src replace-p replacer))) +(defmacro ein:output-area-case-type (json &rest case-body) + `(progn (aif (plist-get ,json :data) (setq ,json it)) ;; nbformat v4 ??? + (seq-some (lambda (type) + (when-let ((value (plist-get ,json type))) + ,@case-body)) + (list :svg :png :jpeg :text :html :latex :javascript)))) (provide 'ein-output-area) diff --git a/lisp/ob-ein.el b/lisp/ob-ein.el index 02438d9..3e7c8dd 100644 --- a/lisp/ob-ein.el +++ b/lisp/ob-ein.el @@ -58,7 +58,8 @@ (autoload 'ein:shared-output-get-cell "ein-shared-output") (autoload 'ein:shared-output-eval-string "ein-shared-output") (autoload 'ein:kernel-live-p "ein-kernel") -(autoload 'ein:query-singleton-ajax "ein:query") +(autoload 'ein:query-singleton-ajax "ein-query") +(autoload 'ein:output-area-case-type "ein-output-area") (defvar *ob-ein-sentinel* "[....]" "Placeholder string replaced after async cell execution") @@ -117,22 +118,14 @@ (base64-decode-region (point-min) (point-max))))) (defun ob-ein--return-mime-type (json file) - (cl-loop - for key in ein:output-types-text-preferred - for type = (intern (format ":%s" key)) ; something like `:text' - for value = (plist-get json type) ; FIXME: optimize - when (plist-member json type) - return - (case key - ((svg image/svg) - (let ((file (or file (ob-ein--inline-image-info value)))) - (ob-ein--write-base64-image value file) - (format "[[file:%s]]" file))) - ((png image/png jpeg image/jpeg) - (let ((file (or file (ob-ein--inline-image-info value)))) - (ob-ein--write-base64-image value file) - (format "[[file:%s]]" file))) - (t (plist-get json type))))) + (ein:output-area-case-type + json + (cl-case type + ((:svg :png :jpeg) + (ob-ein--write-base64-image value + (or file (ob-ein--inline-image-info value))) + (format "[[file:%s]]" file)) + (otherwise value)))) (defun ob-ein--process-outputs (outputs params) (let ((file (cdr (assoc :image params)))) diff --git a/test/test-ein-cell-notebook.el b/test/test-ein-cell-notebook.el index 0047be3..26ee9ae 100644 --- a/test/test-ein-cell-notebook.el +++ b/test/test-ein-cell-notebook.el @@ -6,7 +6,6 @@ (require 'ein-notebook) (require 'ein-testing-notebook) - ;; ein:cell-location (ert-deftest ein:cell-location-codecell-prompt-beg () @@ -34,7 +33,6 @@ (should (equal (marker-position (ein:cell-location cell :input t)) (1+ (point)))))) - ;; from-json (ert-deftest eintest:cell-input-prompt-number () @@ -78,27 +76,23 @@ In \\[ \\]: some input ")))) - ;; Insert pyout/display_data (defun eintest:cell-insert-output (outputs regexp) - (let ((ein:output-type-preference (reverse (if (functionp ein:output-type-preference) - (funcall ein:output-type-preference nil) - ein:output-type-preference)))) - (ein:testing-with-one-cell - (ein:cell-from-json - (list :cell_type "code" - :outputs outputs - :source "some input" - :metadata (list :collapsed json-false :autoscroll json-false) - :execution_count 111) - :ewoc (oref ein:%worksheet% :ewoc)) - (goto-char (ein:cell-location cell)) - ;; (message "%s" (buffer-string)) - (should (looking-at (format "\ + (ein:testing-with-one-cell + (ein:cell-from-json + (list :cell_type "code" + :outputs outputs + :source "some input" + :metadata (list :collapsed json-false :autoscroll json-false) + :execution_count 111) + :ewoc (oref ein:%worksheet% :ewoc)) + (goto-char (ein:cell-location cell)) + (message "%s" (buffer-string)) + (should (looking-at (format "\ In \\[111\\]: some input -%s" regexp)))))) +%s" regexp))))) (defmacro eintest:gene-test-cell-insert-output-pyout-and-display-data (name regexps outputs) @@ -109,11 +103,11 @@ some input (intern (format "ein:cell-insert-output-display-data-%s" name))) (outputs-pyout (cl-loop for i from 1 - for x in outputs - collect - ;; ein:cell--handle-output doesn't get called - ;; so can't use :execution_count here although that is preferable - (append x (list :output_type "execute_result" :prompt_number i :metadata nil)))) + for x in outputs + collect + ;; ein:cell--handle-output doesn't get called + ;; so can't use :execution_count here although that is preferable + (append x (list :output_type "execute_result" :prompt_number i :metadata nil)))) (outputs-display-data (mapcar (lambda (x) (append '(:output_type "display_data" :metadata nil) x)) outputs)) @@ -134,47 +128,47 @@ some input ,regexp-display-data))))) (eintest:gene-test-cell-insert-output-pyout-and-display-data - text ("some output") ((:data (:text/plain "some output")))) + text ("some output") ((:data (:text "some output")))) (eintest:gene-test-cell-insert-output-pyout-and-display-data latex ("some output \\\\LaTeX") - ((:data (:text/latex "some output \\LaTeX")))) + ((:data (:latex "some output \\LaTeX")))) (when (image-type-available-p 'svg) (eintest:gene-test-cell-insert-output-pyout-and-display-data svg ("some output text") - ((:data (:text/plain "some output text" :image/svg ein:testing-example-svg))))) + ((:data (:text "some output text" :svg ein:testing-example-svg))))) (eintest:gene-test-cell-insert-output-pyout-and-display-data html ("some output text") - ((:data (:text/plain "some output text" :text/html "not shown")))) + ((:data (:text "some output text" :html "not shown")))) (eintest:gene-test-cell-insert-output-pyout-and-display-data javascript ("some output text") - ((:data (:text/plain "some output text" :text/javascript "$.do.something()")))) + ((:data (:text "some output text" :javascript "$.do.something()")))) (eintest:gene-test-cell-insert-output-pyout-and-display-data text-two ("first output text" "second output text") - ((:data (:text/plain "first output text")) (:data (:text/plain "second output text")))) + ((:data (:text "first output text")) (:data (:text "second output text")))) (eintest:gene-test-cell-insert-output-pyout-and-display-data text-javascript ("first output text" "second output text") - ((:data (:text/plain "first output text")) - (:data (:text/plain "second output text" :text/javascript "$.do.something()")))) + ((:data (:text "first output text")) + (:data (:text "second output text" :javascript "$.do.something()")))) (when (image-type-available-p 'svg) (eintest:gene-test-cell-insert-output-pyout-and-display-data text-latex-svg ("first output text" "second output \\\\LaTeX" "some output text") - ((:data (:text/plain "first output text")) - (:data (:text/latex "second output \\LaTeX")) - (:data (:text/plain "some output text" :image/svg ein:testing-example-svg))))) + ((:data (:text "first output text")) + (:data (:latex "second output \\LaTeX")) + (:data (:text "some output text" :svg ein:testing-example-svg))))) ;; Insert pyerr diff --git a/tools/install-R.sh b/tools/install-R.sh index 9692648..0c4043f 100644 --- a/tools/install-R.sh +++ b/tools/install-R.sh @@ -16,11 +16,9 @@ if [ "x$UNAME" = "xLinux" ] ; then make && make install find ${WORKDIR}/R -name R -print fi - R -e "install.packages('IRkernel', repos='http://cran.mirrors.hoobly.com')" - R -e "IRkernel::installspec()" elif [ "x$UNAME" = "xDarwin" ]; then brew list r &>/dev/null || HOMEBREW_NO_AUTO_UPDATE=1 brew install r - R -e "install.packages('IRkernel', repos='http://cran.mirrors.hoobly.com')" - R -e "IRkernel::installspec()" fi +R -e "install.packages('IRkernel', repos='http://cran.mirrors.hoobly.com')" +R -e "IRkernel::installspec()" R --version