diff --git a/IPython/html/static/notebook/js/kernelselector.js b/IPython/html/static/notebook/js/kernelselector.js index 01f6d2a..ed6195e 100644 --- a/IPython/html/static/notebook/js/kernelselector.js +++ b/IPython/html/static/notebook/js/kernelselector.js @@ -21,6 +21,7 @@ define([ this.bind_events(); // Make the object globally available for user convenience & inspection IPython.kernelselector = this; + Object.seal(this); }; KernelSelector.prototype.request_kernelspecs = function() { @@ -61,10 +62,30 @@ define([ }; KernelSelector.prototype.change_kernel = function(kernel_name) { + /** + * TODO, have a methods to set kernel spec directly ? + **/ + var that = this; if (kernel_name === this.current_selection) { return; } var ks = this.kernelspecs[kernel_name]; + var new_mode_url = 'kernelspecs/'+ks.name+'/kernel'; + + var css_url = this.notebook.base_url+new_mode_url+'.css'; + $.ajax({ + type: 'HEAD', + url: css_url, + success: function(){ + $('#kernel-css') + .attr('href',css_url); + }, + error:function(){ + console.warn(new_mode_url+' does not provide custom URL, you might see a 404 error that shoudl not prevent '+ + ' the Jupyter notebook from working :' ,css_url ); + } + }); + try { this.notebook.start_session(kernel_name); } catch (e) { @@ -78,8 +99,32 @@ define([ return; } this.events.trigger('spec_changed.Kernel', ks); + + + // load new mode kernel.js if exist + require([new_mode_url], + // if new mode has custom.js + function(new_mode){ + that.lock_switch(); + if(new_mode && new_mode.onload){ + new_mode.onload(); + } else { + console.warn("The current kernel seem to define a kernel.js file; though this file does"+ + "not contain any asynchronous module definition. This is undefined behavior"+ + "which is not recommeneded"); + } + }, + function(err){ + // if new mode does not have custom.js + console.warn('Any above 404 on '+new_mode_url+'.js is normal'); + } + ); }; - + + KernelSelector.prototype.lock_switch = function() { + console.warn('switching kernel is not guarantied to work !'); + }; + KernelSelector.prototype.bind_events = function() { var that = this; this.events.on('spec_changed.Kernel', function(event, data) { @@ -87,7 +132,7 @@ define([ that.element.find("#current_kernel_spec").find('.kernel_name').text(data.display_name); that.element.find("#current_kernel_logo").attr("src", "/kernelspecs/"+data.name+"/logo-64x64.png"); }); - + this.events.on('kernel_created.Session', function(event, data) { if (data.kernel.name !== that.current_selection) { // If we created a 'python' session, we only know if it's Python diff --git a/IPython/html/static/notebook/js/main.js b/IPython/html/static/notebook/js/main.js index a6c8264..cff2c58 100644 --- a/IPython/html/static/notebook/js/main.js +++ b/IPython/html/static/notebook/js/main.js @@ -113,6 +113,7 @@ require([ notification_area.init_notification_widgets(); var kernel_selector = new kernelselector.KernelSelector( '#kernel_selector_widget', notebook); + notebook.set_kernelselector(kernel_selector); $('body').append('
x'+ 'x'+ diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js index 19556f2..6c8496b 100644 --- a/IPython/html/static/notebook/js/notebook.js +++ b/IPython/html/static/notebook/js/notebook.js @@ -1864,7 +1864,14 @@ define([ // Trigger an event changing the kernel spec - this will set the default // codemirror mode if (this.metadata.kernelspec !== undefined) { - this.events.trigger('spec_changed.Kernel', this.metadata.kernelspec); + // TODO shoudl probably not trigger here, + // should call the kernel selector, or custom.{js|css} not loaded. + if(this.kernel_selector){ + // technically not perfect, we should check that the kernelspec matches + this.kernel_selector.change_kernel(this.metadata.kernelspec.name); + } else { + console.log('do not have handle on kernnel_selector'); + } } // Set the codemirror mode from language_info metadata @@ -2308,6 +2315,10 @@ define([ this.events.trigger('notebook_loaded.Notebook'); }; + Notebook.prototype.set_kernelselector = function(k_selector){ + this.kernel_selector = k_selector; + }; + /** * Failure callback for loading a notebook from the server. * diff --git a/IPython/html/templates/notebook.html b/IPython/html/templates/notebook.html index 9c7547e..236339d 100644 --- a/IPython/html/templates/notebook.html +++ b/IPython/html/templates/notebook.html @@ -17,6 +17,7 @@ window.mathjax_url = "{{mathjax_url}}"; {{super()}} + {% endblock %} diff --git a/IPython/html/templates/page.html b/IPython/html/templates/page.html index 48f0a89..541f5a9 100644 --- a/IPython/html/templates/page.html +++ b/IPython/html/templates/page.html @@ -24,6 +24,7 @@ baseUrl: '{{static_url("", include_version=False)}}', paths: { nbextensions : '{{ base_url }}nbextensions', + kernelspecs : '{{ base_url }}kernelspecs', underscore : 'components/underscore/underscore-min', backbone : 'components/backbone/backbone-min', jquery: 'components/jquery/jquery.min',