##// END OF EJS Templates
disable download-as-pt...
MinRK -
Show More
@@ -1,245 +1,245 b''
1 1 """Tornado handlers for the notebooks web service.
2 2
3 3 Authors:
4 4
5 5 * Brian Granger
6 6 """
7 7
8 8 #-----------------------------------------------------------------------------
9 9 # Copyright (C) 2008-2011 The IPython Development Team
10 10 #
11 11 # Distributed under the terms of the BSD License. The full license is in
12 12 # the file COPYING, distributed as part of this software.
13 13 #-----------------------------------------------------------------------------
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Imports
17 17 #-----------------------------------------------------------------------------
18 18
19 19 import json
20 20
21 21 from tornado import web
22 22
23 23 from IPython.html.utils import url_path_join
24 24 from IPython.utils.jsonutil import date_default
25 25
26 26 from IPython.html.base.handlers import IPythonHandler, json_errors
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Notebook web service handlers
30 30 #-----------------------------------------------------------------------------
31 31
32 32
33 33 class NotebookHandler(IPythonHandler):
34 34
35 35 SUPPORTED_METHODS = (u'GET', u'PUT', u'PATCH', u'POST', u'DELETE')
36 36
37 37 def notebook_location(self, name, path=''):
38 38 """Return the full URL location of a notebook based.
39 39
40 40 Parameters
41 41 ----------
42 42 name : unicode
43 43 The base name of the notebook, such as "foo.ipynb".
44 44 path : unicode
45 45 The URL path of the notebook.
46 46 """
47 47 return url_path_join(self.base_project_url, 'api', 'notebooks', path, name)
48 48
49 49 @web.authenticated
50 50 @json_errors
51 51 def get(self, path='', name=None):
52 52 """
53 53 GET with path and no notebook lists notebooks in a directory
54 54 GET with path and notebook name
55 55
56 56 GET get checks if a notebook is not named, an returns a list of notebooks
57 57 in the notebook path given. If a name is given, return
58 58 the notebook representation"""
59 59 nbm = self.notebook_manager
60 60 # Check to see if a notebook name was given
61 61 if name is None:
62 62 # List notebooks in 'path'
63 63 notebooks = nbm.list_notebooks(path)
64 64 self.finish(json.dumps(notebooks, default=date_default))
65 65 return
66 66 # get and return notebook representation
67 67 model = nbm.get_notebook_model(name, path)
68 68 self.set_header(u'Last-Modified', model[u'last_modified'])
69 69
70 70 if self.get_argument('download', default='False') == 'True':
71 71 format = self.get_argument('format', default='json')
72 if format == u'json':
72 if format != u'json':
73 73 self.set_header('Content-Type', 'application/json')
74 raise web.HTTPError(400, "Unrecognized format: %s" % ext)
74 raise web.HTTPError(400, "Unrecognized format: %s" % format)
75 75
76 76 self.set_header('Content-Disposition',
77 77 'attachment; filename="%s"' % name
78 78 )
79 79 self.finish(json.dumps(model['content'], default=date_default))
80 80 else:
81 81 self.finish(json.dumps(model, default=date_default))
82 82
83 83 @web.authenticated
84 84 @json_errors
85 85 def patch(self, path='', name=None):
86 86 """PATCH renames a notebook without re-uploading content."""
87 87 nbm = self.notebook_manager
88 88 if name is None:
89 89 raise web.HTTPError(400, u'Notebook name missing')
90 90 model = self.get_json_body()
91 91 if model is None:
92 92 raise web.HTTPError(400, u'JSON body missing')
93 93 model = nbm.update_notebook_model(model, name, path)
94 94 location = self.notebook_location(model[u'name'], model[u'path'])
95 95 self.set_header(u'Location', location)
96 96 self.set_header(u'Last-Modified', model[u'last_modified'])
97 97 self.finish(json.dumps(model, default=date_default))
98 98
99 99 @web.authenticated
100 100 @json_errors
101 101 def post(self, path='', name=None):
102 102 """Create a new notebook in the specified path.
103 103
104 104 POST creates new notebooks.
105 105
106 106 POST /api/notebooks/path : new untitled notebook in path
107 107 POST /api/notebooks/path/notebook.ipynb : new notebook with name in path
108 108 If content specified upload notebook, otherwise start empty.
109 109 """
110 110 nbm = self.notebook_manager
111 111 model = self.get_json_body()
112 112 if name is None:
113 113 # creating new notebook, model doesn't make sense
114 114 if model is not None:
115 115 raise web.HTTPError(400, "Model not valid when creating untitled notebooks.")
116 116 model = nbm.create_notebook_model(path=path)
117 117 else:
118 118 if model is None:
119 119 self.log.info("Creating new Notebook at %s/%s", path, name)
120 120 model = {}
121 121 else:
122 122 self.log.info("Uploading Notebook to %s/%s", path, name)
123 123 # set the model name from the URL
124 124 model['name'] = name
125 125 model = nbm.create_notebook_model(model, path)
126 126
127 127 location = self.notebook_location(model[u'name'], model[u'path'])
128 128 self.set_header(u'Location', location)
129 129 self.set_header(u'Last-Modified', model[u'last_modified'])
130 130 self.set_status(201)
131 131 self.finish(json.dumps(model, default=date_default))
132 132
133 133 @web.authenticated
134 134 @json_errors
135 135 def put(self, path='', name=None):
136 136 """saves the notebook in the location given by 'notebook_path'."""
137 137 nbm = self.notebook_manager
138 138 model = self.get_json_body()
139 139 if model is None:
140 140 raise web.HTTPError(400, u'JSON body missing')
141 141 nbm.save_notebook_model(model, name, path)
142 142 self.finish(json.dumps(model, default=date_default))
143 143
144 144 @web.authenticated
145 145 @json_errors
146 146 def delete(self, path='', name=None):
147 147 """delete the notebook in the given notebook path"""
148 148 nbm = self.notebook_manager
149 149 nbm.delete_notebook_model(name, path)
150 150 self.set_status(204)
151 151 self.finish()
152 152
153 153 class NotebookCopyHandler(IPythonHandler):
154 154
155 155 SUPPORTED_METHODS = ('POST')
156 156
157 157 @web.authenticated
158 158 @json_errors
159 159 def post(self, path='', name=None):
160 160 """Copy an existing notebook."""
161 161 nbm = self.notebook_manager
162 162 model = self.get_json_body()
163 163 if name is None:
164 164 raise web.HTTPError(400, "Notebook name required")
165 165 self.log.info("Copying Notebook %s/%s", path, name)
166 166 model = nbm.copy_notebook(name, path)
167 167 location = url_path_join(
168 168 self.base_project_url, 'api', 'notebooks',
169 169 model['path'], model['name'],
170 170 )
171 171 self.set_header(u'Location', location)
172 172 self.set_header(u'Last-Modified', model[u'last_modified'])
173 173 self.set_status(201)
174 174 self.finish(json.dumps(model, default=date_default))
175 175
176 176
177 177 class NotebookCheckpointsHandler(IPythonHandler):
178 178
179 179 SUPPORTED_METHODS = ('GET', 'POST')
180 180
181 181 @web.authenticated
182 182 @json_errors
183 183 def get(self, path='', name=None):
184 184 """get lists checkpoints for a notebook"""
185 185 nbm = self.notebook_manager
186 186 checkpoints = nbm.list_checkpoints(name, path)
187 187 data = json.dumps(checkpoints, default=date_default)
188 188 self.finish(data)
189 189
190 190 @web.authenticated
191 191 @json_errors
192 192 def post(self, path='', name=None):
193 193 """post creates a new checkpoint"""
194 194 nbm = self.notebook_manager
195 195 checkpoint = nbm.create_checkpoint(name, path)
196 196 data = json.dumps(checkpoint, default=date_default)
197 197 location = url_path_join(self.base_project_url, u'/api/notebooks',
198 198 path, name, 'checkpoints', checkpoint[u'checkpoint_id'])
199 199 self.set_header(u'Location', location)
200 200 self.finish(data)
201 201
202 202
203 203 class ModifyNotebookCheckpointsHandler(IPythonHandler):
204 204
205 205 SUPPORTED_METHODS = ('POST', 'DELETE')
206 206
207 207 @web.authenticated
208 208 @json_errors
209 209 def post(self, path, name, checkpoint_id):
210 210 """post restores a notebook from a checkpoint"""
211 211 nbm = self.notebook_manager
212 212 nbm.restore_checkpoint(checkpoint_id, name, path)
213 213 self.set_status(204)
214 214 self.finish()
215 215
216 216 @web.authenticated
217 217 @json_errors
218 218 def delete(self, path, name, checkpoint_id):
219 219 """delete clears a checkpoint for a given notebook"""
220 220 nbm = self.notebook_manager
221 221 nbm.delete_checkpoint(checkpoint_id, name, path)
222 222 self.set_status(204)
223 223 self.finish()
224 224
225 225 #-----------------------------------------------------------------------------
226 226 # URL to handler mappings
227 227 #-----------------------------------------------------------------------------
228 228
229 229
230 230 _path_regex = r"(?P<path>(?:/.*)*)"
231 231 _checkpoint_id_regex = r"(?P<checkpoint_id>[\w-]+)"
232 232 _notebook_name_regex = r"(?P<name>[^/]+\.ipynb)"
233 233 _notebook_path_regex = "%s/%s" % (_path_regex, _notebook_name_regex)
234 234
235 235 default_handlers = [
236 236 (r"/api/notebooks%s/copy" % _notebook_path_regex, NotebookCopyHandler),
237 237 (r"/api/notebooks%s/checkpoints" % _notebook_path_regex, NotebookCheckpointsHandler),
238 238 (r"/api/notebooks%s/checkpoints/%s" % (_notebook_path_regex, _checkpoint_id_regex),
239 239 ModifyNotebookCheckpointsHandler),
240 240 (r"/api/notebooks%s" % _notebook_path_regex, NotebookHandler),
241 241 (r"/api/notebooks%s" % _path_regex, NotebookHandler),
242 242 ]
243 243
244 244
245 245
@@ -1,298 +1,305 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2008-2011 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // MenuBar
10 10 //============================================================================
11 11
12 12 /**
13 13 * @module IPython
14 14 * @namespace IPython
15 15 * @submodule MenuBar
16 16 */
17 17
18 18
19 19 var IPython = (function (IPython) {
20 20 "use strict";
21 21
22 22 var utils = IPython.utils;
23 23
24 24 /**
25 25 * A MenuBar Class to generate the menubar of IPython notebook
26 26 * @Class MenuBar
27 27 *
28 28 * @constructor
29 29 *
30 30 *
31 31 * @param selector {string} selector for the menubar element in DOM
32 32 * @param {object} [options]
33 33 * @param [options.baseProjectUrl] {String} String to use for the
34 34 * Base Project url, default would be to inspect
35 35 * $('body').data('baseProjectUrl');
36 36 * does not support change for now is set through this option
37 37 */
38 38 var MenuBar = function (selector, options) {
39 39 options = options || {};
40 40 if (options.baseProjectUrl !== undefined) {
41 41 this._baseProjectUrl = options.baseProjectUrl;
42 42 }
43 43 this.selector = selector;
44 44 if (this.selector !== undefined) {
45 45 this.element = $(selector);
46 46 this.style();
47 47 this.bind_events();
48 48 }
49 49 };
50 50
51 51 MenuBar.prototype.baseProjectUrl = function(){
52 52 return this._baseProjectUrl || $('body').data('baseProjectUrl');
53 53 };
54 54
55 55 MenuBar.prototype.notebookPath = function() {
56 56 var path = $('body').data('notebookPath');
57 57 path = decodeURIComponent(path);
58 58 return path;
59 59 };
60 60
61 61 MenuBar.prototype.style = function () {
62 62 this.element.addClass('border-box-sizing');
63 63 this.element.find("li").click(function (event, ui) {
64 64 // The selected cell loses focus when the menu is entered, so we
65 65 // re-select it upon selection.
66 66 var i = IPython.notebook.get_selected_index();
67 67 IPython.notebook.select(i);
68 68 }
69 69 );
70 70 };
71 71
72 72
73 73 MenuBar.prototype.bind_events = function () {
74 74 // File
75 75 var that = this;
76 76 this.element.find('#new_notebook').click(function () {
77 77 IPython.notebook.new_notebook();
78 78 });
79 79 this.element.find('#open_notebook').click(function () {
80 80 window.open(utils.url_path_join(
81 81 that.baseProjectUrl(),
82 82 'tree',
83 83 that.notebookPath()
84 84 ));
85 85 });
86 86 this.element.find('#copy_notebook').click(function () {
87 87 IPython.notebook.copy_notebook();
88 88 return false;
89 89 });
90 90 this.element.find('#download_ipynb').click(function () {
91 91 var notebook_name = IPython.notebook.get_notebook_name();
92 92 if (IPython.notebook.dirty) {
93 93 IPython.notebook.save_notebook({async : false});
94 94 }
95 95
96 96 var url = utils.url_path_join(
97 97 that.baseProjectUrl(),
98 98 'api/notebooks',
99 99 that.notebookPath(),
100 100 notebook_name + '.ipynb?format=json&download=True'
101 101 );
102 102 window.location.assign(url);
103 103 });
104
105 /* FIXME: download-as-py doesn't work right now
106 * We will need nbconvert hooked up to get this back
107
104 108 this.element.find('#download_py').click(function () {
105 109 var notebook_name = IPython.notebook.get_notebook_name();
106 110 if (IPython.notebook.dirty) {
107 111 IPython.notebook.save_notebook({async : false});
108 112 }
109 113 var url = utils.url_path_join(
110 114 that.baseProjectUrl(),
111 115 'api/notebooks',
112 116 that.notebookPath(),
113 117 notebook_name + '.ipynb?format=py&download=True'
114 118 );
115 119 window.location.assign(url);
116 120 });
121
122 */
123
117 124 this.element.find('#rename_notebook').click(function () {
118 125 IPython.save_widget.rename_notebook();
119 126 });
120 127 this.element.find('#save_checkpoint').click(function () {
121 128 IPython.notebook.save_checkpoint();
122 129 });
123 130 this.element.find('#restore_checkpoint').click(function () {
124 131 });
125 132 this.element.find('#kill_and_exit').click(function () {
126 133 IPython.notebook.session.delete_session();
127 134 setTimeout(function(){window.close();}, 500);
128 135 });
129 136 // Edit
130 137 this.element.find('#cut_cell').click(function () {
131 138 IPython.notebook.cut_cell();
132 139 });
133 140 this.element.find('#copy_cell').click(function () {
134 141 IPython.notebook.copy_cell();
135 142 });
136 143 this.element.find('#delete_cell').click(function () {
137 144 IPython.notebook.delete_cell();
138 145 });
139 146 this.element.find('#undelete_cell').click(function () {
140 147 IPython.notebook.undelete();
141 148 });
142 149 this.element.find('#split_cell').click(function () {
143 150 IPython.notebook.split_cell();
144 151 });
145 152 this.element.find('#merge_cell_above').click(function () {
146 153 IPython.notebook.merge_cell_above();
147 154 });
148 155 this.element.find('#merge_cell_below').click(function () {
149 156 IPython.notebook.merge_cell_below();
150 157 });
151 158 this.element.find('#move_cell_up').click(function () {
152 159 IPython.notebook.move_cell_up();
153 160 });
154 161 this.element.find('#move_cell_down').click(function () {
155 162 IPython.notebook.move_cell_down();
156 163 });
157 164 this.element.find('#select_previous').click(function () {
158 165 IPython.notebook.select_prev();
159 166 });
160 167 this.element.find('#select_next').click(function () {
161 168 IPython.notebook.select_next();
162 169 });
163 170 this.element.find('#edit_nb_metadata').click(function () {
164 171 IPython.notebook.edit_metadata();
165 172 });
166 173
167 174 // View
168 175 this.element.find('#toggle_header').click(function () {
169 176 $('div#header').toggle();
170 177 IPython.layout_manager.do_resize();
171 178 });
172 179 this.element.find('#toggle_toolbar').click(function () {
173 180 $('div#maintoolbar').toggle();
174 181 IPython.layout_manager.do_resize();
175 182 });
176 183 // Insert
177 184 this.element.find('#insert_cell_above').click(function () {
178 185 IPython.notebook.insert_cell_above('code');
179 186 });
180 187 this.element.find('#insert_cell_below').click(function () {
181 188 IPython.notebook.insert_cell_below('code');
182 189 });
183 190 // Cell
184 191 this.element.find('#run_cell').click(function () {
185 192 IPython.notebook.execute_selected_cell();
186 193 });
187 194 this.element.find('#run_cell_in_place').click(function () {
188 195 IPython.notebook.execute_selected_cell({terminal:true});
189 196 });
190 197 this.element.find('#run_all_cells').click(function () {
191 198 IPython.notebook.execute_all_cells();
192 199 }).attr('title', 'Run all cells in the notebook');
193 200 this.element.find('#run_all_cells_above').click(function () {
194 201 IPython.notebook.execute_cells_above();
195 202 }).attr('title', 'Run all cells above (but not including) this cell');
196 203 this.element.find('#run_all_cells_below').click(function () {
197 204 IPython.notebook.execute_cells_below();
198 205 }).attr('title', 'Run this cell and all cells below it');
199 206 this.element.find('#to_code').click(function () {
200 207 IPython.notebook.to_code();
201 208 });
202 209 this.element.find('#to_markdown').click(function () {
203 210 IPython.notebook.to_markdown();
204 211 });
205 212 this.element.find('#to_raw').click(function () {
206 213 IPython.notebook.to_raw();
207 214 });
208 215 this.element.find('#to_heading1').click(function () {
209 216 IPython.notebook.to_heading(undefined, 1);
210 217 });
211 218 this.element.find('#to_heading2').click(function () {
212 219 IPython.notebook.to_heading(undefined, 2);
213 220 });
214 221 this.element.find('#to_heading3').click(function () {
215 222 IPython.notebook.to_heading(undefined, 3);
216 223 });
217 224 this.element.find('#to_heading4').click(function () {
218 225 IPython.notebook.to_heading(undefined, 4);
219 226 });
220 227 this.element.find('#to_heading5').click(function () {
221 228 IPython.notebook.to_heading(undefined, 5);
222 229 });
223 230 this.element.find('#to_heading6').click(function () {
224 231 IPython.notebook.to_heading(undefined, 6);
225 232 });
226 233 this.element.find('#toggle_output').click(function () {
227 234 IPython.notebook.toggle_output();
228 235 });
229 236 this.element.find('#collapse_all_output').click(function () {
230 237 IPython.notebook.collapse_all_output();
231 238 });
232 239 this.element.find('#scroll_all_output').click(function () {
233 240 IPython.notebook.scroll_all_output();
234 241 });
235 242 this.element.find('#expand_all_output').click(function () {
236 243 IPython.notebook.expand_all_output();
237 244 });
238 245 this.element.find('#clear_all_output').click(function () {
239 246 IPython.notebook.clear_all_output();
240 247 });
241 248 // Kernel
242 249 this.element.find('#int_kernel').click(function () {
243 250 IPython.notebook.session.interrupt_kernel();
244 251 });
245 252 this.element.find('#restart_kernel').click(function () {
246 253 IPython.notebook.restart_kernel();
247 254 });
248 255 // Help
249 256 this.element.find('#keyboard_shortcuts').click(function () {
250 257 IPython.quick_help.show_keyboard_shortcuts();
251 258 });
252 259
253 260 this.update_restore_checkpoint(null);
254 261
255 262 $([IPython.events]).on('checkpoints_listed.Notebook', function (event, data) {
256 263 that.update_restore_checkpoint(IPython.notebook.checkpoints);
257 264 });
258 265
259 266 $([IPython.events]).on('checkpoint_created.Notebook', function (event, data) {
260 267 that.update_restore_checkpoint(IPython.notebook.checkpoints);
261 268 });
262 269 };
263 270
264 271 MenuBar.prototype.update_restore_checkpoint = function(checkpoints) {
265 272 var ul = this.element.find("#restore_checkpoint").find("ul");
266 273 ul.empty();
267 274 if (!checkpoints || checkpoints.length === 0) {
268 275 ul.append(
269 276 $("<li/>")
270 277 .addClass("disabled")
271 278 .append(
272 279 $("<a/>")
273 280 .text("No checkpoints")
274 281 )
275 282 );
276 283 return;
277 284 }
278 285
279 286 checkpoints.map(function (checkpoint) {
280 287 var d = new Date(checkpoint.last_modified);
281 288 ul.append(
282 289 $("<li/>").append(
283 290 $("<a/>")
284 291 .attr("href", "#")
285 292 .text(d.format("mmm dd HH:MM:ss"))
286 293 .click(function () {
287 294 IPython.notebook.restore_checkpoint_dialog(checkpoint);
288 295 })
289 296 )
290 297 );
291 298 });
292 299 };
293 300
294 301 IPython.MenuBar = MenuBar;
295 302
296 303 return IPython;
297 304
298 305 }(IPython));
@@ -1,263 +1,263 b''
1 1 {% extends "page.html" %}
2 2
3 3 {% block stylesheet %}
4 4
5 5 {% if mathjax_url %}
6 6 <script type="text/javascript" src="{{mathjax_url}}?config=TeX-AMS_HTML-full&delayStartupUntil=configured" charset="utf-8"></script>
7 7 {% endif %}
8 8 <script type="text/javascript">
9 9 // MathJax disabled, set as null to distingish from *missing* MathJax,
10 10 // where it will be undefined, and should prompt a dialog later.
11 11 window.mathjax_url = "{{mathjax_url}}";
12 12 </script>
13 13
14 14 <link rel="stylesheet" href="{{ static_url("components/codemirror/lib/codemirror.css") }}">
15 15
16 16 {{super()}}
17 17
18 18 <link rel="stylesheet" href="{{ static_url("notebook/css/override.css") }}" type="text/css" />
19 19
20 20 {% endblock %}
21 21
22 22 {% block params %}
23 23
24 24 data-project="{{project}}"
25 25 data-base-project-url="{{base_project_url}}"
26 26 data-base-kernel-url="{{base_kernel_url}}"
27 27 data-notebook-name="{{notebook_name}}"
28 28 data-notebook-path="{{notebook_path}}"
29 29 class="notebook_app"
30 30
31 31 {% endblock %}
32 32
33 33
34 34 {% block header %}
35 35
36 36 <span id="save_widget" class="nav pull-left">
37 37 <span id="notebook_name"></span>
38 38 <span id="checkpoint_status"></span>
39 39 <span id="autosave_status"></span>
40 40 </span>
41 41
42 42 {% endblock %}
43 43
44 44
45 45 {% block site %}
46 46
47 47 <div id="menubar-container" class="container">
48 48 <div id="menubar">
49 49 <div class="navbar">
50 50 <div class="navbar-inner">
51 51 <div class="container">
52 52 <ul id="menus" class="nav">
53 53 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">File</a>
54 54 <ul class="dropdown-menu">
55 55 <li id="new_notebook"><a href="#">New</a></li>
56 56 <li id="open_notebook"><a href="#">Open...</a></li>
57 57 <!-- <hr/> -->
58 58 <li class="divider"></li>
59 59 <li id="copy_notebook"><a href="#">Make a Copy...</a></li>
60 60 <li id="rename_notebook"><a href="#">Rename...</a></li>
61 61 <li id="save_checkpoint"><a href="#">Save and Checkpoint</a></li>
62 62 <!-- <hr/> -->
63 63 <li class="divider"></li>
64 64 <li id="restore_checkpoint" class="dropdown-submenu"><a href="#">Revert to Checkpoint</a>
65 65 <ul class="dropdown-menu">
66 66 <li><a href="#"></a></li>
67 67 <li><a href="#"></a></li>
68 68 <li><a href="#"></a></li>
69 69 <li><a href="#"></a></li>
70 70 <li><a href="#"></a></li>
71 71 </ul>
72 72 </li>
73 73 <li class="divider"></li>
74 74 <li class="dropdown-submenu"><a href="#">Download as</a>
75 75 <ul class="dropdown-menu">
76 <li id="download_ipynb"><a href="#">IPython (.ipynb)</a></li>
77 <li id="download_py"><a href="#">Python (.py)</a></li>
76 <li id="download_ipynb"><a href="#">IPython Notebook (.ipynb)</a></li>
77 <!-- <li id="download_py"><a href="#">Python (.py)</a></li> -->
78 78 </ul>
79 79 </li>
80 80 <li class="divider"></li>
81 81
82 82 <li id="kill_and_exit"><a href="#" >Close and halt</a></li>
83 83 </ul>
84 84 </li>
85 85 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Edit</a>
86 86 <ul class="dropdown-menu">
87 87 <li id="cut_cell"><a href="#">Cut Cell</a></li>
88 88 <li id="copy_cell"><a href="#">Copy Cell</a></li>
89 89 <li id="paste_cell_above" class="disabled"><a href="#">Paste Cell Above</a></li>
90 90 <li id="paste_cell_below" class="disabled"><a href="#">Paste Cell Below</a></li>
91 91 <li id="paste_cell_replace" class="disabled"><a href="#">Paste Cell &amp; Replace</a></li>
92 92 <li id="delete_cell"><a href="#">Delete Cell</a></li>
93 93 <li id="undelete_cell" class="disabled"><a href="#">Undo Delete Cell</a></li>
94 94 <li class="divider"></li>
95 95 <li id="split_cell"><a href="#">Split Cell</a></li>
96 96 <li id="merge_cell_above"><a href="#">Merge Cell Above</a></li>
97 97 <li id="merge_cell_below"><a href="#">Merge Cell Below</a></li>
98 98 <li class="divider"></li>
99 99 <li id="move_cell_up"><a href="#">Move Cell Up</a></li>
100 100 <li id="move_cell_down"><a href="#">Move Cell Down</a></li>
101 101 <li class="divider"></li>
102 102 <li id="select_previous"><a href="#">Select Previous Cell</a></li>
103 103 <li id="select_next"><a href="#">Select Next Cell</a></li>
104 104 <li class="divider"></li>
105 105 <li id="edit_nb_metadata"><a href="#">Edit Notebook Metadata</a></li>
106 106 </ul>
107 107 </li>
108 108 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">View</a>
109 109 <ul class="dropdown-menu">
110 110 <li id="toggle_header"><a href="#">Toggle Header</a></li>
111 111 <li id="toggle_toolbar"><a href="#">Toggle Toolbar</a></li>
112 112 </ul>
113 113 </li>
114 114 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Insert</a>
115 115 <ul class="dropdown-menu">
116 116 <li id="insert_cell_above"><a href="#">Insert Cell Above</a></li>
117 117 <li id="insert_cell_below"><a href="#">Insert Cell Below</a></li>
118 118 </ul>
119 119 </li>
120 120 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Cell</a>
121 121 <ul class="dropdown-menu">
122 122 <li id="run_cell"><a href="#">Run</a></li>
123 123 <li id="run_cell_in_place"><a href="#">Run in Place</a></li>
124 124 <li id="run_all_cells"><a href="#">Run All</a></li>
125 125 <li id="run_all_cells_above"><a href="#">Run All Above</a></li>
126 126 <li id="run_all_cells_below"><a href="#">Run All Below</a></li>
127 127 <li class="divider"></li>
128 128 <li id="change_cell_type" class="dropdown-submenu"><a href="#">Cell Type</a>
129 129 <ul class="dropdown-menu">
130 130 <li id="to_code"><a href="#">Code</a></li>
131 131 <li id="to_markdown"><a href="#">Markdown </a></li>
132 132 <li id="to_raw"><a href="#">Raw Text</a></li>
133 133 <li id="to_heading1"><a href="#">Heading 1</a></li>
134 134 <li id="to_heading2"><a href="#">Heading 2</a></li>
135 135 <li id="to_heading3"><a href="#">Heading 3</a></li>
136 136 <li id="to_heading4"><a href="#">Heading 4</a></li>
137 137 <li id="to_heading5"><a href="#">Heading 5</a></li>
138 138 <li id="to_heading6"><a href="#">Heading 6</a></li>
139 139 </ul>
140 140 </li>
141 141 <li class="divider"></li>
142 142 <li id="toggle_output"><a href="#">Toggle Current Output</a></li>
143 143 <li id="all_outputs" class="dropdown-submenu"><a href="#">All Output</a>
144 144 <ul class="dropdown-menu">
145 145 <li id="expand_all_output"><a href="#">Expand</a></li>
146 146 <li id="scroll_all_output"><a href="#">Scroll Long</a></li>
147 147 <li id="collapse_all_output"><a href="#">Collapse</a></li>
148 148 <li id="clear_all_output"><a href="#">Clear</a></li>
149 149 </ul>
150 150 </li>
151 151 </ul>
152 152 </li>
153 153 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Kernel</a>
154 154 <ul class="dropdown-menu">
155 155 <li id="int_kernel"><a href="#">Interrupt</a></li>
156 156 <li id="restart_kernel"><a href="#">Restart</a></li>
157 157 </ul>
158 158 </li>
159 159 <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Help</a>
160 160 <ul class="dropdown-menu">
161 161 <li><a href="http://ipython.org/documentation.html" target="_blank">IPython Help</a></li>
162 162 <li><a href="http://ipython.org/ipython-doc/stable/interactive/notebook.html" target="_blank">Notebook Help</a></li>
163 163 <li id="keyboard_shortcuts"><a href="#">Keyboard Shortcuts</a></li>
164 164 <li class="divider"></li>
165 165 <li><a href="http://docs.python.org" target="_blank">Python</a></li>
166 166 <li><a href="http://docs.scipy.org/doc/numpy/reference/" target="_blank">NumPy</a></li>
167 167 <li><a href="http://docs.scipy.org/doc/scipy/reference/" target="_blank">SciPy</a></li>
168 168 <li><a href="http://matplotlib.org/" target="_blank">Matplotlib</a></li>
169 169 <li><a href="http://docs.sympy.org/dev/index.html" target="_blank">SymPy</a></li>
170 170 <li><a href="http://pandas.pydata.org/pandas-docs/stable/" target="_blank">pandas</a></li>
171 171 </ul>
172 172 </li>
173 173 </ul>
174 174 <div id="notification_area"></div>
175 175 </div>
176 176 </div>
177 177 </div>
178 178 </div>
179 179 <div id="maintoolbar" class="navbar">
180 180 <div class="toolbar-inner navbar-inner navbar-nobg">
181 181 <div id="maintoolbar-container" class="container"></div>
182 182 </div>
183 183 </div>
184 184 </div>
185 185
186 186 <div id="ipython-main-app">
187 187
188 188 <div id="notebook_panel">
189 189 <div id="notebook"></div>
190 190 <div id="pager_splitter"></div>
191 191 <div id="pager">
192 192 <div id='pager_button_area'>
193 193 </div>
194 194 <div id="pager-container" class="container"></div>
195 195 </div>
196 196 </div>
197 197
198 198 </div>
199 199 <div id='tooltip' class='ipython_tooltip' style='display:none'></div>
200 200
201 201
202 202 {% endblock %}
203 203
204 204
205 205 {% block script %}
206 206
207 207 {{super()}}
208 208
209 209 <script src="{{ static_url("components/codemirror/lib/codemirror.js") }}" charset="utf-8"></script>
210 210 <script type="text/javascript">
211 211 CodeMirror.modeURL = "{{ static_url("components/codemirror/mode/%N/%N.js") }}";
212 212 </script>
213 213 <script src="{{ static_url("components/codemirror/addon/mode/loadmode.js") }}" charset="utf-8"></script>
214 214 <script src="{{ static_url("components/codemirror/addon/mode/multiplex.js") }}" charset="utf-8"></script>
215 215 <script src="{{ static_url("components/codemirror/addon/mode/overlay.js") }}" charset="utf-8"></script>
216 216 <script src="{{ static_url("components/codemirror/addon/edit/matchbrackets.js") }}" charset="utf-8"></script>
217 217 <script src="{{ static_url("components/codemirror/addon/comment/comment.js") }}" charset="utf-8"></script>
218 218 <script src="{{ static_url("components/codemirror/mode/htmlmixed/htmlmixed.js") }}" charset="utf-8"></script>
219 219 <script src="{{ static_url("components/codemirror/mode/xml/xml.js") }}" charset="utf-8"></script>
220 220 <script src="{{ static_url("components/codemirror/mode/javascript/javascript.js") }}" charset="utf-8"></script>
221 221 <script src="{{ static_url("components/codemirror/mode/css/css.js") }}" charset="utf-8"></script>
222 222 <script src="{{ static_url("components/codemirror/mode/rst/rst.js") }}" charset="utf-8"></script>
223 223 <script src="{{ static_url("components/codemirror/mode/markdown/markdown.js") }}" charset="utf-8"></script>
224 224 <script src="{{ static_url("components/codemirror/mode/gfm/gfm.js") }}" charset="utf-8"></script>
225 225 <script src="{{ static_url("components/codemirror/mode/python/python.js") }}" charset="utf-8"></script>
226 226 <script src="{{ static_url("notebook/js/codemirror-ipython.js") }}" charset="utf-8"></script>
227 227
228 228 <script src="{{ static_url("components/highlight.js/build/highlight.pack.js") }}" charset="utf-8"></script>
229 229
230 230 <script src="{{ static_url("dateformat/date.format.js") }}" charset="utf-8"></script>
231 231
232 232 <script src="{{ static_url("base/js/events.js") }}" type="text/javascript" charset="utf-8"></script>
233 233 <script src="{{ static_url("base/js/utils.js") }}" type="text/javascript" charset="utf-8"></script>
234 234 <script src="{{ static_url("base/js/dialog.js") }}" type="text/javascript" charset="utf-8"></script>
235 235 <script src="{{ static_url("notebook/js/layoutmanager.js") }}" type="text/javascript" charset="utf-8"></script>
236 236 <script src="{{ static_url("notebook/js/mathjaxutils.js") }}" type="text/javascript" charset="utf-8"></script>
237 237 <script src="{{ static_url("notebook/js/outputarea.js") }}" type="text/javascript" charset="utf-8"></script>
238 238 <script src="{{ static_url("notebook/js/cell.js") }}" type="text/javascript" charset="utf-8"></script>
239 239 <script src="{{ static_url("notebook/js/celltoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
240 240 <script src="{{ static_url("notebook/js/codecell.js") }}" type="text/javascript" charset="utf-8"></script>
241 241 <script src="{{ static_url("notebook/js/completer.js") }}" type="text/javascript" charset="utf-8"></script>
242 242 <script src="{{ static_url("notebook/js/textcell.js") }}" type="text/javascript" charset="utf-8"></script>
243 243 <script src="{{ static_url("services/kernels/js/kernel.js") }}" type="text/javascript" charset="utf-8"></script>
244 244 <script src="{{ static_url("services/sessions/js/session.js") }}" type="text/javascript" charset="utf-8"></script>
245 245 <script src="{{ static_url("notebook/js/savewidget.js") }}" type="text/javascript" charset="utf-8"></script>
246 246 <script src="{{ static_url("notebook/js/quickhelp.js") }}" type="text/javascript" charset="utf-8"></script>
247 247 <script src="{{ static_url("notebook/js/pager.js") }}" type="text/javascript" charset="utf-8"></script>
248 248 <script src="{{ static_url("notebook/js/menubar.js") }}" type="text/javascript" charset="utf-8"></script>
249 249 <script src="{{ static_url("notebook/js/toolbar.js") }}" type="text/javascript" charset="utf-8"></script>
250 250 <script src="{{ static_url("notebook/js/maintoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
251 251 <script src="{{ static_url("notebook/js/notebook.js") }}" type="text/javascript" charset="utf-8"></script>
252 252 <script src="{{ static_url("notebook/js/notificationwidget.js") }}" type="text/javascript" charset="utf-8"></script>
253 253 <script src="{{ static_url("notebook/js/notificationarea.js") }}" type="text/javascript" charset="utf-8"></script>
254 254 <script src="{{ static_url("notebook/js/tooltip.js") }}" type="text/javascript" charset="utf-8"></script>
255 255 <script src="{{ static_url("notebook/js/config.js") }}" type="text/javascript" charset="utf-8"></script>
256 256 <script src="{{ static_url("notebook/js/main.js") }}" type="text/javascript" charset="utf-8"></script>
257 257
258 258 <script src="{{ static_url("notebook/js/contexthint.js") }}" charset="utf-8"></script>
259 259
260 260 <script src="{{ static_url("notebook/js/celltoolbarpresets/default.js") }}" type="text/javascript" charset="utf-8"></script>
261 261 <script src="{{ static_url("notebook/js/celltoolbarpresets/slideshow.js") }}" type="text/javascript" charset="utf-8"></script>
262 262
263 263 {% endblock %}
General Comments 0
You need to be logged in to leave comments. Login now