##// END OF EJS Templates
Merge pull request #4333 from minrk/notebook-metadata...
Merge pull request #4333 from minrk/notebook-metadata Add Edit Notebook Metadata to Edit menu

File last commit:

r12917:bd66ff0f merge
r12917:bd66ff0f merge
Show More
notebook.js
2085 lines | 70.4 KiB | application/javascript | JavascriptLexer
Brian E. Granger
More review changes....
r4609 //----------------------------------------------------------------------------
// Copyright (C) 2008-2011 The IPython Development Team
//
// Distributed under the terms of the BSD License. The full license is in
// the file COPYING, distributed as part of this software.
//----------------------------------------------------------------------------
Brian Granger
Basic notebook saving and loading....
r4315
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 //============================================================================
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 // Notebook
//============================================================================
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var IPython = (function (IPython) {
Matthias BUSSONNIER
"use strict" in most (if not all) our javascript...
r12103 "use strict";
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
Initial payload handling....
r4356 var utils = IPython.utils;
Matthias BUSSONNIER
add ctrlKey.which to utils...
r7139 var key = IPython.utils.keycodes;
Brian E. Granger
Initial payload handling....
r4356
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* A notebook contains and manages cells.
*
* @class Notebook
* @constructor
* @param {String} selector A jQuery selector for the notebook's DOM element
* @param {Object} [options] A config object
*/
Matthias BUSSONNIER
pass baseUrl as option
r9505 var Notebook = function (selector, options) {
var options = options || {};
this._baseProjectUrl = options.baseProjectUrl;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.element = $(selector);
this.element.scroll();
this.element.data("notebook", this);
this.next_prompt_number = 1;
this.kernel = null;
Brian Granger
Added cell level cut/copy/paste.
r5879 this.clipboard = null;
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 this.undelete_backup = null;
this.undelete_index = null;
this.undelete_below = false;
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 this.paste_enabled = false;
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(false);
Brian E. Granger
Implemented metadata for notebook format.
r4637 this.metadata = {};
MinRK
expose notebook checkpoints in html/js...
r10501 this._checkpoint_after_save = false;
this.last_checkpoint = null;
MinRK
minor checkpoint cleanup...
r12050 this.checkpoints = [];
MinRK
add autosave timer...
r10505 this.autosave_interval = 0;
this.autosave_timer = null;
MinRK
set default autosave interval to two minutes
r10507 // autosave *at most* every two minutes
this.minimum_autosave_interval = 120000;
MinRK
add empty metadata field on cells/worksheets...
r7523 // single worksheet for now
this.worksheet_metadata = {};
Brian E. Granger
Adding keyboard shortcuts.
r4645 this.control_key_active = false;
Brian Granger
Major refactoring of saving, notification....
r6047 this.notebook_id = null;
this.notebook_name = null;
Brian Granger
Make : invalid in filenames in the Notebook JS code.
r7229 this.notebook_name_blacklist_re = /[\/\\:]/;
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 this.nbformat = 3 // Increment this when changing the nbformat
MinRK
add dialog when loading newer minor-version notebooks
r7546 this.nbformat_minor = 0 // Increment this when changing the nbformat
Brian E. Granger
Refactoring pager into its own class.
r4357 this.style();
Brian E. Granger
Improving the scrolling model.
r4364 this.create_elements();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.bind_events();
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Tweak the notebook's CSS style.
*
* @method style
*/
Brian E. Granger
Refactoring pager into its own class.
r4357 Notebook.prototype.style = function () {
Brian E. Granger
Left panel is now working.
r4363 $('div#notebook').addClass('border-box-sizing');
Brian E. Granger
Refactoring pager into its own class.
r4357 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get the root URL of the notebook server.
*
* @method baseProjectUrl
* @return {String} The base project URL
*/
Bussonnier Matthias
change more baseurl
r9503 Notebook.prototype.baseProjectUrl = function(){
return this._baseProjectUrl || $('body').data('baseProjectUrl');
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Create an HTML and CSS representation of the notebook.
*
* @method create_elements
*/
Brian E. Granger
Improving the scrolling model.
r4364 Notebook.prototype.create_elements = function () {
// We add this end_space div to the end of the notebook div to:
// i) provide a margin between the last cell and the end of the notebook
// ii) to prevent the div from scrolling up when the last cell is being
// edited, but is too low on the page, which browsers will do automatically.
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 var that = this;
MinRK
only put the notebook in a container...
r10909 this.container = $("<div/>").addClass("container").attr("id", "notebook-container");
MinRK
specify end-space height in less
r10938 var end_space = $('<div/>').addClass('end_space');
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 end_space.dblclick(function (e) {
var ncells = that.ncells();
Brian Granger
Refactoring of the notebooks cell management....
r5945 that.insert_cell_below('code',ncells-1);
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 });
MinRK
only put the notebook in a container...
r10909 this.element.append(this.container);
this.container.append(end_space);
Brian E. Granger
Improving the scrolling model.
r4364 $('div#notebook').addClass('border-box-sizing');
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Bind JavaScript events: key presses and custom IPython events.
*
* @method bind_events
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.bind_events = function () {
var that = this;
Matthias BUSSONNIER
Clean code, retab and minor fix...
r7170
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 $([IPython.events]).on('set_next_input.Notebook', function (event, data) {
var index = that.find_cell_index(data.cell);
var new_cell = that.insert_cell_below('code',index);
new_cell.set_text(data.text);
that.dirty = true;
});
Brian Granger
Making Notebook.set_dirty an event so CodeCell can set it....
r7228 $([IPython.events]).on('set_dirty.Notebook', function (event, data) {
that.dirty = data.value;
});
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 $([IPython.events]).on('select.Cell', function (event, data) {
var index = that.find_cell_index(data.cell);
Matthias BUSSONNIER
Clean code, retab and minor fix...
r7170 that.select(index);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 });
MinRK
move restart dialog to notebook.js
r11077
$([IPython.events]).on('status_autorestarting.Kernel', function () {
IPython.dialog.modal({
title: "Kernel Restarting",
body: "The kernel appears to have died. It will restart automatically.",
buttons: {
OK : {
class : "btn-primary"
}
}
});
});
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 $(document).keydown(function (event) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839
// Save (CTRL+S) or (AppleKey+S)
fawce
added key handler for control-s to notebook, seems to work pretty well
r5990 //metaKey = applekey on mac
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 if ((event.ctrlKey || event.metaKey) && event.keyCode==83) {
MinRK
*all* user-initiated saves create a checkpoint
r10509 that.save_checkpoint();
fawce
added key handler for control-s to notebook, seems to work pretty well
r5990 event.preventDefault();
fawce
fixed missing return for keybinding
r5991 return false;
Matthias BUSSONNIER
Uppercase constant keycode in utils.js
r7193 } else if (event.which === key.ESC) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 // Intercept escape at highest level to avoid closing
Matthias BUSSONNIER
Intercept <esc> avoid closing websocket on Firefox...
r5389 // websocket connection with firefox
Erik Tollerud
use alternate method to collapse pager from notebook.js as suggested by @Carreau
r10577 IPython.pager.collapse();
Matthias BUSSONNIER
Intercept <esc> avoid closing websocket on Firefox...
r5389 event.preventDefault();
MinRK
ignore shift keydown...
r7723 } else if (event.which === key.SHIFT) {
// ignore shift keydown
return true;
Matthias BUSSONNIER
Intercept <esc> avoid closing websocket on Firefox...
r5389 }
Matthias BUSSONNIER
Uppercase constant keycode in utils.js
r7193 if (event.which === key.UPARROW && !event.shiftKey) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cell = that.get_selected_cell();
David Wyde
Prevent errors when up/down arrows are pressed in an empty notebook....
r10126 if (cell && cell.at_top()) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 event.preventDefault();
that.select_prev();
};
Matthias BUSSONNIER
Uppercase constant keycode in utils.js
r7193 } else if (event.which === key.DOWNARROW && !event.shiftKey) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cell = that.get_selected_cell();
David Wyde
Prevent errors when up/down arrows are pressed in an empty notebook....
r10126 if (cell && cell.at_bottom()) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 event.preventDefault();
that.select_next();
};
Matthias BUSSONNIER
Uppercase constant keycode in utils.js
r7193 } else if (event.which === key.ENTER && event.shiftKey) {
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 that.execute_selected_cell();
Brian E. Granger
Prevent shift-enter from propagating and performing default.
r4380 return false;
Zoltán Vörös
Added new short key for cell execution
r7806 } else if (event.which === key.ENTER && event.altKey) {
v923z
Added some comments to the Alt-Enter code part, and also added checking whether a new code cell is really needed.
r7910 // Execute code cell, and insert new in place
Zoltán Vörös
Added new short key for cell execution
r7806 that.execute_selected_cell();
v923z
Added some comments to the Alt-Enter code part, and also added checking whether a new code cell is really needed.
r7910 // Only insert a new cell, if we ended up in an already populated cell
v923z
Replaced .toJSON().input by .get_text()
r7921 if (/\S/.test(that.get_selected_cell().get_text()) == true) {
v923z
Added some comments to the Alt-Enter code part, and also added checking whether a new code cell is really needed.
r7910 that.insert_cell_above('code');
}
Zoltán Vörös
Added new short key for cell execution
r7806 return false;
Matthias BUSSONNIER
Uppercase constant keycode in utils.js
r7193 } else if (event.which === key.ENTER && event.ctrlKey) {
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 that.execute_selected_cell({terminal:true});
Brian E. Granger
CTRL-ENTER now runs a cell in "terminal mode"...
r4390 return false;
Brian Granger
Fixing #1348 to allow Ctrl-M M to work w/o releasing Ctrl.
r6049 } else if (event.which === 77 && event.ctrlKey && that.control_key_active == false) {
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.control_key_active = true;
return false;
Brian Granger
Adding keyboard sortcuts for cut/copy/paste.
r5880 } else if (event.which === 88 && that.control_key_active) {
// Cut selected cell = x
that.cut_cell();
that.control_key_active = false;
return false;
} else if (event.which === 67 && that.control_key_active) {
// Copy selected cell = c
that.copy_cell();
that.control_key_active = false;
return false;
} else if (event.which === 86 && that.control_key_active) {
Matthias BUSSONNIER
past below by default
r8770 // Paste below selected cell = v
that.paste_cell_below();
Brian Granger
Adding keyboard sortcuts for cut/copy/paste.
r5880 that.control_key_active = false;
return false;
Brian E. Granger
Adding keyboard shortcuts.
r4645 } else if (event.which === 68 && that.control_key_active) {
// Delete selected cell = d
that.delete_cell();
that.control_key_active = false;
return false;
} else if (event.which === 65 && that.control_key_active) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 // Insert code cell above selected = a
Brian Granger
Refactoring of the notebooks cell management....
r5945 that.insert_cell_above('code');
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.control_key_active = false;
return false;
} else if (event.which === 66 && that.control_key_active) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 // Insert code cell below selected = b
Brian Granger
Refactoring of the notebooks cell management....
r5945 that.insert_cell_below('code');
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.control_key_active = false;
return false;
Brian Granger
Adding keyboard sortcuts for cut/copy/paste.
r5880 } else if (event.which === 89 && that.control_key_active) {
// To code = y
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.to_code();
that.control_key_active = false;
return false;
} else if (event.which === 77 && that.control_key_active) {
// To markdown = m
that.to_markdown();
that.control_key_active = false;
return false;
Brian Granger
Updating JS part of plaintext cell handling.
r6027 } else if (event.which === 84 && that.control_key_active) {
MinRK
rename plaintext cell -> raw cell
r6248 // To Raw = t
that.to_raw();
Brian Granger
A first go at RST cell support in the notebook.
r6017 that.control_key_active = false;
return false;
Brian Granger
Finishing first draft of RST and heading cells.
r6019 } else if (event.which === 49 && that.control_key_active) {
// To Heading 1 = 1
that.to_heading(undefined, 1);
that.control_key_active = false;
return false;
} else if (event.which === 50 && that.control_key_active) {
// To Heading 2 = 2
that.to_heading(undefined, 2);
that.control_key_active = false;
return false;
} else if (event.which === 51 && that.control_key_active) {
// To Heading 3 = 3
that.to_heading(undefined, 3);
that.control_key_active = false;
return false;
} else if (event.which === 52 && that.control_key_active) {
// To Heading 4 = 4
that.to_heading(undefined, 4);
that.control_key_active = false;
return false;
} else if (event.which === 53 && that.control_key_active) {
// To Heading 5 = 5
that.to_heading(undefined, 5);
that.control_key_active = false;
return false;
} else if (event.which === 54 && that.control_key_active) {
// To Heading 6 = 6
that.to_heading(undefined, 6);
that.control_key_active = false;
return false;
Brian Granger
Updating JS part of plaintext cell handling.
r6027 } else if (event.which === 79 && that.control_key_active) {
// Toggle output = o
MinRK
add ^M-O for toggling output scroll
r7429 if (event.shiftKey){
that.toggle_output_scroll();
} else {
that.toggle_output();
}
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.control_key_active = false;
return false;
} else if (event.which === 83 && that.control_key_active) {
// Save notebook = s
MinRK
expose notebook checkpoints in html/js...
r10501 that.save_checkpoint();
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.control_key_active = false;
return false;
} else if (event.which === 74 && that.control_key_active) {
// Move cell down = j
that.move_cell_down();
that.control_key_active = false;
return false;
} else if (event.which === 75 && that.control_key_active) {
// Move cell up = k
that.move_cell_up();
that.control_key_active = false;
return false;
Brian E. Granger
Changing prev/next keyboard shortcut to use p/n.
r4648 } else if (event.which === 80 && that.control_key_active) {
// Select previous = p
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.select_prev();
that.control_key_active = false;
return false;
Brian E. Granger
Changing prev/next keyboard shortcut to use p/n.
r4648 } else if (event.which === 78 && that.control_key_active) {
// Select next = n
Brian E. Granger
Adding keyboard shortcuts.
r4645 that.select_next();
that.control_key_active = false;
return false;
Fernando Perez
Keep kernel-related bindings together in code.
r5026 } else if (event.which === 76 && that.control_key_active) {
// Toggle line numbers = l
that.cell_toggle_line_numbers();
Brian E. Granger
Adding keyboard shortcut help dialog.
r4646 that.control_key_active = false;
return false;
Fernando Perez
Add C-m-{'i', '.'} as keybindings for kernel interrupt/restart.
r5018 } else if (event.which === 73 && that.control_key_active) {
// Interrupt kernel = i
Brian Granger
Major refactoring of saving, notification....
r6047 that.kernel.interrupt();
Fernando Perez
Add C-m-{'i', '.'} as keybindings for kernel interrupt/restart.
r5018 that.control_key_active = false;
return false;
} else if (event.which === 190 && that.control_key_active) {
// Restart kernel = . # matches qt console
Brian Granger
Major refactoring of saving, notification....
r6047 that.restart_kernel();
Fernando Perez
Add C-m-{'i', '.'} as keybindings for kernel interrupt/restart.
r5018 that.control_key_active = false;
return false;
Brian E. Granger
Adding keyboard shortcut help dialog.
r4646 } else if (event.which === 72 && that.control_key_active) {
// Show keyboard shortcuts = h
Brian Granger
Minor fixes to the menu shortcuts.
r5862 IPython.quick_help.show_keyboard_shortcuts();
Brian E. Granger
Adding keyboard shortcut help dialog.
r4646 that.control_key_active = false;
return false;
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 } else if (event.which === 90 && that.control_key_active) {
David Warde-Farley
Add comment re: quickhelp key.
r8693 // Undo last cell delete = z
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 that.undelete();
that.control_key_active = false;
return false;
damianavila
Added '-' as a shortcut for splitting cells.
r11276 } else if (event.which === 189 && that.control_key_active) {
// Split cell = -
damianavila
Added shorcuts to split cell, merge cell above and merge cell below.
r11232 that.split_cell();
that.control_key_active = false;
damianavila
Added '-' as a shortcut for splitting cells.
r11276 return false;
Brian E. Granger
Adding keyboard shortcuts.
r4645 } else if (that.control_key_active) {
that.control_key_active = false;
return true;
MinRK
setting the notebook dirty flag is now an event...
r10781 }
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 return true;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 });
MinRK
setting the notebook dirty flag is now an event...
r10781
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 var collapse_time = function(time){
Bussonnier Matthias
main_app -> ipython-main-app
r9265 var app_height = $('#ipython-main-app').height(); // content height
Brian E. Granger
More accuract height calculations for the pager collapse/expand.
r4362 var splitter_height = $('div#pager_splitter').outerHeight(true);
var new_height = app_height - splitter_height;
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 that.element.animate({height : new_height + 'px'}, time);
}
this.element.bind('collapse_pager', function (event,extrap) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var time = (extrap != undefined) ? ((extrap.duration != undefined ) ? extrap.duration : 'fast') : 'fast';
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 collapse_time(time);
Brian E. Granger
Pager is working again.
r4361 });
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 var expand_time = function(time) {
Bussonnier Matthias
main_app -> ipython-main-app
r9265 var app_height = $('#ipython-main-app').height(); // content height
Brian E. Granger
More accuract height calculations for the pager collapse/expand.
r4362 var splitter_height = $('div#pager_splitter').outerHeight(true);
Brian E. Granger
Pager is working again.
r4361 var pager_height = $('div#pager').outerHeight(true);
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var new_height = app_height - pager_height - splitter_height;
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 that.element.animate({height : new_height + 'px'}, time);
}
this.element.bind('expand_pager', function (event, extrap) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var time = (extrap != undefined) ? ((extrap.duration != undefined ) ? extrap.duration : 'fast') : 'fast';
Matthias BUSSONNIER
Make pager resizable, and remember size......
r6723 expand_time(time);
Brian E. Granger
Pager is working again.
r4361 });
MinRK
use `window.onbeforeunload=` for nav-away warning...
r11111
// Firefox 22 broke $(window).on("beforeunload")
// I'm not sure why or how.
window.onbeforeunload = function (e) {
Brian Granger
Implemented menu based UI using Wijmo.
r5857 // TODO: Make killing the kernel configurable.
var kill_kernel = false;
Brian E. Granger
Disabling auto-save at exit.
r4542 if (kill_kernel) {
that.kernel.kill();
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 }
MinRK
restore "unsaved changes" warning on unload...
r11047 // if we are autosaving, trigger an autosave on nav-away.
// still warn, because if we don't the autosave may fail.
MinRK
remove notebook read-only view...
r11644 if (that.dirty) {
MinRK
restore "unsaved changes" warning on unload...
r11047 if ( that.autosave_interval ) {
MinRK
add delay to autosave in beforeunload...
r11625 // schedule autosave in a timeout
// this gives you a chance to forcefully discard changes
// by reloading the page if you *really* want to.
// the timer doesn't start until you *dismiss* the dialog.
setTimeout(function () {
if (that.dirty) {
that.save_notebook();
}
}, 1000);
MinRK
update before unload message...
r11048 return "Autosave in progress, latest changes may be lost.";
} else {
return "Unsaved changes will be lost.";
MinRK
restore "unsaved changes" warning on unload...
r11047 }
Brian E. Granger
Disabling auto-save at exit.
r4542 };
Fernando Perez
Fix bug where "don't leave" dialog was appearing when not needed in nb....
r5502 // Null is the *only* return value that will make the browser not
// pop up the "don't leave" dialog.
return null;
MinRK
use `window.onbeforeunload=` for nav-away warning...
r11111 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
MinRK
setting the notebook dirty flag is now an event...
r10781 * Set the dirty flag, and trigger the set_dirty.Notebook event
*
* @method set_dirty
*/
Notebook.prototype.set_dirty = function (value) {
if (value === undefined) {
value = true;
}
if (this.dirty == value) {
return;
}
$([IPython.events]).trigger('set_dirty.Notebook', {value: value});
};
/**
David Wyde
Add YUIDoc in notebook.js.
r10033 * Scroll the top of the page to a given cell.
*
* @method scroll_to_cell
* @param {Number} cell_number An index of the cell to view
* @param {Number} time Animation time in milliseconds
* @return {Number} Pixel offset from the top of the container
*/
Matthias BUSSONNIER
Add scroll_to_cell(cell_number) to the notebook
r8419 Notebook.prototype.scroll_to_cell = function (cell_number, time) {
var cells = this.get_cells();
var time = time || 0;
cell_number = Math.min(cells.length-1,cell_number);
cell_number = Math.max(0 ,cell_number);
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var scroll_value = cells[cell_number].element.position().top-cells[0].element.position().top ;
Matthias BUSSONNIER
Add scroll_to_cell(cell_number) to the notebook
r8419 this.element.animate({scrollTop:scroll_value}, time);
return scroll_value;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Scroll to the bottom of the page.
*
* @method scroll_to_bottom
*/
Brian E. Granger
Improving the scrolling model.
r4364 Notebook.prototype.scroll_to_bottom = function () {
Brian Granger
Minor fixes to fonts and spacing.
r4366 this.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);
Brian E. Granger
Improving the scrolling model.
r4364 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Scroll to the top of the page.
*
* @method scroll_to_top
*/
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 Notebook.prototype.scroll_to_top = function () {
this.element.animate({scrollTop:0}, 0);
};
MinRK
add Edit Notebook Metadata to Edit menu
r12913 // Edit Notebook metadata
Notebook.prototype.edit_metadata = function () {
var that = this;
IPython.dialog.edit_metadata(this.metadata, function (md) {
that.metadata = md;
}, 'Notebook');
};
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Cell indexing, retrieval, etc.
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get all cell elements in the notebook.
*
* @method get_cell_elements
* @return {jQuery} A selector of all cell elements
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_cell_elements = function () {
MinRK
only put the notebook in a container...
r10909 return this.container.children("div.cell");
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get a particular cell element.
*
* @method get_cell_element
* @param {Number} index An index of a cell to select
* @return {jQuery} A selector of the given cell.
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_cell_element = function (index) {
var result = null;
var e = this.get_cell_elements().eq(index);
if (e.length !== 0) {
result = e;
}
return result;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Count the cells in this notebook.
*
* @method ncells
* @return {Number} The number of cells in this notebook
*/
Notebook.prototype.ncells = function () {
Brian Granger
Refactoring of the notebooks cell management....
r5945 return this.get_cell_elements().length;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get all Cell objects in this notebook.
*
* @method get_cells
* @return {Array} This notebook's Cell objects
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // TODO: we are often calling cells as cells()[i], which we should optimize
// to cells(i) or a new method.
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_cells = function () {
return this.get_cell_elements().toArray().map(function (e) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return $(e).data("cell");
});
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get a Cell object from this notebook.
*
* @method get_cell
* @param {Number} index An index of a cell to retrieve
* @return {Cell} A particular cell
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_cell = function (index) {
var result = null;
var ce = this.get_cell_element(index);
if (ce !== null) {
result = ce.data('cell');
}
return result;
}
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get the cell below a given cell.
*
* @method get_next_cell
* @param {Cell} cell The provided cell
* @return {Cell} The next cell
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_next_cell = function (cell) {
var result = null;
var index = this.find_cell_index(cell);
Matthias BUSSONNIER
factor valid cell index logic
r9549 if (this.is_valid_cell_index(index+1)) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 result = this.get_cell(index+1);
}
return result;
}
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get the cell above a given cell.
*
* @method get_prev_cell
* @param {Cell} cell The provided cell
* @return {Cell} The previous cell
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_prev_cell = function (cell) {
David Wyde
Add YUIDoc in notebook.js.
r10033 // TODO: off-by-one
// nb.get_prev_cell(nb.get_cell(1)) is null
Brian Granger
Refactoring of the notebooks cell management....
r5945 var result = null;
var index = this.find_cell_index(cell);
if (index !== null && index > 1) {
result = this.get_cell(index-1);
}
return result;
}
David Wyde
Add YUIDoc in notebook.js.
r10033
/**
* Get the numeric index of a given cell.
*
* @method find_cell_index
* @param {Cell} cell The provided cell
* @return {Number} The cell's numeric index
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.find_cell_index = function (cell) {
var result = null;
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell_elements().filter(function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if ($(this).data("cell") === cell) {
result = index;
};
});
return result;
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get a given index , or the selected index if none is provided.
*
* @method index_or_selected
* @param {Number} index A cell's index
* @return {Number} The given index, or selected index if none is provided.
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.index_or_selected = function (index) {
Brian Granger
Cell splitting and merging is done!
r5898 var i;
Brian Granger
Refactoring of the notebooks cell management....
r5945 if (index === undefined || index === null) {
i = this.get_selected_index();
Brian Granger
Cell splitting and merging is done!
r5898 if (i === null) {
i = 0;
}
} else {
i = index;
}
return i;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get the currently selected cell.
* @method get_selected_cell
* @return {Cell} The selected cell
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_selected_cell = function () {
var index = this.get_selected_index();
return this.get_cell(index);
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Check whether a cell index is valid.
*
* @method is_valid_cell_index
* @param {Number} index A cell index
* @return True if the index is valid, false otherwise
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.is_valid_cell_index = function (index) {
if (index !== null && index >= 0 && index < this.ncells()) {
return true;
} else {
return false;
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 };
Brian Granger
Refactoring of the notebooks cell management....
r5945 }
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Get the index of the currently selected cell.
* @method get_selected_index
* @return {Number} The selected cell's numeric index
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.get_selected_index = function () {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var result = null;
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell_elements().filter(function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if ($(this).data("cell").selected === true) {
result = index;
};
});
return result;
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian Granger
Refactoring of the notebooks cell management....
r5945 // Cell selection.
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Programmatically select a cell.
*
* @method select
* @param {Number} index A cell's index
* @return {Notebook} This notebook
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.select = function (index) {
Matthias BUSSONNIER
factor valid cell index logic
r9549 if (this.is_valid_cell_index(index)) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var sindex = this.get_selected_index()
Brian Granger
Lots of small notebook improvements....
r5946 if (sindex !== null && index !== sindex) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell(sindex).unselect();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var cell = this.get_cell(index);
Brian Granger
Further work on the toolbar UI....
r5994 cell.select();
Brian Granger
Heading/plaintext cells now wired up to toolbar UI.
r6028 if (cell.cell_type === 'heading') {
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
{'cell_type':cell.cell_type,level:cell.level}
);
Brian Granger
Heading/plaintext cells now wired up to toolbar UI.
r6028 } else {
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
{'cell_type':cell.cell_type}
);
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 return this;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Programmatically select the next cell.
*
* @method select_next
* @return {Notebook} This notebook
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.select_next = function () {
var index = this.get_selected_index();
Matthias BUSSONNIER
factor valid cell index logic
r9549 this.select(index+1);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 return this;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Programmatically select the previous cell.
*
* @method select_prev
* @return {Notebook} This notebook
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.select_prev = function () {
var index = this.get_selected_index();
Matthias BUSSONNIER
factor valid cell index logic
r9549 this.select(index-1);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return this;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian Granger
Refactoring of the notebooks cell management....
r5945 // Cell movement
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 /**
David Wyde
Add YUIDoc in notebook.js.
r10033 * Move given (or selected) cell up and select it.
*
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 * @method move_cell_up
* @param [index] {integer} cell index
David Wyde
Add YUIDoc in notebook.js.
r10033 * @return {Notebook} This notebook
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 **/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.move_cell_up = function (index) {
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 var i = this.index_or_selected(index);
if (this.is_valid_cell_index(i) && i > 0) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var pivot = this.get_cell_element(i-1);
var tomove = this.get_cell_element(i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if (pivot !== null && tomove !== null) {
tomove.detach();
pivot.before(tomove);
this.select(i-1);
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return this;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 /**
* Move given (or selected) cell down and select it
David Wyde
Add YUIDoc in notebook.js.
r10033 *
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 * @method move_cell_down
* @param [index] {integer} cell index
David Wyde
Add YUIDoc in notebook.js.
r10033 * @return {Notebook} This notebook
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 **/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.move_cell_down = function (index) {
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 var i = this.index_or_selected(index);
Matthias BUSSONNIER
factor valid cell index logic
r9549 if ( this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var pivot = this.get_cell_element(i+1);
var tomove = this.get_cell_element(i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if (pivot !== null && tomove !== null) {
tomove.detach();
pivot.after(tomove);
this.select(i+1);
};
};
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return this;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian Granger
Refactoring of the notebooks cell management....
r5945 // Insertion, deletion.
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Delete a cell from the notebook.
*
* @method delete_cell
* @param [index] A cell's numeric index
* @return {Notebook} This notebook
*/
Brian Granger
Refactoring of the notebooks cell management....
r5945 Notebook.prototype.delete_cell = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var i = this.index_or_selected(index);
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 var cell = this.get_selected_cell();
this.undelete_backup = cell.toJSON();
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#undelete_cell').removeClass('disabled');
Brian Granger
Refactoring of the notebooks cell management....
r5945 if (this.is_valid_cell_index(i)) {
var ce = this.get_cell_element(i);
ce.remove();
if (i === (this.ncells())) {
this.select(i-1);
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 this.undelete_index = i - 1;
this.undelete_below = true;
Brian Granger
Refactoring of the notebooks cell management....
r5945 } else {
this.select(i);
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 this.undelete_index = i;
this.undelete_below = false;
Brian Granger
Refactoring of the notebooks cell management....
r5945 };
MinRK
add create.Cell and delete.Cell js events...
r11214 $([IPython.events]).trigger('delete.Cell', {'cell': cell, 'index': i});
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Refactoring of the notebooks cell management....
r5945 };
return this;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Matthias BUSSONNIER
refactor cellc
r9550 /**
* Insert a cell so that after insertion the cell is at given index.
*
* Similar to insert_above, but index parameter is mandatory
*
* Index will be brought back into the accissible range [0,n]
*
David Wyde
Add YUIDoc in notebook.js.
r10033 * @method insert_cell_at_index
David Wyde
Remove references to HTMLCell (dead code).
r10375 * @param type {string} in ['code','markdown','heading']
Bussonnier Matthias
abstract, cleanup and document...
r9677 * @param [index] {int} a valid index where to inser cell
Matthias BUSSONNIER
refactor cellc
r9550 *
Bussonnier Matthias
abstract, cleanup and document...
r9677 * @return cell {cell|null} created cell or null
Matthias BUSSONNIER
refactor cellc
r9550 **/
Notebook.prototype.insert_cell_at_index = function(type, index){
Bussonnier Matthias
abstract, cleanup and document...
r9677
var ncells = this.ncells();
Matthias BUSSONNIER
refactor cellc
r9550 var index = Math.min(index,ncells);
index = Math.max(index,0);
Brian Granger
A first go at RST cell support in the notebook.
r6017 var cell = null;
Matthias BUSSONNIER
refactor cellc
r9550
Matthias BUSSONNIER
fix one more == to ===
r9789 if (ncells === 0 || this.is_valid_cell_index(index) || index === ncells) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 if (type === 'code') {
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 cell = new IPython.CodeCell(this.kernel);
Brian Granger
Refactoring of the notebooks cell management....
r5945 cell.set_input_prompt();
} else if (type === 'markdown') {
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 cell = new IPython.MarkdownCell();
MinRK
rename plaintext cell -> raw cell
r6248 } else if (type === 'raw') {
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 cell = new IPython.RawCell();
Brian Granger
Finishing first draft of RST and heading cells.
r6019 } else if (type === 'heading') {
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 cell = new IPython.HeadingCell();
Bussonnier Matthias
abstract, cleanup and document...
r9677 }
if(this._insert_element_at_index(cell.element,index)){
Brian Granger
Lots of small notebook improvements....
r5946 cell.render();
this.select(this.find_cell_index(cell));
MinRK
add create.Cell and delete.Cell js events...
r11214 $([IPython.events]).trigger('create.Cell', {'cell': cell, 'index': index});
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Bussonnier Matthias
abstract, cleanup and document...
r9677 }
}
Brian Granger
A first go at RST cell support in the notebook.
r6017 return cell;
Matthias BUSSONNIER
refactor cellc
r9550
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Starting work on a Markdown cell.
r4507
Bussonnier Matthias
abstract, cleanup and document...
r9677 /**
* Insert an element at given cell index.
*
David Wyde
Add YUIDoc in notebook.js.
r10033 * @method _insert_element_at_index
Bussonnier Matthias
abstract, cleanup and document...
r9677 * @param element {dom element} a cell element
* @param [index] {int} a valid index where to inser cell
* @private
*
* return true if everything whent fine.
**/
Notebook.prototype._insert_element_at_index = function(element, index){
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 if (element === undefined){
Matthias BUSSONNIER
simplify logic
r9688 return false;
}
Bussonnier Matthias
abstract, cleanup and document...
r9677 var ncells = this.ncells();
Matthias BUSSONNIER
simplify logic
r9688 if (ncells === 0) {
// special case append if empty
this.element.find('div.end_space').before(element);
Matthias BUSSONNIER
fix i/index in move up/down and == -> ===
r9788 } else if ( ncells === index ) {
Matthias BUSSONNIER
simplify logic
r9688 // special case append it the end, but not empty
this.get_cell_element(index-1).after(element);
} else if (this.is_valid_cell_index(index)) {
// otherwise always somewhere to append to
this.get_cell_element(index).before(element);
} else {
return false;
}
Brian E. Granger
Starting work on a Markdown cell.
r4507
David Warde-Farley
Make undelete respect order after insertions/deletions.
r8694 if (this.undelete_index !== null && index <= this.undelete_index) {
this.undelete_index = this.undelete_index + 1;
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
David Warde-Farley
Make undelete respect order after insertions/deletions.
r8694 }
Matthias BUSSONNIER
simplify logic
r9688 return true;
Matthias BUSSONNIER
refactor cellc
r9550 };
/**
* Insert a cell of given type above given index, or at top
* of notebook if index smaller than 0.
*
* default index value is the one of currently selected cell
*
David Wyde
Add YUIDoc in notebook.js.
r10033 * @method insert_cell_above
Matthias BUSSONNIER
refactor cellc
r9550 * @param type {string} cell type
* @param [index] {integer}
*
* @return handle to created cell or null
**/
Notebook.prototype.insert_cell_above = function (type, index) {
index = this.index_or_selected(index);
return this.insert_cell_at_index(type, index);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Starting work on a Markdown cell.
r4507
Bussonnier Matthias
abstract, cleanup and document...
r9677 /**
* Insert a cell of given type below given index, or at bottom
* of notebook if index greater thatn number of cell
*
* default index value is the one of currently selected cell
*
* @method insert_cell_below
* @param type {string} cell type
* @param [index] {integer}
*
* @return handle to created cell or null
*
**/
Notebook.prototype.insert_cell_below = function (type, index) {
index = this.index_or_selected(index);
return this.insert_cell_at_index(type, index+1);
};
/**
* Insert cell at end of notebook
*
* @method insert_cell_at_bottom
David Wyde
Add YUIDoc in notebook.js.
r10033 * @param {String} type cell type
Bussonnier Matthias
abstract, cleanup and document...
r9677 *
* @return the added cell; or null
**/
Notebook.prototype.insert_cell_at_bottom = function (type){
var len = this.ncells();
return this.insert_cell_below(type,len-1);
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Turn a cell into a code cell.
*
* @method to_code
* @param {Number} [index] A cell's index
*/
Brian E. Granger
Starting work on a Markdown cell.
r4507 Notebook.prototype.to_code = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var i = this.index_or_selected(index);
Brian Granger
Refactoring of the notebooks cell management....
r5945 if (this.is_valid_cell_index(i)) {
var source_element = this.get_cell_element(i);
var source_cell = source_element.data("cell");
if (!(source_cell instanceof IPython.CodeCell)) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var target_cell = this.insert_cell_below('code',i);
Brian Granger
Refactoring of the notebooks cell management....
r5945 var text = source_cell.get_text();
if (text === source_cell.placeholder) {
text = '';
}
target_cell.set_text(text);
Paul Ivanov
fix for #1678, undo no longer clears cells...
r7587 // make this value the starting point, so that we can only undo
// to this state, instead of a blank cell
target_cell.code_mirror.clearHistory();
Brian Granger
Refactoring of the notebooks cell management....
r5945 source_element.remove();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Refactoring of the notebooks cell management....
r5945 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
};
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Turn a cell into a Markdown cell.
*
* @method to_markdown
* @param {Number} [index] A cell's index
*/
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 Notebook.prototype.to_markdown = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var i = this.index_or_selected(index);
Brian Granger
Refactoring of the notebooks cell management....
r5945 if (this.is_valid_cell_index(i)) {
var source_element = this.get_cell_element(i);
var source_cell = source_element.data("cell");
if (!(source_cell instanceof IPython.MarkdownCell)) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var target_cell = this.insert_cell_below('markdown',i);
Brian Granger
Refactoring of the notebooks cell management....
r5945 var text = source_cell.get_text();
if (text === source_cell.placeholder) {
Brian Granger
Lots of small notebook improvements....
r5946 text = '';
Brian Granger
Refactoring of the notebooks cell management....
r5945 };
Brian Granger
A first go at RST cell support in the notebook.
r6017 // The edit must come before the set_text.
target_cell.edit();
target_cell.set_text(text);
Paul Ivanov
fix for #1678, undo no longer clears cells...
r7587 // make this value the starting point, so that we can only undo
// to this state, instead of a blank cell
target_cell.code_mirror.clearHistory();
Brian Granger
A first go at RST cell support in the notebook.
r6017 source_element.remove();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Updating cell logic....
r5944 };
};
Brian E. Granger
Starting work on a Markdown cell.
r4507 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Turn a cell into a raw text cell.
*
* @method to_raw
* @param {Number} [index] A cell's index
*/
MinRK
rename plaintext cell -> raw cell
r6248 Notebook.prototype.to_raw = function (index) {
Brian Granger
A first go at RST cell support in the notebook.
r6017 var i = this.index_or_selected(index);
if (this.is_valid_cell_index(i)) {
var source_element = this.get_cell_element(i);
var source_cell = source_element.data("cell");
var target_cell = null;
MinRK
rename plaintext cell -> raw cell
r6248 if (!(source_cell instanceof IPython.RawCell)) {
target_cell = this.insert_cell_below('raw',i);
Brian Granger
A first go at RST cell support in the notebook.
r6017 var text = source_cell.get_text();
if (text === source_cell.placeholder) {
text = '';
};
// The edit must come before the set_text.
target_cell.edit();
target_cell.set_text(text);
Paul Ivanov
fix for #1678, undo no longer clears cells...
r7587 // make this value the starting point, so that we can only undo
// to this state, instead of a blank cell
target_cell.code_mirror.clearHistory();
Brian Granger
A first go at RST cell support in the notebook.
r6017 source_element.remove();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
A first go at RST cell support in the notebook.
r6017 };
};
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Turn a cell into a heading cell.
*
* @method to_heading
* @param {Number} [index] A cell's index
* @param {Number} [level] A heading level (e.g., 1 becomes &lt;h1&gt;)
*/
Brian Granger
Finishing first draft of RST and heading cells.
r6019 Notebook.prototype.to_heading = function (index, level) {
level = level || 1;
var i = this.index_or_selected(index);
if (this.is_valid_cell_index(i)) {
var source_element = this.get_cell_element(i);
var source_cell = source_element.data("cell");
var target_cell = null;
if (source_cell instanceof IPython.HeadingCell) {
source_cell.set_level(level);
} else {
target_cell = this.insert_cell_below('heading',i);
var text = source_cell.get_text();
if (text === source_cell.placeholder) {
text = '';
};
// The edit must come before the set_text.
target_cell.set_level(level);
target_cell.edit();
target_cell.set_text(text);
Paul Ivanov
fix for #1678, undo no longer clears cells...
r7587 // make this value the starting point, so that we can only undo
// to this state, instead of a blank cell
target_cell.code_mirror.clearHistory();
Brian Granger
Finishing first draft of RST and heading cells.
r6019 source_element.remove();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Finishing first draft of RST and heading cells.
r6019 };
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
{'cell_type':'heading',level:level}
);
Brian Granger
Finishing first draft of RST and heading cells.
r6019 };
};
Brian Granger
Refactoring of the notebooks cell management....
r5945 // Cut/Copy/Paste
Brian Granger
Added cell level cut/copy/paste.
r5879
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Enable UI elements for pasting cells.
*
* @method enable_paste
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.enable_paste = function () {
var that = this;
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 if (!this.paste_enabled) {
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#paste_cell_replace').removeClass('disabled')
David Warde-Farley
Make 'Paste Above' the default paste behavior....
r8715 .on('click', function () {that.paste_cell_replace();});
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#paste_cell_above').removeClass('disabled')
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 .on('click', function () {that.paste_cell_above();});
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#paste_cell_below').removeClass('disabled')
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 .on('click', function () {that.paste_cell_below();});
this.paste_enabled = true;
};
Brian Granger
Added cell level cut/copy/paste.
r5879 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Disable UI elements for pasting cells.
*
* @method disable_paste
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.disable_paste = function () {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 if (this.paste_enabled) {
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#paste_cell_replace').addClass('disabled').off('click');
$('#paste_cell_above').addClass('disabled').off('click');
$('#paste_cell_below').addClass('disabled').off('click');
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 this.paste_enabled = false;
};
Brian Granger
Added cell level cut/copy/paste.
r5879 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Cut a cell.
*
* @method cut_cell
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.cut_cell = function () {
this.copy_cell();
this.delete_cell();
}
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Copy a cell.
*
* @method copy_cell
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.copy_cell = function () {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cell = this.get_selected_cell();
Brian Granger
Added cell level cut/copy/paste.
r5879 this.clipboard = cell.toJSON();
this.enable_paste();
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Replace the selected cell with a cell in the clipboard.
*
* @method paste_cell_replace
*/
David Warde-Farley
Make 'Paste Above' the default paste behavior....
r8715 Notebook.prototype.paste_cell_replace = function () {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 if (this.clipboard !== null && this.paste_enabled) {
Brian Granger
Added cell level cut/copy/paste.
r5879 var cell_data = this.clipboard;
Brian Granger
Refactoring of the notebooks cell management....
r5945 var new_cell = this.insert_cell_above(cell_data.cell_type);
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var old_cell = this.get_next_cell(new_cell);
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.delete_cell(this.find_cell_index(old_cell));
this.select(this.find_cell_index(new_cell));
Brian Granger
Added cell level cut/copy/paste.
r5879 };
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Paste a cell from the clipboard above the selected cell.
*
* @method paste_cell_above
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.paste_cell_above = function () {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 if (this.clipboard !== null && this.paste_enabled) {
Brian Granger
Added cell level cut/copy/paste.
r5879 var cell_data = this.clipboard;
Brian Granger
Refactoring of the notebooks cell management....
r5945 var new_cell = this.insert_cell_above(cell_data.cell_type);
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
Brian Granger
Added cell level cut/copy/paste.
r5879 };
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Paste a cell from the clipboard below the selected cell.
*
* @method paste_cell_below
*/
Brian Granger
Added cell level cut/copy/paste.
r5879 Notebook.prototype.paste_cell_below = function () {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 if (this.clipboard !== null && this.paste_enabled) {
Brian Granger
Added cell level cut/copy/paste.
r5879 var cell_data = this.clipboard;
Brian Granger
Refactoring of the notebooks cell management....
r5945 var new_cell = this.insert_cell_below(cell_data.cell_type);
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
Brian Granger
Added cell level cut/copy/paste.
r5879 };
};
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 // Cell undelete
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Restore the most recently deleted cell.
*
* @method undelete
*/
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 Notebook.prototype.undelete = function() {
if (this.undelete_backup !== null && this.undelete_index !== null) {
var current_index = this.get_selected_index();
if (this.undelete_index < current_index) {
current_index = current_index + 1;
}
if (this.undelete_index >= this.ncells()) {
this.select(this.ncells() - 1);
}
else {
this.select(this.undelete_index);
}
var cell_data = this.undelete_backup;
var new_cell = null;
if (this.undelete_below) {
new_cell = this.insert_cell_below(cell_data.cell_type);
} else {
new_cell = this.insert_cell_above(cell_data.cell_type);
}
new_cell.fromJSON(cell_data);
this.select(current_index);
this.undelete_backup = null;
this.undelete_index = null;
}
MinRK
use bootstrap `disabled` instead of `ui-state-disabled`...
r11118 $('#undelete_cell').addClass('disabled');
David Warde-Farley
Add a simple 'undo' for cell deletion....
r8691 }
Brian Granger
Added cell level cut/copy/paste.
r5879
Brian Granger
Refactoring of the notebooks cell management....
r5945 // Split/merge
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Split the selected cell into two, at the cursor.
*
* @method split_cell
*/
Brian Granger
More of the initial split cell capability.
r5897 Notebook.prototype.split_cell = function () {
Brian Granger
Cell splitting and merging is done!
r5898 // Todo: implement spliting for other cell types.
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cell = this.get_selected_cell();
Brian Granger
Lots of small notebook improvements....
r5946 if (cell.is_splittable()) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var texta = cell.get_pre_cursor();
var textb = cell.get_post_cursor();
Brian Granger
Lots of small notebook improvements....
r5946 if (cell instanceof IPython.CodeCell) {
cell.set_text(texta);
var new_cell = this.insert_cell_below('code');
new_cell.set_text(textb);
} else if (cell instanceof IPython.MarkdownCell) {
cell.set_text(texta);
cell.render();
var new_cell = this.insert_cell_below('markdown');
new_cell.edit(); // editor must be visible to call set_text
new_cell.set_text(textb);
new_cell.render();
David Wyde
Remove references to HTMLCell (dead code).
r10375 }
Brian Granger
More of the initial split cell capability.
r5897 };
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Combine the selected cell into the cell above it.
*
* @method merge_cell_above
*/
Brian Granger
Cell splitting and merging is done!
r5898 Notebook.prototype.merge_cell_above = function () {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var index = this.get_selected_index();
Brian Granger
Lots of small notebook improvements....
r5946 var cell = this.get_cell(index);
MinRK
add Cell.is_mergeable method...
r12509 if (!cell.is_mergeable()) {
return;
}
Brian Granger
Cell splitting and merging is done!
r5898 if (index > 0) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var upper_cell = this.get_cell(index-1);
MinRK
add Cell.is_mergeable method...
r12509 if (!upper_cell.is_mergeable()) {
return;
}
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var upper_text = upper_cell.get_text();
var text = cell.get_text();
Brian Granger
Lots of small notebook improvements....
r5946 if (cell instanceof IPython.CodeCell) {
cell.set_text(upper_text+'\n'+text);
David Wyde
Remove references to HTMLCell (dead code).
r10375 } else if (cell instanceof IPython.MarkdownCell) {
Brian Granger
Lots of small notebook improvements....
r5946 cell.edit();
cell.set_text(upper_text+'\n'+text);
cell.render();
Brian Granger
Cell splitting and merging is done!
r5898 };
Brian Granger
Lots of small notebook improvements....
r5946 this.delete_cell(index-1);
this.select(this.find_cell_index(cell));
Brian Granger
Cell splitting and merging is done!
r5898 };
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Combine the selected cell into the cell below it.
*
* @method merge_cell_below
*/
Brian Granger
Cell splitting and merging is done!
r5898 Notebook.prototype.merge_cell_below = function () {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var index = this.get_selected_index();
Brian Granger
Lots of small notebook improvements....
r5946 var cell = this.get_cell(index);
MinRK
add Cell.is_mergeable method...
r12509 if (!cell.is_mergeable()) {
return;
}
Brian Granger
Cell splitting and merging is done!
r5898 if (index < this.ncells()-1) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var lower_cell = this.get_cell(index+1);
MinRK
add Cell.is_mergeable method...
r12509 if (!lower_cell.is_mergeable()) {
return;
}
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var lower_text = lower_cell.get_text();
var text = cell.get_text();
Brian Granger
Lots of small notebook improvements....
r5946 if (cell instanceof IPython.CodeCell) {
cell.set_text(text+'\n'+lower_text);
David Wyde
Remove references to HTMLCell (dead code).
r10375 } else if (cell instanceof IPython.MarkdownCell) {
Brian Granger
Lots of small notebook improvements....
r5946 cell.edit();
cell.set_text(text+'\n'+lower_text);
cell.render();
Brian Granger
Cell splitting and merging is done!
r5898 };
Brian Granger
Lots of small notebook improvements....
r5946 this.delete_cell(index+1);
this.select(this.find_cell_index(cell));
Brian Granger
Cell splitting and merging is done!
r5898 };
};
Brian Granger
Fixing auto-indent issues in CodeMirror config....
r5959
Brian E. Granger
Clear all output is implemented.
r4543 // Cell collapsing and output clearing
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Hide a cell's output.
*
* @method collapse
* @param {Number} index A cell's numeric index
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.collapse = function (index) {
var i = this.index_or_selected(index);
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell(i).collapse();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Show a cell's output.
*
* @method expand
* @param {Number} index A cell's numeric index
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.expand = function (index) {
var i = this.index_or_selected(index);
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell(i).expand();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /** Toggle whether a cell's output is collapsed or expanded.
*
* @method toggle_output
* @param {Number} index A cell's numeric index
*/
Brian E. Granger
Cell collapse/expand is not called "Toggle".
r4639 Notebook.prototype.toggle_output = function (index) {
var i = this.index_or_selected(index);
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_cell(i).toggle_output();
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian E. Granger
Cell collapse/expand is not called "Toggle".
r4639 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Toggle a scrollbar for long cell outputs.
*
* @method toggle_output_scroll
* @param {Number} index A cell's numeric index
*/
MinRK
add ^M-O for toggling output scroll
r7429 Notebook.prototype.toggle_output_scroll = function (index) {
var i = this.index_or_selected(index);
this.get_cell(i).toggle_output_scroll();
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Hide each code cell's output area.
*
* @method collapse_all_output
*/
MinRK
third attempt at scrolled long output...
r7362 Notebook.prototype.collapse_all_output = function () {
var ncells = this.ncells();
var cells = this.get_cells();
for (var i=0; i<ncells; i++) {
if (cells[i] instanceof IPython.CodeCell) {
cells[i].output_area.collapse();
}
};
// this should not be set if the `collapse` key is removed from nbformat
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
MinRK
third attempt at scrolled long output...
r7362 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Expand each code cell's output area, and add a scrollbar for long output.
*
* @method scroll_all_output
*/
MinRK
third attempt at scrolled long output...
r7362 Notebook.prototype.scroll_all_output = function () {
var ncells = this.ncells();
var cells = this.get_cells();
for (var i=0; i<ncells; i++) {
if (cells[i] instanceof IPython.CodeCell) {
cells[i].output_area.expand();
Matthias BUSSONNIER
Use different threshold for (auto)scroll in output...
r10776 cells[i].output_area.scroll_if_long();
MinRK
third attempt at scrolled long output...
r7362 }
};
// this should not be set if the `collapse` key is removed from nbformat
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
MinRK
third attempt at scrolled long output...
r7362 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Expand each code cell's output area, and remove scrollbars.
*
* @method expand_all_output
*/
MinRK
third attempt at scrolled long output...
r7362 Notebook.prototype.expand_all_output = function () {
var ncells = this.ncells();
var cells = this.get_cells();
for (var i=0; i<ncells; i++) {
if (cells[i] instanceof IPython.CodeCell) {
cells[i].output_area.expand();
cells[i].output_area.unscroll_area();
}
};
// this should not be set if the `collapse` key is removed from nbformat
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
MinRK
third attempt at scrolled long output...
r7362 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Clear each code cell's output area.
*
* @method clear_all_output
*/
Brian E. Granger
Clear all output is implemented.
r4543 Notebook.prototype.clear_all_output = function () {
var ncells = this.ncells();
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cells = this.get_cells();
Brian E. Granger
Clear all output is implemented.
r4543 for (var i=0; i<ncells; i++) {
if (cells[i] instanceof IPython.CodeCell) {
Jonathan Frederic
Removed ability to clear stdout and stderr individually.
r12589 cells[i].clear_output();
Paul Ivanov
clear In[] prompt numbers on "Clear All Output"
r6545 // Make all In[] prompts blank, as well
// TODO: make this configurable (via checkbox?)
cells[i].set_input_prompt();
Brian E. Granger
Clear all output is implemented.
r4543 }
};
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian E. Granger
Clear all output is implemented.
r4543 };
Brian Granger
Fixing auto-indent issues in CodeMirror config....
r5959
Fernando Perez
Refactor line num. toggle into proper function, access via C-m-l....
r5020 // Other cell functions: line numbers, ...
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Toggle line numbers in the selected cell's input area.
*
* @method cell_toggle_line_numbers
*/
Fernando Perez
Refactor line num. toggle into proper function, access via C-m-l....
r5020 Notebook.prototype.cell_toggle_line_numbers = function() {
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.get_selected_cell().toggle_line_numbers();
Fernando Perez
Refactor line num. toggle into proper function, access via C-m-l....
r5020 };
Brian E. Granger
Clear all output is implemented.
r4543
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Kernel related things
Brian Granger
Basic notebook saving and loading....
r4315
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Start a new kernel and set it on each code cell.
*
* @method start_kernel
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.start_kernel = function () {
Matthias BUSSONNIER
Clean code, retab and minor fix...
r7170 var base_url = $('body').data('baseKernelUrl') + "kernels";
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 this.kernel = new IPython.Kernel(base_url);
Jason Grout
Make parameters for kernel start method more general
r12885 this.kernel.start({notebook: this.notebook_id});
Brian Granger
Fixed order of notebook loading and kernel starting....
r7197 // Now that the kernel has been created, tell the CodeCells about it.
var ncells = this.ncells();
for (var i=0; i<ncells; i++) {
var cell = this.get_cell(i);
if (cell instanceof IPython.CodeCell) {
cell.set_kernel(this.kernel)
};
};
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Prompt the user to restart the IPython kernel.
*
* @method restart_kernel
*/
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 Notebook.prototype.restart_kernel = function () {
Fernando Perez
Clean up accidentally introduced hard tabs in JS code.
r5025 var that = this;
MinRK
bootstrap dialogs
r10895 IPython.dialog.modal({
title : "Restart kernel or continue running?",
body : $("<p/>").html(
'Do you want to restart the current kernel? You will lose all variables defined in it.'
),
Fernando Perez
Add confirmation dialog to kernel restart action.
r5021 buttons : {
MinRK
bootstrap dialogs
r10895 "Continue running" : {},
"Restart" : {
"class" : "btn-danger",
"click" : function() {
that.kernel.restart();
}
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 }
}
});
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Run the selected cell.
*
David Wyde
Fix an incorrect comment.
r10127 * Execute or render cell outputs.
David Wyde
Add YUIDoc in notebook.js.
r10033 *
* @method execute_selected_cell
* @param {Object} options Customize post-execution behavior
*/
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 Notebook.prototype.execute_selected_cell = function (options) {
// add_new: should a new cell be added if we are at the end of the nb
// terminal: execute in terminal mode, which stays in the current cell
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var default_options = {terminal: false, add_new: true};
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 $.extend(default_options, options);
Brian E. Granger
Fixing execution related things....
r4378 var that = this;
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cell = that.get_selected_cell();
Brian E. Granger
Fixing execution related things....
r4378 var cell_index = that.find_cell_index(cell);
if (cell instanceof IPython.CodeCell) {
Matthias BUSSONNIER
Clean code, retab and minor fix...
r7170 cell.execute();
Brian E. Granger
Fixing execution related things....
r4378 }
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 if (default_options.terminal) {
Brian E. Granger
Ctrl-Enter now does not delete input, but selects it.
r4675 cell.select_all();
Brian E. Granger
Fixing execution related things....
r4378 } else {
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 if ((cell_index === (that.ncells()-1)) && default_options.add_new) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 that.insert_cell_below('code');
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 // If we are adding a new cell at the end, scroll down to show it.
that.scroll_to_bottom();
} else {
that.select(cell_index+1);
};
Brian E. Granger
Fixing execution related things....
r4378 };
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(true);
Brian E. Granger
Fixing execution related things....
r4378 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Execute all cells below the selected cell.
*
* @method execute_cells_below
*/
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 Notebook.prototype.execute_cells_below = function () {
this.execute_cell_range(this.get_selected_index(), this.ncells());
Matthias BUSSONNIER
undefinied that -> this
r8821 this.scroll_to_bottom();
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Execute all cells above the selected cell.
*
* @method execute_cells_above
*/
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 Notebook.prototype.execute_cells_above = function () {
this.execute_cell_range(0, this.get_selected_index());
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Execute all cells.
*
* @method execute_all_cells
*/
Brian E. Granger
Fixing execution related things....
r4378 Notebook.prototype.execute_all_cells = function () {
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 this.execute_cell_range(0, this.ncells());
Matthias BUSSONNIER
fix run-all (that-> this)
r9816 this.scroll_to_bottom();
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Execute a contiguous range of cells.
*
* @method execute_cell_range
* @param {Number} start Index of the first cell to execute (inclusive)
* @param {Number} end Index of the last cell to execute (exclusive)
*/
Paul Ivanov
fine-grained notebook 'run' controls, closes #2521...
r8606 Notebook.prototype.execute_cell_range = function (start, end) {
for (var i=start; i<end; i++) {
Brian E. Granger
Fixing execution related things....
r4378 this.select(i);
Matthias BUSSONNIER
execute_get_cell -> execute_cell...
r5967 this.execute_selected_cell({add_new:false});
Brian E. Granger
Fixing execution related things....
r4378 };
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Persistance and loading
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Getter method for this notebook's ID.
*
* @method get_notebook_id
* @return {String} This notebook's ID
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.get_notebook_id = function () {
return this.notebook_id;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Getter method for this notebook's name.
*
* @method get_notebook_name
* @return {String} This notebook's name
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.get_notebook_name = function () {
return this.notebook_name;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Setter method for this notebook's name.
*
* @method set_notebook_name
* @param {String} name A new name for this notebook
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.set_notebook_name = function (name) {
this.notebook_name = name;
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Check that a notebook's name is valid.
*
* @method test_notebook_name
* @param {String} nbname A name for this notebook
* @return {Boolean} True if the name is valid, false if invalid
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.test_notebook_name = function (nbname) {
nbname = nbname || '';
if (this.notebook_name_blacklist_re.test(nbname) == false && nbname.length>0) {
return true;
} else {
return false;
};
};
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Load a notebook from JSON (.ipynb).
*
* This currently handles one worksheet: others are deleted.
*
* @method fromJSON
* @param {Object} data JSON representation of a notebook
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.fromJSON = function (data) {
var ncells = this.ncells();
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 var i;
for (i=0; i<ncells; i++) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Always delete cell 0 as they get renumbered as they are deleted.
this.delete_cell(0);
};
Brian Granger
Major refactoring of saving, notification....
r6047 // Save the metadata and name.
Brian E. Granger
Implemented metadata for notebook format.
r4637 this.metadata = data.metadata;
Brian Granger
Major refactoring of saving, notification....
r6047 this.notebook_name = data.metadata.name;
Brian E. Granger
Massive work on the notebook document format....
r4484 // Only handle 1 worksheet for now.
var worksheet = data.worksheets[0];
if (worksheet !== undefined) {
MinRK
add empty metadata field on cells/worksheets...
r7523 if (worksheet.metadata) {
this.worksheet_metadata = worksheet.metadata;
}
Brian E. Granger
Massive work on the notebook document format....
r4484 var new_cells = worksheet.cells;
ncells = new_cells.length;
var cell_data = null;
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 var new_cell = null;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 for (i=0; i<ncells; i++) {
Brian E. Granger
Massive work on the notebook document format....
r4484 cell_data = new_cells[i];
MinRK
add VERSIONHACK markers for never-released plaintext handling
r6477 // VERSIONHACK: plaintext -> raw
// handle never-released plaintext name for raw cells
MinRK
interpret 'plaintext' cells with their new name 'raw'
r6255 if (cell_data.cell_type === 'plaintext'){
cell_data.cell_type = 'raw';
}
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839
Brian Granger
Refactoring of the notebooks cell management....
r5945 new_cell = this.insert_cell_below(cell_data.cell_type);
new_cell.fromJSON(cell_data);
Brian Granger
Added cell level cut/copy/paste.
r5879 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
MinRK
add future-warning about multiple notebooks
r7610 if (data.worksheets.length > 1) {
MinRK
bootstrap dialogs
r10895 IPython.dialog.modal({
title : "Multiple worksheets",
body : "This notebook has " + data.worksheets.length + " worksheets, " +
"but this version of IPython can only handle the first. " +
"If you save this notebook, worksheets after the first will be lost.",
MinRK
add future-warning about multiple notebooks
r7610 buttons : {
MinRK
bootstrap dialogs
r10895 OK : {
class : "btn-danger"
MinRK
add future-warning about multiple notebooks
r7610 }
MinRK
bootstrap dialogs
r10895 }
MinRK
add future-warning about multiple notebooks
r7610 });
}
Brian Granger
Basic notebook saving and loading....
r4315 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Dump this notebook into a JSON-friendly object.
*
* @method toJSON
* @return {Object} A JSON-friendly representation of this notebook.
*/
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.toJSON = function () {
Brian Granger
Refactoring of the notebooks cell management....
r5945 var cells = this.get_cells();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var ncells = cells.length;
Brian Granger
Adding missing var statements in notebook.js.
r7179 var cell_array = new Array(ncells);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 for (var i=0; i<ncells; i++) {
cell_array[i] = cells[i].toJSON();
};
Brian Granger
Adding missing var statements in notebook.js.
r7179 var data = {
Brian E. Granger
Massive work on the notebook document format....
r4484 // Only handle 1 worksheet for now.
MinRK
add empty metadata field on cells/worksheets...
r7523 worksheets : [{
cells: cell_array,
metadata: this.worksheet_metadata
}],
Brian E. Granger
Implemented metadata for notebook format.
r4637 metadata : this.metadata
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
return data;
Brian E. Granger
Massive work on the notebook document format....
r4484 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
MinRK
add autosave timer...
r10505 * Start an autosave timer, for periodically saving the notebook.
*
MinRK
s/autosave_notebook/set_autosave_interval/
r10508 * @method set_autosave_interval
MinRK
add autosave timer...
r10505 * @param {Integer} interval the autosave interval in milliseconds
*/
MinRK
s/autosave_notebook/set_autosave_interval/
r10508 Notebook.prototype.set_autosave_interval = function (interval) {
MinRK
add autosave timer...
r10505 var that = this;
// clear previous interval, so we don't get simultaneous timers
if (this.autosave_timer) {
clearInterval(this.autosave_timer);
}
MinRK
s/autosave_notebook/set_autosave_interval/
r10508 this.autosave_interval = this.minimum_autosave_interval = interval;
MinRK
add autosave timer...
r10505 if (interval) {
this.autosave_timer = setInterval(function() {
MinRK
only autosave when dirty
r10506 if (that.dirty) {
that.save_notebook();
}
MinRK
add autosave timer...
r10505 }, interval);
$([IPython.events]).trigger("autosave_enabled.Notebook", interval);
} else {
this.autosave_timer = null;
$([IPython.events]).trigger("autosave_disabled.Notebook");
};
};
/**
David Wyde
Add YUIDoc in notebook.js.
r10033 * Save this notebook on the server.
*
* @method save_notebook
*/
Brian E. Granger
Massive work on the notebook document format....
r4484 Notebook.prototype.save_notebook = function () {
Brian Granger
Fixing broken notebook saves.
r5958 // We may want to move the name/id/nbformat logic inside toJSON?
var data = this.toJSON();
Brian Granger
Major refactoring of saving, notification....
r6047 data.metadata.name = this.notebook_name;
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 data.nbformat = this.nbformat;
MinRK
add dialog when loading newer minor-version notebooks
r7546 data.nbformat_minor = this.nbformat_minor;
MinRK
add autosave timer...
r10505
// time the ajax call for autosave tuning purposes.
var start = new Date().getTime();
Brian Granger
Fixing broken notebook saves.
r5958 // We do the call with settings so we can set cache to false.
var settings = {
processData : false,
cache : false,
type : "PUT",
data : JSON.stringify(data),
headers : {'Content-Type': 'application/json'},
MinRK
add autosave timer...
r10505 success : $.proxy(this.save_notebook_success, this, start),
error : $.proxy(this.save_notebook_error, this)
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('notebook_saving.Notebook');
Bussonnier Matthias
change more baseurl
r9503 var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id;
Brian Granger
Fixing broken notebook saves.
r5958 $.ajax(url, settings);
Brian Granger
Basic notebook saving and loading....
r4315 };
MinRK
expose notebook checkpoints in html/js...
r10501
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Success callback for saving a notebook.
*
* @method save_notebook_success
MinRK
add autosave timer...
r10505 * @param {Integer} start the time when the save request started
David Wyde
Add YUIDoc in notebook.js.
r10033 * @param {Object} data JSON representation of a notebook
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
MinRK
add autosave timer...
r10505 Notebook.prototype.save_notebook_success = function (start, data, status, xhr) {
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(false);
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('notebook_saved.Notebook');
MinRK
add autosave timer...
r10505 this._update_autosave_interval(start);
MinRK
expose notebook checkpoints in html/js...
r10501 if (this._checkpoint_after_save) {
this.create_checkpoint();
this._checkpoint_after_save = false;
};
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
MinRK
expose notebook checkpoints in html/js...
r10501
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
MinRK
add autosave timer...
r10505 * update the autosave interval based on how long the last save took
*
* @method _update_autosave_interval
* @param {Integer} timestamp when the save request started
*/
Notebook.prototype._update_autosave_interval = function (start) {
var duration = (new Date().getTime() - start);
if (this.autosave_interval) {
// new save interval: higher of 10x save duration or parameter (default 30 seconds)
var interval = Math.max(10 * duration, this.minimum_autosave_interval);
// round to 10 seconds, otherwise we will be setting a new interval too often
interval = 10000 * Math.round(interval / 10000);
// set new interval, if it's changed
if (interval != this.autosave_interval) {
MinRK
s/autosave_notebook/set_autosave_interval/
r10508 this.set_autosave_interval(interval);
MinRK
add autosave timer...
r10505 }
}
};
/**
David Wyde
Add YUIDoc in notebook.js.
r10033 * Failure callback for saving a notebook.
*
* @method save_notebook_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
*/
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 Notebook.prototype.save_notebook_error = function (xhr, status, error_msg) {
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('notebook_save_failed.Notebook');
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
MinRK
expose notebook checkpoints in html/js...
r10501
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Request a notebook's data from the server.
*
* @method load_notebook
* @param {String} notebook_id A notebook to load
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.load_notebook = function (notebook_id) {
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 var that = this;
Brian Granger
Major refactoring of saving, notification....
r6047 this.notebook_id = notebook_id;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // We do the call with settings so we can set cache to false.
var settings = {
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 processData : false,
cache : false,
type : "GET",
dataType : "json",
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 success : $.proxy(this.load_notebook_success,this),
error : $.proxy(this.load_notebook_error,this),
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('notebook_loading.Notebook');
Bussonnier Matthias
change more baseurl
r9503 var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id;
Brian E. Granger
Updating JS URL scheme to use embedded data....
r5106 $.ajax(url, settings);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Success callback for loading a notebook from the server.
*
* Load notebook data from the JSON response.
*
* @method load_notebook_success
* @param {Object} data JSON representation of a notebook
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
Brian Granger
Major refactoring of saving, notification....
r6047 Notebook.prototype.load_notebook_success = function (data, status, xhr) {
Brian E. Granger
Massive work on the notebook document format....
r4484 this.fromJSON(data);
if (this.ncells() === 0) {
Brian Granger
Refactoring of the notebooks cell management....
r5945 this.insert_cell_below('code');
Brian E. Granger
Massive work on the notebook document format....
r4484 };
MinRK
setting the notebook dirty flag is now an event...
r10781 this.set_dirty(false);
Brian Granger
Optimizing notebook loading.
r5949 this.select(0);
Brian Granger
Fixing bugs in CodeMirror refreshing.
r5950 this.scroll_to_top();
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 if (data.orig_nbformat !== undefined && data.nbformat !== data.orig_nbformat) {
MinRK
bootstrap dialogs
r10895 var msg = "This notebook has been converted from an older " +
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 "notebook format (v"+data.orig_nbformat+") to the current notebook " +
"format (v"+data.nbformat+"). The next time you save this notebook, the " +
MinRK
bootstrap dialogs
r10895 "newer notebook format will be used and older versions of IPython " +
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 "may not be able to read it. To keep the older version, close the " +
"notebook without saving it.";
MinRK
bootstrap dialogs
r10895 IPython.dialog.modal({
title : "Notebook converted",
body : msg,
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 buttons : {
MinRK
bootstrap dialogs
r10895 OK : {
class : "btn-primary"
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 }
MinRK
bootstrap dialogs
r10895 }
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 });
MinRK
add dialog when loading newer minor-version notebooks
r7546 } else if (data.orig_nbformat_minor !== undefined && data.nbformat_minor !== data.orig_nbformat_minor) {
var that = this;
var orig_vs = 'v' + data.nbformat + '.' + data.orig_nbformat_minor;
var this_vs = 'v' + data.nbformat + '.' + this.nbformat_minor;
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var msg = "This notebook is version " + orig_vs + ", but we only fully support up to " +
MinRK
add dialog when loading newer minor-version notebooks
r7546 this_vs + ". You can still work with this notebook, but some features " +
"introduced in later notebook versions may not be available."
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839
MinRK
bootstrap dialogs
r10895 IPython.dialog.modal({
title : "Newer Notebook",
body : msg,
MinRK
add dialog when loading newer minor-version notebooks
r7546 buttons : {
MinRK
bootstrap dialogs
r10895 OK : {
class : "btn-danger"
MinRK
add dialog when loading newer minor-version notebooks
r7546 }
MinRK
bootstrap dialogs
r10895 }
MinRK
add dialog when loading newer minor-version notebooks
r7546 });
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 }
MinRK
add Revert to the menu bar
r10503
Brian Granger
Fixed order of notebook loading and kernel starting....
r7197 // Create the kernel after the notebook is completely loaded to prevent
// code execution upon loading, which is a security risk.
MinRK
remove notebook read-only view...
r11644 this.start_kernel();
// load our checkpoint list
IPython.notebook.list_checkpoints();
Brian Granger
Major refactoring of saving, notification....
r6047 $([IPython.events]).trigger('notebook_loaded.Notebook');
Brian E. Granger
Massive work on the notebook document format....
r4484 };
David Wyde
Add YUIDoc in notebook.js.
r10033 /**
* Failure callback for loading a notebook from the server.
*
* @method load_notebook_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} textStatus Description of response status
* @param {String} errorThrow HTTP error message
*/
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 Notebook.prototype.load_notebook_error = function (xhr, textStatus, errorThrow) {
MinRK
better message when notebook format is not supported...
r11643 if (xhr.status === 400) {
var msg = errorThrow;
} else if (xhr.status === 500) {
var msg = "An unknown error occurred while loading this notebook. " +
"This version can load notebook formats " +
"v" + this.nbformat + " or earlier.";
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 }
MinRK
better message when notebook format is not supported...
r11643 IPython.dialog.modal({
title: "Error loading notebook",
body : msg,
buttons : {
"OK": {}
}
});
Brian Granger
Proper error handling for nbformat versions in client code....
r6061 }
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839
MinRK
expose notebook checkpoints in html/js...
r10501 /********************* checkpoint-related *********************/
/**
* Save the notebook then immediately create a checkpoint.
*
* @method save_checkpoint
*/
Notebook.prototype.save_checkpoint = function () {
this._checkpoint_after_save = true;
this.save_notebook();
};
/**
MinRK
minor checkpoint cleanup...
r12050 * Add a checkpoint for this notebook.
* for use as a callback from checkpoint creation.
*
* @method add_checkpoint
*/
Notebook.prototype.add_checkpoint = function (checkpoint) {
var found = false;
for (var i = 0; i < this.checkpoints.length; i++) {
var existing = this.checkpoints[i];
if (existing.checkpoint_id == checkpoint.checkpoint_id) {
found = true;
this.checkpoints[i] = checkpoint;
break;
}
}
if (!found) {
this.checkpoints.push(checkpoint);
}
this.last_checkpoint = this.checkpoints[this.checkpoints.length - 1];
};
/**
MinRK
expose notebook checkpoints in html/js...
r10501 * List checkpoints for this notebook.
*
MinRK
minor checkpoint cleanup...
r12050 * @method list_checkpoints
MinRK
expose notebook checkpoints in html/js...
r10501 */
Notebook.prototype.list_checkpoints = function () {
var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints';
$.get(url).done(
$.proxy(this.list_checkpoints_success, this)
).fail(
$.proxy(this.list_checkpoints_error, this)
);
};
/**
* Success callback for listing checkpoints.
*
* @method list_checkpoint_success
* @param {Object} data JSON representation of a checkpoint
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
Notebook.prototype.list_checkpoints_success = function (data, status, xhr) {
var data = $.parseJSON(data);
MinRK
minor checkpoint cleanup...
r12050 this.checkpoints = data;
MinRK
expose notebook checkpoints in html/js...
r10501 if (data.length) {
MinRK
minor checkpoint cleanup...
r12050 this.last_checkpoint = data[data.length - 1];
MinRK
expose notebook checkpoints in html/js...
r10501 } else {
this.last_checkpoint = null;
}
MinRK
restore checkpoints in a sub-list...
r10520 $([IPython.events]).trigger('checkpoints_listed.Notebook', [data]);
MinRK
expose notebook checkpoints in html/js...
r10501 };
/**
* Failure callback for listing a checkpoint.
*
* @method list_checkpoint_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
*/
Notebook.prototype.list_checkpoints_error = function (xhr, status, error_msg) {
$([IPython.events]).trigger('list_checkpoints_failed.Notebook');
};
/**
* Create a checkpoint of this notebook on the server from the most recent save.
*
* @method create_checkpoint
*/
Notebook.prototype.create_checkpoint = function () {
var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints';
$.post(url).done(
$.proxy(this.create_checkpoint_success, this)
).fail(
$.proxy(this.create_checkpoint_error, this)
);
};
/**
* Success callback for creating a checkpoint.
*
* @method create_checkpoint_success
* @param {Object} data JSON representation of a checkpoint
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
Notebook.prototype.create_checkpoint_success = function (data, status, xhr) {
var data = $.parseJSON(data);
MinRK
minor checkpoint cleanup...
r12050 this.add_checkpoint(data);
MinRK
expose notebook checkpoints in html/js...
r10501 $([IPython.events]).trigger('checkpoint_created.Notebook', data);
};
/**
* Failure callback for creating a checkpoint.
*
* @method create_checkpoint_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
*/
Notebook.prototype.create_checkpoint_error = function (xhr, status, error_msg) {
$([IPython.events]).trigger('checkpoint_failed.Notebook');
};
MinRK
restore checkpoints in a sub-list...
r10520 Notebook.prototype.restore_checkpoint_dialog = function (checkpoint) {
MinRK
expose notebook checkpoints in html/js...
r10501 var that = this;
MinRK
restore checkpoints in a sub-list...
r10520 var checkpoint = checkpoint || this.last_checkpoint;
MinRK
expose notebook checkpoints in html/js...
r10501 if ( ! checkpoint ) {
console.log("restore dialog, but no checkpoint to restore to!");
return;
}
MinRK
bootstrap dialogs
r10895 var body = $('<div/>').append(
MinRK
restore checkpoints in a sub-list...
r10520 $('<p/>').addClass("p-space").text(
"Are you sure you want to revert the notebook to " +
MinRK
expose notebook checkpoints in html/js...
r10501 "the latest checkpoint?"
).append(
$("<strong/>").text(
" This cannot be undone."
)
)
).append(
MinRK
restore checkpoints in a sub-list...
r10520 $('<p/>').addClass("p-space").text("The checkpoint was last updated at:")
MinRK
expose notebook checkpoints in html/js...
r10501 ).append(
MinRK
restore checkpoints in a sub-list...
r10520 $('<p/>').addClass("p-space").text(
Date(checkpoint.last_modified)
).css("text-align", "center")
MinRK
expose notebook checkpoints in html/js...
r10501 );
MinRK
bootstrap dialogs
r10895 IPython.dialog.modal({
title : "Revert notebook to checkpoint",
body : body,
MinRK
expose notebook checkpoints in html/js...
r10501 buttons : {
MinRK
bootstrap dialogs
r10895 Revert : {
class : "btn-danger",
click : function () {
that.restore_checkpoint(checkpoint.checkpoint_id);
}
MinRK
expose notebook checkpoints in html/js...
r10501 },
MinRK
bootstrap dialogs
r10895 Cancel : {}
MinRK
expose notebook checkpoints in html/js...
r10501 }
});
}
/**
* Restore the notebook to a checkpoint state.
*
* @method restore_checkpoint
* @param {String} checkpoint ID
*/
Notebook.prototype.restore_checkpoint = function (checkpoint) {
Matthias BUSSONNIER
fix event names
r11226 $([IPython.events]).trigger('checkpoint_restoring.Notebook', checkpoint);
MinRK
expose notebook checkpoints in html/js...
r10501 var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint;
$.post(url).done(
$.proxy(this.restore_checkpoint_success, this)
).fail(
$.proxy(this.restore_checkpoint_error, this)
);
};
/**
* Success callback for restoring a notebook to a checkpoint.
*
* @method restore_checkpoint_success
* @param {Object} data (ignored, should be empty)
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
Notebook.prototype.restore_checkpoint_success = function (data, status, xhr) {
$([IPython.events]).trigger('checkpoint_restored.Notebook');
this.load_notebook(this.notebook_id);
};
/**
* Failure callback for restoring a notebook to a checkpoint.
*
* @method restore_checkpoint_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
*/
Notebook.prototype.restore_checkpoint_error = function (xhr, status, error_msg) {
$([IPython.events]).trigger('checkpoint_restore_failed.Notebook');
};
/**
* Delete a notebook checkpoint.
*
* @method delete_checkpoint
* @param {String} checkpoint ID
*/
Notebook.prototype.delete_checkpoint = function (checkpoint) {
Matthias BUSSONNIER
fix event names
r11226 $([IPython.events]).trigger('checkpoint_deleting.Notebook', checkpoint);
MinRK
expose notebook checkpoints in html/js...
r10501 var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint;
$.ajax(url, {
type: 'DELETE',
success: $.proxy(this.delete_checkpoint_success, this),
error: $.proxy(this.delete_notebook_error,this)
});
};
/**
* Success callback for deleting a notebook checkpoint
*
* @method delete_checkpoint_success
* @param {Object} data (ignored, should be empty)
* @param {String} status Description of response status
* @param {jqXHR} xhr jQuery Ajax object
*/
Notebook.prototype.delete_checkpoint_success = function (data, status, xhr) {
$([IPython.events]).trigger('checkpoint_deleted.Notebook', data);
this.load_notebook(this.notebook_id);
};
/**
* Failure callback for deleting a notebook checkpoint.
*
* @method delete_checkpoint_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
*/
Notebook.prototype.delete_checkpoint_error = function (xhr, status, error_msg) {
$([IPython.events]).trigger('checkpoint_delete_failed.Notebook');
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 IPython.Notebook = Notebook;
Brian E. Granger
Further work updating JS URL scheme to use data-base-project-url.
r5108
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return IPython;
}(IPython));
Brian Granger
Basic notebook saving and loading....
r4315