diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js
index 3b03d7c..9c151be 100644
--- a/IPython/html/static/notebook/js/notebook.js
+++ b/IPython/html/static/notebook/js/notebook.js
@@ -207,9 +207,18 @@ define([
});
this.events.on('spec_changed.Kernel', function(event, data) {
- that.set_kernelspec_metadata(data);
+ that.metadata.kernelspec =
+ {name: data.name, display_name: data.display_name};
+ });
+
+ this.events.on('kernel_ready.Kernel', function(event, data) {
+ var kinfo = data.kernel.info_reply
+ var langinfo = kinfo.language_info || {};
+ if (!langinfo.name) langinfo.name = kinfo.language;
+
+ that.metadata.language_info = langinfo;
// Mode 'null' should be plain, unhighlighted text.
- cm_mode = data.codemirror_mode || data.language || 'null'
+ var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null'
that.set_codemirror_mode(cm_mode);
});
@@ -329,21 +338,11 @@ define([
md: this.metadata,
callback: function (md) {
that.metadata = md;
- },
+ },
name: 'Notebook',
notebook: this,
keyboard_manager: this.keyboard_manager});
};
-
- Notebook.prototype.set_kernelspec_metadata = function(ks) {
- var tostore = {};
- $.map(ks, function(value, field) {
- if (field !== 'argv' && field !== 'env') {
- tostore[field] = value;
- }
- });
- this.metadata.kernelspec = tostore;
- }
// Cell indexing, retrieval, etc.
@@ -1811,6 +1810,14 @@ define([
this.events.trigger('spec_changed.Kernel', this.metadata.kernelspec);
}
+ // Set the codemirror mode from language_info metadata
+ if (this.metadata.language_info !== undefined) {
+ var langinfo = this.metadata.language_info;
+ // Mode 'null' should be plain, unhighlighted text.
+ var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null'
+ this.set_codemirror_mode(cm_mode);
+ }
+
// Only handle 1 worksheet for now.
var worksheet = content.worksheets[0];
if (worksheet !== undefined) {
diff --git a/IPython/html/static/services/kernels/kernel.js b/IPython/html/static/services/kernels/kernel.js
index 9ad4fcb..38ac473 100644
--- a/IPython/html/static/services/kernels/kernel.js
+++ b/IPython/html/static/services/kernels/kernel.js
@@ -46,6 +46,7 @@ define([
this.username = "username";
this.session_id = utils.uuid();
this._msg_callbacks = {};
+ this.info_reply = {}; // kernel_info_reply stored here after starting
if (typeof(WebSocket) !== 'undefined') {
this.WebSocket = WebSocket;
@@ -398,7 +399,8 @@ define([
this.events.trigger('kernel_starting.Kernel', {kernel: this});
// get kernel info so we know what state the kernel is in
var that = this;
- this.kernel_info(function () {
+ this.kernel_info(function (reply) {
+ that.info_reply = reply.content;
that.events.trigger('kernel_ready.Kernel', {kernel: that});
});
};
@@ -925,7 +927,8 @@ define([
} else if (execution_state === 'starting') {
this.events.trigger('kernel_starting.Kernel', {kernel: this});
var that = this;
- this.kernel_info(function () {
+ this.kernel_info(function (reply) {
+ that.info_reply = reply.content;
that.events.trigger('kernel_ready.Kernel', {kernel: that});
});
diff --git a/IPython/kernel/kernelspec.py b/IPython/kernel/kernelspec.py
index 63ea62a..58d3250 100644
--- a/IPython/kernel/kernelspec.py
+++ b/IPython/kernel/kernelspec.py
@@ -36,18 +36,9 @@ def _pythonfirst(s):
class KernelSpec(HasTraits):
argv = List()
display_name = Unicode()
- language = Unicode()
- codemirror_mode = Any() # can be unicode or dict
- pygments_lexer = Unicode()
env = Dict()
resource_dir = Unicode()
- def _codemirror_mode_default(self):
- return self.language
-
- def _pygments_lexer_default(self):
- return self.language
-
@classmethod
def from_resource_dir(cls, resource_dir):
"""Create a KernelSpec object by reading kernel.json
@@ -63,12 +54,7 @@ class KernelSpec(HasTraits):
d = dict(argv=self.argv,
env=self.env,
display_name=self.display_name,
- language=self.language,
)
- if self.codemirror_mode != self.language:
- d['codemirror_mode'] = self.codemirror_mode
- if self.pygments_lexer != self.language:
- d['pygments_lexer'] = self.pygments_lexer
return d
@@ -118,12 +104,8 @@ class KernelSpecManager(HasTraits):
process. This will put its informatino in the user kernels directory.
"""
return {'argv': make_ipkernel_cmd(),
- 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2),
- 'language': 'python',
- 'codemirror_mode': {'name': 'ipython',
- 'version': sys.version_info[0]},
- 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2),
- }
+ 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2),
+ }
@property
def _native_kernel_resource_dir(self):
diff --git a/IPython/kernel/zmq/ipkernel.py b/IPython/kernel/zmq/ipkernel.py
index 793cd48..d698729 100644
--- a/IPython/kernel/zmq/ipkernel.py
+++ b/IPython/kernel/zmq/ipkernel.py
@@ -68,6 +68,11 @@ class IPythonKernel(KernelBase):
implementation_version = release.version
language = 'python'
language_version = sys.version.split()[0]
+ language_info = {'mimetype': 'text/x-python',
+ 'codemirror_mode': {'name': 'ipython',
+ 'version': sys.version_info[0]},
+ 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2),
+ }
@property
def banner(self):
return self.shell.banner
diff --git a/IPython/kernel/zmq/kernelbase.py b/IPython/kernel/zmq/kernelbase.py
index 85f7beb..42b38c0 100755
--- a/IPython/kernel/zmq/kernelbase.py
+++ b/IPython/kernel/zmq/kernelbase.py
@@ -60,6 +60,10 @@ class Kernel(SingletonConfigurable):
def _ident_default(self):
return unicode_type(uuid.uuid4())
+ # This should be overridden by wrapper kernels that implement any real
+ # language.
+ language_info = {}
+
# Private interface
_darwin_app_nap = Bool(True, config=True,
@@ -453,6 +457,7 @@ class Kernel(SingletonConfigurable):
'implementation_version': self.implementation_version,
'language': self.language,
'language_version': self.language_version,
+ 'language_info': self.language_info,
'banner': self.banner,
}