Show More
@@ -207,9 +207,18 b' define([' | |||
|
207 | 207 | }); |
|
208 | 208 | |
|
209 | 209 | this.events.on('spec_changed.Kernel', function(event, data) { |
|
210 |
that. |
|
|
210 | that.metadata.kernelspec = | |
|
211 | {name: data.name, display_name: data.display_name}; | |
|
212 | }); | |
|
213 | ||
|
214 | this.events.on('kernel_ready.Kernel', function(event, data) { | |
|
215 | var kinfo = data.kernel.info_reply | |
|
216 | var langinfo = kinfo.language_info || {}; | |
|
217 | if (!langinfo.name) langinfo.name = kinfo.language; | |
|
218 | ||
|
219 | that.metadata.language_info = langinfo; | |
|
211 | 220 | // Mode 'null' should be plain, unhighlighted text. |
|
212 |
cm_mode = |
|
|
221 | var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null' | |
|
213 | 222 | that.set_codemirror_mode(cm_mode); |
|
214 | 223 | }); |
|
215 | 224 | |
@@ -329,21 +338,11 b' define([' | |||
|
329 | 338 | md: this.metadata, |
|
330 | 339 | callback: function (md) { |
|
331 | 340 | that.metadata = md; |
|
332 |
}, |
|
|
341 | }, | |
|
333 | 342 | name: 'Notebook', |
|
334 | 343 | notebook: this, |
|
335 | 344 | keyboard_manager: this.keyboard_manager}); |
|
336 | 345 | }; |
|
337 | ||
|
338 | Notebook.prototype.set_kernelspec_metadata = function(ks) { | |
|
339 | var tostore = {}; | |
|
340 | $.map(ks, function(value, field) { | |
|
341 | if (field !== 'argv' && field !== 'env') { | |
|
342 | tostore[field] = value; | |
|
343 | } | |
|
344 | }); | |
|
345 | this.metadata.kernelspec = tostore; | |
|
346 | } | |
|
347 | 346 | |
|
348 | 347 | // Cell indexing, retrieval, etc. |
|
349 | 348 | |
@@ -1811,6 +1810,14 b' define([' | |||
|
1811 | 1810 | this.events.trigger('spec_changed.Kernel', this.metadata.kernelspec); |
|
1812 | 1811 | } |
|
1813 | 1812 | |
|
1813 | // Set the codemirror mode from language_info metadata | |
|
1814 | if (this.metadata.language_info !== undefined) { | |
|
1815 | var langinfo = this.metadata.language_info; | |
|
1816 | // Mode 'null' should be plain, unhighlighted text. | |
|
1817 | var cm_mode = langinfo.codemirror_mode || langinfo.language || 'null' | |
|
1818 | this.set_codemirror_mode(cm_mode); | |
|
1819 | } | |
|
1820 | ||
|
1814 | 1821 | // Only handle 1 worksheet for now. |
|
1815 | 1822 | var worksheet = content.worksheets[0]; |
|
1816 | 1823 | if (worksheet !== undefined) { |
@@ -46,6 +46,7 b' define([' | |||
|
46 | 46 | this.username = "username"; |
|
47 | 47 | this.session_id = utils.uuid(); |
|
48 | 48 | this._msg_callbacks = {}; |
|
49 | this.info_reply = {}; // kernel_info_reply stored here after starting | |
|
49 | 50 | |
|
50 | 51 | if (typeof(WebSocket) !== 'undefined') { |
|
51 | 52 | this.WebSocket = WebSocket; |
@@ -398,7 +399,8 b' define([' | |||
|
398 | 399 | this.events.trigger('kernel_starting.Kernel', {kernel: this}); |
|
399 | 400 | // get kernel info so we know what state the kernel is in |
|
400 | 401 | var that = this; |
|
401 | this.kernel_info(function () { | |
|
402 | this.kernel_info(function (reply) { | |
|
403 | that.info_reply = reply.content; | |
|
402 | 404 | that.events.trigger('kernel_ready.Kernel', {kernel: that}); |
|
403 | 405 | }); |
|
404 | 406 | }; |
@@ -925,7 +927,8 b' define([' | |||
|
925 | 927 | } else if (execution_state === 'starting') { |
|
926 | 928 | this.events.trigger('kernel_starting.Kernel', {kernel: this}); |
|
927 | 929 | var that = this; |
|
928 | this.kernel_info(function () { | |
|
930 | this.kernel_info(function (reply) { | |
|
931 | that.info_reply = reply.content; | |
|
929 | 932 | that.events.trigger('kernel_ready.Kernel', {kernel: that}); |
|
930 | 933 | }); |
|
931 | 934 |
@@ -36,18 +36,9 b' def _pythonfirst(s):' | |||
|
36 | 36 | class KernelSpec(HasTraits): |
|
37 | 37 | argv = List() |
|
38 | 38 | display_name = Unicode() |
|
39 | language = Unicode() | |
|
40 | codemirror_mode = Any() # can be unicode or dict | |
|
41 | pygments_lexer = Unicode() | |
|
42 | 39 | env = Dict() |
|
43 | 40 | resource_dir = Unicode() |
|
44 | 41 | |
|
45 | def _codemirror_mode_default(self): | |
|
46 | return self.language | |
|
47 | ||
|
48 | def _pygments_lexer_default(self): | |
|
49 | return self.language | |
|
50 | ||
|
51 | 42 | @classmethod |
|
52 | 43 | def from_resource_dir(cls, resource_dir): |
|
53 | 44 | """Create a KernelSpec object by reading kernel.json |
@@ -63,12 +54,7 b' class KernelSpec(HasTraits):' | |||
|
63 | 54 | d = dict(argv=self.argv, |
|
64 | 55 | env=self.env, |
|
65 | 56 | display_name=self.display_name, |
|
66 | language=self.language, | |
|
67 | 57 | ) |
|
68 | if self.codemirror_mode != self.language: | |
|
69 | d['codemirror_mode'] = self.codemirror_mode | |
|
70 | if self.pygments_lexer != self.language: | |
|
71 | d['pygments_lexer'] = self.pygments_lexer | |
|
72 | 58 | |
|
73 | 59 | return d |
|
74 | 60 | |
@@ -118,12 +104,8 b' class KernelSpecManager(HasTraits):' | |||
|
118 | 104 | process. This will put its informatino in the user kernels directory. |
|
119 | 105 | """ |
|
120 | 106 | return {'argv': make_ipkernel_cmd(), |
|
121 | 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2), | |
|
122 | 'language': 'python', | |
|
123 | 'codemirror_mode': {'name': 'ipython', | |
|
124 | 'version': sys.version_info[0]}, | |
|
125 | 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2), | |
|
126 | } | |
|
107 | 'display_name': 'IPython (Python %d)' % (3 if PY3 else 2), | |
|
108 | } | |
|
127 | 109 | |
|
128 | 110 | @property |
|
129 | 111 | def _native_kernel_resource_dir(self): |
@@ -9,7 +9,6 b' from IPython.kernel import kernelspec' | |||
|
9 | 9 | |
|
10 | 10 | sample_kernel_json = {'argv':['cat', '{connection_file}'], |
|
11 | 11 | 'display_name':'Test kernel', |
|
12 | 'language':'bash', | |
|
13 | 12 | } |
|
14 | 13 | |
|
15 | 14 | class KernelSpecTests(unittest.TestCase): |
@@ -39,8 +38,6 b' class KernelSpecTests(unittest.TestCase):' | |||
|
39 | 38 | self.assertEqual(ks.resource_dir, self.sample_kernel_dir) |
|
40 | 39 | self.assertEqual(ks.argv, sample_kernel_json['argv']) |
|
41 | 40 | self.assertEqual(ks.display_name, sample_kernel_json['display_name']) |
|
42 | self.assertEqual(ks.language, sample_kernel_json['language']) | |
|
43 | self.assertEqual(ks.codemirror_mode, sample_kernel_json['language']) | |
|
44 | 41 | self.assertEqual(ks.env, {}) |
|
45 | 42 | |
|
46 | 43 | def test_install_kernel_spec(self): |
@@ -157,6 +157,7 b' class KernelInfoReply(Reference):' | |||
|
157 | 157 | implementation_version = Version(min='2.1') |
|
158 | 158 | language_version = Version(min='2.7') |
|
159 | 159 | language = Unicode('python') |
|
160 | language_info = Dict() | |
|
160 | 161 | banner = Unicode() |
|
161 | 162 | |
|
162 | 163 |
@@ -71,6 +71,11 b' class IPythonKernel(KernelBase):' | |||
|
71 | 71 | implementation_version = release.version |
|
72 | 72 | language = 'python' |
|
73 | 73 | language_version = sys.version.split()[0] |
|
74 | language_info = {'mimetype': 'text/x-python', | |
|
75 | 'codemirror_mode': {'name': 'ipython', | |
|
76 | 'version': sys.version_info[0]}, | |
|
77 | 'pygments_lexer': 'ipython%d' % (3 if PY3 else 2), | |
|
78 | } | |
|
74 | 79 | @property |
|
75 | 80 | def banner(self): |
|
76 | 81 | return self.shell.banner |
@@ -60,6 +60,10 b' class Kernel(SingletonConfigurable):' | |||
|
60 | 60 | def _ident_default(self): |
|
61 | 61 | return unicode_type(uuid.uuid4()) |
|
62 | 62 | |
|
63 | # This should be overridden by wrapper kernels that implement any real | |
|
64 | # language. | |
|
65 | language_info = {} | |
|
66 | ||
|
63 | 67 | # Private interface |
|
64 | 68 | |
|
65 | 69 | _darwin_app_nap = Bool(True, config=True, |
@@ -453,6 +457,7 b' class Kernel(SingletonConfigurable):' | |||
|
453 | 457 | 'implementation_version': self.implementation_version, |
|
454 | 458 | 'language': self.language, |
|
455 | 459 | 'language_version': self.language_version, |
|
460 | 'language_info': self.language_info, | |
|
456 | 461 | 'banner': self.banner, |
|
457 | 462 | } |
|
458 | 463 |
@@ -59,8 +59,8 b' class HTMLExporter(TemplateExporter):' | |||
|
59 | 59 | return c |
|
60 | 60 | |
|
61 | 61 | def from_notebook_node(self, nb, resources=None, **kw): |
|
62 |
|
|
|
63 |
lexer = |
|
|
62 | langinfo = nb.metadata.get('language_info', {}) | |
|
63 | lexer = langinfo.get('pygments_lexer', langinfo.get('name', None)) | |
|
64 | 64 | self.register_filter('highlight_code', |
|
65 | 65 | Highlight2HTML(pygments_lexer=lexer, parent=self)) |
|
66 | 66 | return super(HTMLExporter, self).from_notebook_node(nb, resources, **kw) |
@@ -89,8 +89,8 b' class LatexExporter(TemplateExporter):' | |||
|
89 | 89 | return c |
|
90 | 90 | |
|
91 | 91 | def from_notebook_node(self, nb, resources=None, **kw): |
|
92 |
|
|
|
93 |
lexer = |
|
|
92 | langinfo = nb.metadata.get('language_info', {}) | |
|
93 | lexer = langinfo.get('pygments_lexer', langinfo.get('name', None)) | |
|
94 | 94 | self.register_filter('highlight_code', |
|
95 | 95 | Highlight2Latex(pygments_lexer=lexer, parent=self)) |
|
96 | 96 | return super(LatexExporter, self).from_notebook_node(nb, resources, **kw) |
@@ -27,7 +27,7 b' class Highlight2HTML(NbConvertBase):' | |||
|
27 | 27 | |
|
28 | 28 | def _default_language_changed(self, name, old, new): |
|
29 | 29 | warn('Setting default_language in config is deprecated, ' |
|
30 |
'please use |
|
|
30 | 'please use language_info metadata instead.') | |
|
31 | 31 | self.pygments_lexer = new |
|
32 | 32 | |
|
33 | 33 | def __call__(self, source, language=None, metadata=None): |
@@ -61,7 +61,7 b' class Highlight2Latex(NbConvertBase):' | |||
|
61 | 61 | |
|
62 | 62 | def _default_language_changed(self, name, old, new): |
|
63 | 63 | warn('Setting default_language in config is deprecated, ' |
|
64 |
'please use |
|
|
64 | 'please use language_info metadata instead.') | |
|
65 | 65 | self.pygments_lexer = new |
|
66 | 66 | |
|
67 | 67 | def __call__(self, source, language=None, metadata=None, strip_verbatim=False): |
@@ -35,7 +35,7 b' class NbConvertBase(LoggingConfigurable):' | |||
|
35 | 35 | ) |
|
36 | 36 | |
|
37 | 37 | default_language = Unicode('ipython', config=True, |
|
38 |
help='DEPRECATED default highlight language, please use |
|
|
38 | help='DEPRECATED default highlight language, please use language_info metadata instead') | |
|
39 | 39 | |
|
40 | 40 | def __init__(self, **kw): |
|
41 | 41 | super(NbConvertBase, self).__init__(**kw) |
@@ -112,34 +112,16 b' JSON serialised dictionary containing the following keys and values:' | |||
|
112 | 112 | - **display_name**: The kernel's name as it should be displayed in the UI. |
|
113 | 113 | Unlike the kernel name used in the API, this can contain arbitrary unicode |
|
114 | 114 | characters. |
|
115 | - **language**: The programming language which this kernel runs. This will be | |
|
116 | stored in notebook metadata. This may be used by syntax highlighters to guess | |
|
117 | how to parse code in a notebook, and frontends may eventually use it to | |
|
118 | identify alternative kernels that can run some code. | |
|
119 | - **codemirror_mode** (optional): The `codemirror mode <http://codemirror.net/mode/index.html>`_ | |
|
120 | to use for code in this language. This can be a string or a dictionary, as | |
|
121 | passed to codemirror config. This only needs to be specified if it does not | |
|
122 | match the value in *language*. | |
|
123 | - **pygments_lexer** (optional): The name of a `Pygments lexer <http://pygments.org/docs/lexers/>`_ | |
|
124 | to use for code in this language, as a string. This only needs to be specified | |
|
125 | if it does not match the value in *language*. | |
|
126 | 115 | - **env** (optional): A dictionary of environment variables to set for the kernel. |
|
127 | 116 | These will be added to the current environment variables before the kernel is |
|
128 | 117 | started. |
|
129 | - **help_links** (optional): A list of dictionaries, each with keys 'text' and | |
|
130 | 'url'. These will be displayed in the help menu in the notebook UI. | |
|
131 | 118 | |
|
132 | 119 | For example, the kernel.json file for IPython looks like this:: |
|
133 | 120 | |
|
134 | 121 | { |
|
135 | 122 | "argv": ["python3", "-c", "from IPython.kernel.zmq.kernelapp import main; main()", |
|
136 |
"-f", "{connection_file}"], |
|
|
137 | "codemirror_mode": { | |
|
138 | "version": 3, | |
|
139 | "name": "ipython" | |
|
140 | }, | |
|
123 | "-f", "{connection_file}"], | |
|
141 | 124 | "display_name": "IPython (Python 3)", |
|
142 | "language": "python" | |
|
143 | 125 | } |
|
144 | 126 | |
|
145 | 127 | To see the available kernel specs, run:: |
@@ -685,11 +685,33 b' Message type: ``kernel_info_reply``::' | |||
|
685 | 685 | # included in IPython. |
|
686 | 686 | 'language_version': 'X.Y.Z', |
|
687 | 687 | |
|
688 | # Information about the language of code for the kernel | |
|
689 | 'language_info': { | |
|
690 | 'mimetype': str, | |
|
691 | ||
|
692 | # Pygments lexer, for highlighting | |
|
693 | # Only needed if it differs from the top level 'language' field. | |
|
694 | 'pygments_lexer': str, | |
|
695 | ||
|
696 | # Codemirror mode, for for highlighting in the notebook. | |
|
697 | # Only needed if it differs from the top level 'language' field. | |
|
698 | 'codemirror_mode': str or dict, | |
|
699 | }, | |
|
700 | ||
|
688 | 701 | # A banner of information about the kernel, |
|
689 | 702 | # which may be desplayed in console environments. |
|
690 | 703 | 'banner' : str, |
|
704 | ||
|
705 | # Optional: A list of dictionaries, each with keys 'text' and 'url'. | |
|
706 | # These will be displayed in the help menu in the notebook UI. | |
|
707 | 'help_links': [ | |
|
708 | {'text': str, 'url': str} | |
|
709 | ], | |
|
691 | 710 | } |
|
692 | 711 | |
|
712 | Refer to the lists of available `Pygments lexers <http://pygments.org/docs/lexers/>`_ | |
|
713 | and `codemirror modes <http://codemirror.net/mode/index.html>`_ for those fields. | |
|
714 | ||
|
693 | 715 | .. versionchanged:: 5.0 |
|
694 | 716 | |
|
695 | 717 | Versions changed from lists of integers to strings. |
@@ -700,7 +722,8 b' Message type: ``kernel_info_reply``::' | |||
|
700 | 722 | |
|
701 | 723 | .. versionchanged:: 5.0 |
|
702 | 724 | |
|
703 |
``implementation``, ``implementation_version``, |
|
|
725 | ``language_info``, ``implementation``, ``implementation_version``, ``banner`` | |
|
726 | and ``help_links`` keys are added. | |
|
704 | 727 | |
|
705 | 728 | .. _msging_shutdown: |
|
706 | 729 |
@@ -34,6 +34,16 b' following methods and attributes:' | |||
|
34 | 34 | interprets (e.g. Python). The 'banner' is displayed to the user in console |
|
35 | 35 | UIs before the first prompt. All of these values are strings. |
|
36 | 36 | |
|
37 | .. attribute:: language_info | |
|
38 | ||
|
39 | Language information for :ref:`msging_kernel_info` replies, in a dictionary. | |
|
40 | This should contain the key ``mimetype`` with the mimetype of code in the | |
|
41 | target language (e.g. ``'text/x-python'``). It may also contain keys | |
|
42 | ``codemirror_mode`` and ``pygments_lexer`` if they need to differ from | |
|
43 | :attr:`language`. | |
|
44 | ||
|
45 | Other keys may be added to this later. | |
|
46 | ||
|
37 | 47 | .. method:: do_execute(code, silent, store_history=True, user_expressions=None, allow_stdin=False) |
|
38 | 48 | |
|
39 | 49 | Execute user code. |
@@ -71,6 +81,7 b' Example' | |||
|
71 | 81 | implementation_version = '1.0' |
|
72 | 82 | language = 'no-op' |
|
73 | 83 | language_version = '0.1' |
|
84 | language_info = {'mimetype': 'text/plain'} | |
|
74 | 85 | banner = "Echo kernel - as useful as a parrot" |
|
75 | 86 | |
|
76 | 87 | def do_execute(self, code, silent, store_history=True, user_expressions=None, |
@@ -94,7 +105,6 b" Here's the Kernel spec ``kernel.json`` file for this::" | |||
|
94 | 105 | |
|
95 | 106 | {"argv":["python","-m","echokernel", "-f", "{connection_file}"], |
|
96 | 107 | "display_name":"Echo", |
|
97 | "language":"no-op" | |
|
98 | 108 | } |
|
99 | 109 | |
|
100 | 110 |
General Comments 0
You need to be logged in to leave comments.
Login now