diff --git a/IPython/html/static/notebook/js/codecell.js b/IPython/html/static/notebook/js/codecell.js index f59515f..98f4bb5 100644 --- a/IPython/html/static/notebook/js/codecell.js +++ b/IPython/html/static/notebook/js/codecell.js @@ -110,6 +110,7 @@ define([ // Attributes we want to override in this subclass. this.cell_type = "code"; + var that = this; this.element.focusout( function() { that.auto_highlight(); } ); diff --git a/IPython/html/static/notebook/js/outputarea.js b/IPython/html/static/notebook/js/outputarea.js index d6af41a..91a4322 100644 --- a/IPython/html/static/notebook/js/outputarea.js +++ b/IPython/html/static/notebook/js/outputarea.js @@ -212,11 +212,9 @@ define([ json.name = content.name; } else if (msg_type === "display_data") { json.data = content.data; - json.output_type = msg_type; json.metadata = content.metadata; } else if (msg_type === "execute_result") { json.data = content.data; - json.output_type = msg_type; json.metadata = content.metadata; json.execution_count = content.execution_count; } else if (msg_type === "error") { diff --git a/IPython/html/static/widgets/js/widget_output.js b/IPython/html/static/widgets/js/widget_output.js index 6ad6e57..241841a 100644 --- a/IPython/html/static/widgets/js/widget_output.js +++ b/IPython/html/static/widgets/js/widget_output.js @@ -9,18 +9,18 @@ define([ 'use strict'; var OutputView = widget.DOMWidgetView.extend({ + /** + * Public constructor + */ initialize: function (parameters) { - /** - * Public constructor - */ OutputView.__super__.initialize.apply(this, [parameters]); this.model.on('msg:custom', this._handle_route_msg, this); }, + /** + * Called when view is rendered. + */ render: function(){ - /** - * Called when view is rendered. - */ this.output_area = new outputarea.OutputArea({ selector: this.$el, prompt_area: false, @@ -43,32 +43,33 @@ define([ this.output_area.element.html(this.model.get('contents')); }, + /** + * Handles re-routed iopub messages. + */ _handle_route_msg: function(content) { if (content) { - // return { - // shell : { - // reply : $.proxy(this._handle_execute_reply, this), - // payload : { - // set_next_input : $.proxy(this._handle_set_next_input, this), - // page : $.proxy(this._open_with_pager, this) - // } - // }, - // iopub : { - // output : function() { - // that.output_area.handle_output.apply(that.output_area, arguments); - // }, - // clear_output : function() { - // that.output_area.handle_clear_output.apply(that.output_area, arguments); - // }, - // }, - // input : $.proxy(this._handle_input_request, this) - // }; - // }; - if (content.method == 'push') { - cell.push_output_area(this.output_area); - } else if (content.method == 'pop') { - cell.pop_output_area(this.output_area); + var msg_type = content.type; + var json = { + output_type: msg_type + }; + + var data = content.args[0]; + if (msg_type=='clear_output') { + this.output_area.clear_output(data.wait || false); + return; + } else if (msg_type === "stream") { + data = content.kwargs.content; + json.text = data.text; + json.name = data.name; + } else if (msg_type === "display_data") { + json.data = data.data; + json.metadata = data.metadata; + } else { + console.log("unhandled output message", msg); + return; } + + this.output_area.append_output(json); } }, }); diff --git a/IPython/html/widgets/widget_output.py b/IPython/html/widgets/widget_output.py index 664bc74..a5d4c20 100644 --- a/IPython/html/widgets/widget_output.py +++ b/IPython/html/widgets/widget_output.py @@ -38,13 +38,30 @@ class Output(DOMWidget): clear_output(*pargs, **kwargs) def __enter__(self): + """Called upon entering output widget context manager.""" self._flush() - self.send({'method': 'push'}) + kernel = get_ipython().kernel + session = kernel.session + send = session.send + self._original_send = send + self._session = session + + def send_hook(stream, msg_or_type, *args, **kwargs): + if stream is kernel.iopub_socket and msg_or_type in ['clear_output', 'stream', 'display_data']: + msg = {'type': msg_or_type, 'args': args, 'kwargs': kwargs} + self.send(msg) + else: + send(stream, msg_or_type, *args, **kwargs) + return + + session.send = send_hook def __exit__(self, exception_type, exception_value, traceback): + """Called upon exiting output widget context manager.""" self._flush() - self.send({'method': 'pop'}) + self._session.send = self._original_send def _flush(self): + """Flush stdout and stderr buffers.""" sys.stdout.flush() sys.stderr.flush()