##// END OF EJS Templates
Updating cell logic....
Updating cell logic. * Added placeholder to the base Cell class. * Removed the \u0000 char at the beginning of the TextCell placeholder that was there for a CodeMirror bug workaround. * Other refactoring of Cell related Notebook methods.

File last commit:

r5944:5281dc61
r5944:5281dc61
Show More
notebook.js
1186 lines | 41.2 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) {
Brian E. Granger
Initial payload handling....
r4356 var utils = IPython.utils;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var Notebook = function (selector) {
MinRK
move read_only flag to page-level...
r5213 this.read_only = IPython.read_only;
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;
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 this.paste_enabled = false;
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = false;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.msg_cell_map = {};
Brian E. Granger
Implemented metadata for notebook format.
r4637 this.metadata = {};
Brian E. Granger
Adding keyboard shortcuts.
r4645 this.control_key_active = false;
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();
Matthias BUSSONNIER
Improve tooltip tringgering,make it configurable...
r5399 this.set_tooltipontab(true);
Matthias BUSSONNIER
smart kwarg completion...
r5401 this.set_smartcompleter(true);
Matthias BUSSONNIER
Make the time before activating a tooltip configurable...
r5400 this.set_timebeforetooltip(1200);
Brian Granger
Implemented menu based UI using Wijmo.
r5857 this.set_autoindent(true);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
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 };
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;
Fernando Perez
Match the max tooltip and bottom area sizes in the notebook....
r5490 var end_space = $('<div class="end_space"></div>').height("30%");
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 end_space.dblclick(function (e) {
MinRK
add read-only view for notebooks...
r5200 if (that.read_only) return;
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 var ncells = that.ncells();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 that.insert_code_cell_below(ncells-1);
Brian E. Granger
Double clicking on the end space will insert a new cell.
r4628 });
Brian E. Granger
Don't scroll to bottom when last cell is selected.
r4604 this.element.append(end_space);
Brian E. Granger
Improving the scrolling model.
r4364 $('div#notebook').addClass('border-box-sizing');
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.bind_events = function () {
var that = this;
$(document).keydown(function (event) {
Brian E. Granger
Fixing console.log messages related to keyboard shortcuts.
r4647 // console.log(event);
MinRK
don't swallow regular key events in read-only mode
r5546 if (that.read_only) return true;
Matthias BUSSONNIER
Intercept <esc> avoid closing websocket on Firefox...
r5389 if (event.which === 27) {
// Intercept escape at highest level to avoid closing
// websocket connection with firefox
event.preventDefault();
}
Thomas Kluyver
Notebook: don't change cell when selecting code using shift+up/down....
r5418 if (event.which === 38 && !event.shiftKey) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var cell = that.selected_cell();
if (cell.at_top()) {
event.preventDefault();
that.select_prev();
};
Thomas Kluyver
Notebook: don't change cell when selecting code using shift+up/down....
r5418 } else if (event.which === 40 && !event.shiftKey) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var cell = that.selected_cell();
if (cell.at_bottom()) {
event.preventDefault();
that.select_next();
};
} else if (event.which === 13 && 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;
Brian E. Granger
CTRL-ENTER now runs a cell in "terminal mode"...
r4390 } else if (event.which === 13 && 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 E. Granger
Adding keyboard shortcuts.
r4645 } else if (event.which === 77 && event.ctrlKey) {
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) {
// Paste selected cell = v
that.paste_cell();
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
that.insert_code_cell_above();
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
that.insert_code_cell_below();
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;
} else if (event.which === 84 && that.control_key_active) {
// Toggle output = t
that.toggle_output();
that.control_key_active = false;
return false;
} else if (event.which === 83 && that.control_key_active) {
// Save notebook = s
IPython.save_widget.save_notebook();
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
IPython.notebook.kernel.interrupt();
that.control_key_active = false;
return false;
} else if (event.which === 190 && that.control_key_active) {
// Restart kernel = . # matches qt console
Fernando Perez
Clean up accidentally introduced hard tabs in JS code.
r5025 IPython.notebook.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;
Brian Granger
Add Ace editing mode for code cells.
r5904 } else if (event.which === 69 && that.control_key_active) {
// Edit in Ace = e
IPython.fulledit_widget.toggle();
that.control_key_active = false;
return false;
Brian E. Granger
Adding keyboard shortcuts.
r4645 } else if (that.control_key_active) {
that.control_key_active = false;
return true;
Brian Granger
Much improved nagivation for the notebook cells....
r4334 };
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 });
Brian E. Granger
Pager is working again.
r4361
this.element.bind('collapse_pager', function () {
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 var app_height = $('div#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;
Brian E. Granger
Pager is working again.
r4361 that.element.animate({height : new_height + 'px'}, 'fast');
});
this.element.bind('expand_pager', function () {
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 var app_height = $('div#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);
Brian E. Granger
More accuract height calculations for the pager collapse/expand.
r4362 var new_height = app_height - pager_height - splitter_height;
Brian E. Granger
Pager is working again.
r4361 that.element.animate({height : new_height + 'px'}, 'fast');
});
Brian E. Granger
Left panel is now working.
r4363
Brian E. Granger
Disabling auto-save at exit.
r4542 $(window).bind('beforeunload', function () {
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
add read-only view for notebooks...
r5200 if (that.dirty && ! that.read_only) {
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 return "You have unsaved changes that will be lost if you leave this page.";
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;
Brian E. Granger
Disabling auto-save at exit.
r4542 });
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
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 };
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488
Notebook.prototype.scroll_to_top = function () {
this.element.animate({scrollTop:0}, 0);
};
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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.cell_elements = function () {
return this.element.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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.ncells = function (cell) {
return this.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
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.
Notebook.prototype.cells = function () {
return this.cell_elements().toArray().map(function (e) {
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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.find_cell_index = function (cell) {
var result = null;
this.cell_elements().filter(function (index) {
if ($(this).data("cell") === cell) {
result = index;
};
});
return result;
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
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;
if (index === undefined) {
i = this.selected_index();
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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.select = function (index) {
if (index !== undefined && index >= 0 && index < this.ncells()) {
if (this.selected_index() !== null) {
this.selected_cell().unselect();
};
this.cells()[index].select();
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
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 Notebook.prototype.select_next = function () {
var index = this.selected_index();
if (index !== null && index >= 0 && (index+1) < this.ncells()) {
this.select(index+1);
};
return this;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.select_prev = function () {
var index = this.selected_index();
if (index !== null && index >= 0 && (index-1) < this.ncells()) {
this.select(index-1);
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 return this;
};
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.selected_index = function () {
var result = null;
this.cell_elements().filter(function (index) {
if ($(this).data("cell").selected === true) {
result = index;
};
});
return result;
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.cell_for_msg = function (msg_id) {
var cell_id = this.msg_cell_map[msg_id];
var result = null;
this.cell_elements().filter(function (index) {
cell = $(this).data("cell");
if (cell.cell_id === cell_id) {
result = cell;
};
});
return result;
};
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.selected_cell = function () {
return this.cell_elements().eq(this.selected_index()).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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Cell insertion, deletion and moving.
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.delete_cell = function (index) {
Brian Granger
Cell splitting and merging is done!
r5898 var i = this.index_or_selected(index);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if (i !== null && i >= 0 && i < this.ncells()) {
this.cell_elements().eq(i).remove();
if (i === (this.ncells())) {
this.select(i-1);
} else {
this.select(i);
};
};
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 return this;
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.append_cell = function (cell) {
Brian E. Granger
Improving the scrolling model.
r4364 this.element.find('div.end_space').before(cell.element);
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 return this;
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_cell_below = function (cell, index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var ncells = this.ncells();
if (ncells === 0) {
this.append_cell(cell);
return this;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if (index >= 0 && index < ncells) {
this.cell_elements().eq(index).after(cell.element);
};
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
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
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_cell_above = function (cell, index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var ncells = this.ncells();
if (ncells === 0) {
this.append_cell(cell);
return this;
};
if (index >= 0 && index < ncells) {
this.cell_elements().eq(index).before(cell.element);
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
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
Notebook.prototype.move_cell_up = function (index) {
var i = index || this.selected_index();
if (i !== null && i < this.ncells() && i > 0) {
var pivot = this.cell_elements().eq(i-1);
var tomove = this.cell_elements().eq(i);
if (pivot !== null && tomove !== null) {
tomove.detach();
pivot.before(tomove);
this.select(i-1);
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
};
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
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
Notebook.prototype.move_cell_down = function (index) {
var i = index || this.selected_index();
if (i !== null && i < (this.ncells()-1) && i >= 0) {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 var pivot = this.cell_elements().eq(i+1);
var tomove = this.cell_elements().eq(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);
};
};
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
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
Notebook.prototype.sort_cells = function () {
var ncells = this.ncells();
var sindex = this.selected_index();
var swapped;
do {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 swapped = false;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 for (var i=1; i<ncells; i++) {
current = this.cell_elements().eq(i).data("cell");
previous = this.cell_elements().eq(i-1).data("cell");
if (previous.input_prompt_number > current.input_prompt_number) {
this.move_cell_up(i);
swapped = true;
};
};
} while (swapped);
this.select(sindex);
return this;
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292 };
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_code_cell_above = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // TODO: Bounds check for i
var i = this.index_or_selected(index);
var cell = new IPython.CodeCell(this);
Brian E. Granger
Removing default input prompt number....
r4391 cell.set_input_prompt();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_above(cell, i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.select(this.find_cell_index(cell));
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_code_cell_below = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // TODO: Bounds check for i
var i = this.index_or_selected(index);
var cell = new IPython.CodeCell(this);
Brian E. Granger
Removing default input prompt number....
r4391 cell.set_input_prompt();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_below(cell, i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.select(this.find_cell_index(cell));
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial draft of HTML5/JS/CSS3 notebook.
r4292
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_html_cell_above = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // TODO: Bounds check for i
var i = this.index_or_selected(index);
Brian E. Granger
New HTMl cell working with CodeMirror editing.
r4499 var cell = new IPython.HTMLCell(this);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 cell.config_mathjax();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_above(cell, i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.select(this.find_cell_index(cell));
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_html_cell_below = function (index) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // TODO: Bounds check for i
var i = this.index_or_selected(index);
Brian E. Granger
New HTMl cell working with CodeMirror editing.
r4499 var cell = new IPython.HTMLCell(this);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 cell.config_mathjax();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_below(cell, i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.select(this.find_cell_index(cell));
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_markdown_cell_above = function (index) {
Brian E. Granger
Starting work on a Markdown cell.
r4507 // TODO: Bounds check for i
var i = this.index_or_selected(index);
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 var cell = new IPython.MarkdownCell(this);
Brian E. Granger
Starting work on a Markdown cell.
r4507 cell.config_mathjax();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_above(cell, i);
Brian E. Granger
Starting work on a Markdown cell.
r4507 this.select(this.find_cell_index(cell));
return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Starting work on a Markdown cell.
r4507
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 Notebook.prototype.insert_markdown_cell_below = function (index) {
Brian E. Granger
Starting work on a Markdown cell.
r4507 // TODO: Bounds check for i
var i = this.index_or_selected(index);
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 var cell = new IPython.MarkdownCell(this);
Brian E. Granger
Starting work on a Markdown cell.
r4507 cell.config_mathjax();
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_cell_below(cell, i);
Brian E. Granger
Starting work on a Markdown cell.
r4507 this.select(this.find_cell_index(cell));
return cell;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
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 // TODO: Bounds check for i
var i = this.index_or_selected(index);
var source_element = this.cell_elements().eq(i);
var source_cell = source_element.data("cell");
Brian Granger
Updating cell logic....
r5944 if (!(source_cell instanceof IPython.CodeCell)) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_code_cell_below(i);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var target_cell = this.cells()[i+1];
Brian Granger
Work on the base Cell API....
r5943 var text = source_cell.get_text();
Brian Granger
Fixing bugs that have shown up since updating CM to 2.2.
r5942 if (text === source_cell.placeholder) {
text = '';
}
Brian Granger
Work on the base Cell API....
r5943 target_cell.set_text(text);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 source_element.remove();
Brian E. Granger
Code cell gets focused after "To Code" is triggered.
r4557 target_cell.select();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Initial reply handling implemented along with css fixes.
r4299
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
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 // TODO: Bounds check for i
var i = this.index_or_selected(index);
var source_element = this.cell_elements().eq(i);
var source_cell = source_element.data("cell");
Brian E. Granger
Starting work on a Markdown cell.
r4507 var target_cell = null;
Brian Granger
Updating cell logic....
r5944 if (!(source_cell instanceof IPython.MarkdownCell)) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_markdown_cell_below(i);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 target_cell = this.cells()[i+1];
Brian Granger
Work on the base Cell API....
r5943 var text = source_cell.get_text();
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 if (text === source_cell.placeholder) {
text = target_cell.placeholder;
Brian Granger
Updating cell logic....
r5944 };
if (target_cell !== null) {
if (text === "") {text = target_cell.placeholder;};
// The edit must come before the set_text.
target_cell.edit();
target_cell.set_text(text);
source_element.remove();
target_cell.select();
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 }
Brian Granger
Updating cell logic....
r5944 this.dirty = true;
};
Brian E. Granger
Starting work on a Markdown cell.
r4507 };
Notebook.prototype.to_html = function (index) {
// TODO: Bounds check for i
var i = this.index_or_selected(index);
var source_element = this.cell_elements().eq(i);
var source_cell = source_element.data("cell");
var target_cell = null;
Brian Granger
Updating cell logic....
r5944 if (!(source_cell instanceof IPython.HTMLCell)) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_html_cell_below(i);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 target_cell = this.cells()[i+1];
Brian Granger
Work on the base Cell API....
r5943 var text = source_cell.get_text();
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 if (text === source_cell.placeholder) {
text = target_cell.placeholder;
Brian Granger
Updating cell logic....
r5944 };
if (target_cell !== null) {
if (text === "") {text = target_cell.placeholder;};
// The edit must come before the set_text.
target_cell.edit();
target_cell.set_text(text);
source_element.remove();
target_cell.select();
Brian Granger
Refactoring of text/markdown/rst/html cells.
r4508 }
Brian Granger
Updating cell logic....
r5944 this.dirty = true;
};
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian Granger
More of the initial split cell capability.
r5897 // Copy/Paste/Merge/Split
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) {
$('#paste_cell').removeClass('ui-state-disabled')
.on('click', function () {that.paste_cell();});
$('#paste_cell_above').removeClass('ui-state-disabled')
.on('click', function () {that.paste_cell_above();});
$('#paste_cell_below').removeClass('ui-state-disabled')
.on('click', function () {that.paste_cell_below();});
this.paste_enabled = true;
};
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) {
$('#paste_cell').addClass('ui-state-disabled').off('click');
$('#paste_cell_above').addClass('ui-state-disabled').off('click');
$('#paste_cell_below').addClass('ui-state-disabled').off('click');
this.paste_enabled = false;
};
Brian Granger
Added cell level cut/copy/paste.
r5879 };
Notebook.prototype.cut_cell = function () {
this.copy_cell();
this.delete_cell();
}
Notebook.prototype.copy_cell = function () {
var cell = this.selected_cell();
this.clipboard = cell.toJSON();
this.enable_paste();
};
Notebook.prototype.paste_cell = 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;
if (cell_data.cell_type == 'code') {
new_cell = this.insert_code_cell_above();
} else if (cell_data.cell_type === 'html') {
new_cell = this.insert_html_cell_above();
} else if (cell_data.cell_type === 'markdown') {
new_cell = this.insert_markdown_cell_above();
};
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 this.select_next();
this.delete_cell();
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;
if (cell_data.cell_type == 'code') {
new_cell = this.insert_code_cell_above();
} else if (cell_data.cell_type === 'html') {
new_cell = this.insert_html_cell_above();
} else if (cell_data.cell_type === 'markdown') {
new_cell = this.insert_markdown_cell_above();
};
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
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;
if (cell_data.cell_type == 'code') {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 new_cell = this.insert_code_cell_below();
Brian Granger
Added cell level cut/copy/paste.
r5879 } else if (cell_data.cell_type === 'html') {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 new_cell = this.insert_html_cell_below();
Brian Granger
Added cell level cut/copy/paste.
r5879 } else if (cell_data.cell_type === 'markdown') {
Brian Granger
Minor, but important fixes to cut/copy/paste....
r5912 new_cell = this.insert_markdown_cell_below();
Brian Granger
Added cell level cut/copy/paste.
r5879 };
Brian Granger
Updating cell logic....
r5944 new_cell.fromJSON(cell_data);
Brian Granger
Added cell level cut/copy/paste.
r5879 };
};
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
More of the initial split cell capability.
r5897 var cell = this.selected_cell();
if (cell instanceof IPython.CodeCell) {
var cursor = cell.code_mirror.getCursor();
var last_line_num = cell.code_mirror.lineCount()-1;
var last_line_len = cell.code_mirror.getLine(last_line_num).length;
var end = {line:last_line_num, ch:last_line_len}
var texta = cell.code_mirror.getRange({line:0,ch:0}, cursor);
var textb = cell.code_mirror.getRange(cursor, end);
texta = texta.replace(/^\n+/, '').replace(/\n+$/, '');
textb = textb.replace(/^\n+/, '').replace(/\n+$/, '');
Brian Granger
Work on the base Cell API....
r5943 cell.set_text(texta);
Brian Granger
More of the initial split cell capability.
r5897 var new_cell = this.insert_code_cell_below();
Brian Granger
Work on the base Cell API....
r5943 new_cell.set_text(textb);
Brian Granger
More of the initial split cell capability.
r5897 };
};
Brian Granger
Cell splitting and merging is done!
r5898
Notebook.prototype.merge_cell_above = function () {
// Todo: implement merging for other cell types.
var cell = this.selected_cell();
var index = this.selected_index();
if (index > 0) {
upper_cell = this.cells()[index-1];
lower_cell = this.cells()[index];
if (upper_cell instanceof IPython.CodeCell && lower_cell instanceof IPython.CodeCell) {
Brian Granger
Work on the base Cell API....
r5943 upper_text = upper_cell.get_text();
lower_text = lower_cell.get_text();
lower_cell.set_text(upper_text+'\n'+lower_text);
Brian Granger
Cell splitting and merging is done!
r5898 this.delete_cell(index-1);
};
};
};
Notebook.prototype.merge_cell_below = function () {
// Todo: implement merging for other cell types.
var cell = this.selected_cell();
var index = this.selected_index();
if (index < this.ncells()-1) {
upper_cell = this.cells()[index];
lower_cell = this.cells()[index+1];
if (upper_cell instanceof IPython.CodeCell && lower_cell instanceof IPython.CodeCell) {
Brian Granger
Work on the base Cell API....
r5943 upper_text = upper_cell.get_text();
lower_text = lower_cell.get_text();
upper_cell.set_text(upper_text+'\n'+lower_text);
Brian Granger
Cell splitting and merging is done!
r5898 this.delete_cell(index+1);
};
};
};
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
Notebook.prototype.collapse = function (index) {
var i = this.index_or_selected(index);
this.cells()[i].collapse();
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian Granger
Initial reply handling implemented along with css fixes.
r4299 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.expand = function (index) {
var i = this.index_or_selected(index);
this.cells()[i].expand();
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Basic notebook saving and loading....
r4315
Brian E. Granger
Cell collapse/expand is not called "Toggle".
r4639 Notebook.prototype.toggle_output = function (index) {
var i = this.index_or_selected(index);
this.cells()[i].toggle_output();
this.dirty = true;
};
Matthias BUSSONNIER
Make the time before activating a tooltip configurable...
r5400 Notebook.prototype.set_timebeforetooltip = function (time) {
this.time_before_tooltip = time;
};
Matthias BUSSONNIER
Improve tooltip tringgering,make it configurable...
r5399 Notebook.prototype.set_tooltipontab = function (state) {
this.tooltip_on_tab = state;
};
Matthias BUSSONNIER
smart kwarg completion...
r5401 Notebook.prototype.set_smartcompleter = function (state) {
this.smart_completer = state;
};
Brian E. Granger
Implemented smart autoindenting.
r4512 Notebook.prototype.set_autoindent = function (state) {
var cells = this.cells();
len = cells.length;
for (var i=0; i<len; i++) {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 cells[i].set_autoindent(state);
Brian E. Granger
Implemented smart autoindenting.
r4512 };
};
Brian E. Granger
Clear all output is implemented.
r4543
Notebook.prototype.clear_all_output = function () {
var ncells = this.ncells();
var cells = this.cells();
for (var i=0; i<ncells; i++) {
if (cells[i] instanceof IPython.CodeCell) {
MinRK
add channel-selection to clear_output...
r5085 cells[i].clear_output(true,true,true);
Brian E. Granger
Clear all output is implemented.
r4543 }
};
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
Clear all output is implemented.
r4543 };
Fernando Perez
Refactor line num. toggle into proper function, access via C-m-l....
r5020 // Other cell functions: line numbers, ...
Notebook.prototype.cell_toggle_line_numbers = function() {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 this.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
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Notebook.prototype.start_kernel = function () {
this.kernel = new IPython.Kernel();
Brian E. Granger
Adding kernel/notebook associations.
r4494 var notebook_id = IPython.save_widget.get_notebook_id();
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.kernel.start(notebook_id, $.proxy(this.kernel_started, this));
};
Notebook.prototype.restart_kernel = function () {
Fernando Perez
Clean up accidentally introduced hard tabs in JS code.
r5025 var that = this;
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 var notebook_id = IPython.save_widget.get_notebook_id();
Fernando Perez
Add confirmation dialog to kernel restart action.
r5021
var dialog = $('<div/>');
dialog.html('Do you want to restart the current kernel? You will lose all variables defined in it.');
$(document).append(dialog);
dialog.dialog({
resizable: false,
modal: true,
title: "Restart kernel or continue running?",
Brian Granger
Cleaning up menu code....
r5858 closeText: '',
Fernando Perez
Add confirmation dialog to kernel restart action.
r5021 buttons : {
"Restart": function () {
Fernando Perez
Clean up accidentally introduced hard tabs in JS code.
r5025 that.kernel.restart($.proxy(that.kernel_started, that));
Fernando Perez
Add confirmation dialog to kernel restart action.
r5021 $(this).dialog('close');
},
"Continue running": function () {
$(this).dialog('close');
}
}
});
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 };
Notebook.prototype.kernel_started = function () {
console.log("Kernel started: ", this.kernel.kernel_id);
this.kernel.shell_channel.onmessage = $.proxy(this.handle_shell_reply,this);
this.kernel.iopub_channel.onmessage = $.proxy(this.handle_iopub_reply,this);
Brian Granger
Basic notebook saving and loading....
r4315 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353 Notebook.prototype.handle_shell_reply = function (e) {
reply = $.parseJSON(e.data);
Brian E. Granger
Initial payload handling....
r4356 var header = reply.header;
var content = reply.content;
var msg_type = header.msg_type;
Brian E. Granger
Initial draft of panel section and the cell section working.
r4365 // console.log(reply);
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353 var cell = this.cell_for_msg(reply.parent_header.msg_id);
if (msg_type === "execute_reply") {
Brian E. Granger
Initial payload handling....
r4356 cell.set_input_prompt(content.execution_count);
MinRK
add 'running' class to running code cells...
r5221 cell.element.removeClass("running");
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian Granger
Added complete method of JS kernel object.
r4388 } else if (msg_type === "complete_reply") {
Brian E. Granger
Autocompletion working with CTRL-SPACE.
r4389 cell.finish_completing(content.matched_text, content.matches);
Matthias BUSSONNIER
Add Tootip to notebook....
r5397 } else if (msg_type === "object_info_reply"){
//console.log('back from object_info_request : ')
rep = reply.content;
if(rep.found)
{
Matthias BUSSONNIER
add 'more...' and 'close' button to the pager...
r5404 cell.finish_tooltip(rep);
Matthias BUSSONNIER
Add Tootip to notebook....
r5397 }
} else {
//console.log("unknown reply:"+msg_type);
}
// when having a rely from object_info_reply,
// no payload so no nned to handle it
if(typeof(content.payload)!='undefined') {
var payload = content.payload || [];
this.handle_payload(cell, payload);
}
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
%loadpy works in the notebook and bug with inline plotting fixed.
r4530 Notebook.prototype.handle_payload = function (cell, payload) {
Brian E. Granger
Initial payload handling....
r4356 var l = payload.length;
for (var i=0; i<l; i++) {
Brian E. Granger
%loadpy works in the notebook and bug with inline plotting fixed.
r4530 if (payload[i].source === 'IPython.zmq.page.page') {
Brian E. Granger
Pager is not activated if the pager text is empty....
r4560 if (payload[i].text.trim() !== '') {
IPython.pager.clear();
IPython.pager.expand();
IPython.pager.append_text(payload[i].text);
}
Brian E. Granger
%loadpy works in the notebook and bug with inline plotting fixed.
r4530 } else if (payload[i].source === 'IPython.zmq.zmqshell.ZMQInteractiveShell.set_next_input') {
var index = this.find_cell_index(cell);
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 var new_cell = this.insert_code_cell_below(index);
Brian Granger
Work on the base Cell API....
r5943 new_cell.set_text(payload[i].text);
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
%loadpy works in the notebook and bug with inline plotting fixed.
r4530 }
Brian E. Granger
Initial payload handling....
r4356 };
};
Brian E. Granger
Refactoring pager into its own class.
r4357
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353 Notebook.prototype.handle_iopub_reply = function (e) {
reply = $.parseJSON(e.data);
var content = reply.content;
// console.log(reply);
var msg_type = reply.header.msg_type;
var cell = this.cell_for_msg(reply.parent_header.msg_id);
MinRK
fix IOPub parent checking in notebook...
r5777 if (msg_type !== 'status' && !cell){
// message not from this notebook, but should be attached to a cell
MinRK
explicitly ignore iopub messages not associated with a cell in the notebook...
r5363 console.log("Received IOPub message not caused by one of my cells");
MinRK
fix IOPub parent checking in notebook...
r5777 console.log(reply);
MinRK
explicitly ignore iopub messages not associated with a cell in the notebook...
r5363 return;
}
Brian E. Granger
Added saving and loading of output of all types.
r4497 var output_types = ['stream','display_data','pyout','pyerr'];
if (output_types.indexOf(msg_type) >= 0) {
this.handle_output(cell, msg_type, content);
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 } else if (msg_type === 'status') {
if (content.execution_state === 'busy') {
Brian E. Granger
Work on save widget, kernel status widget and notebook section.
r4372 IPython.kernel_status_widget.status_busy();
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 } else if (content.execution_state === 'idle') {
Brian E. Granger
Work on save widget, kernel status widget and notebook section.
r4372 IPython.kernel_status_widget.status_idle();
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 } else if (content.execution_state === 'dead') {
this.handle_status_dead();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Adding clear_output to kernel and HTML notebook.
r5080 } else if (msg_type === 'clear_output') {
MinRK
add channel-selection to clear_output...
r5085 cell.clear_output(content.stdout, content.stderr, content.other);
Brian Granger
Adding clear_output to kernel and HTML notebook.
r5080 };
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
Using $.proxy to clean up callbacks.
r4353
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 Notebook.prototype.handle_status_dead = function () {
var that = this;
this.kernel.stop_channels();
var dialog = $('<div/>');
dialog.html('The kernel has died, would you like to restart it? If you do not restart the kernel, you will be able to save the notebook, but running code will not work until the notebook is reopened.');
$(document).append(dialog);
dialog.dialog({
resizable: false,
modal: true,
title: "Dead kernel",
buttons : {
Fernando Perez
Change button labels in restart dialog to action words.
r5022 "Restart": function () {
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 that.start_kernel();
$(this).dialog('close');
},
Fernando Perez
Change button labels in restart dialog to action words.
r5022 "Continue running": function () {
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 $(this).dialog('close');
}
}
});
};
Brian E. Granger
Added saving and loading of output of all types.
r4497 Notebook.prototype.handle_output = function (cell, msg_type, content) {
var json = {};
json.output_type = msg_type;
if (msg_type === "stream") {
MinRK
support contiguous stream output in notebook...
r4864 json.text = utils.fixConsole(content.data);
json.stream = content.name;
Brian E. Granger
Added saving and loading of output of all types.
r4497 } else if (msg_type === "display_data") {
json = this.convert_mime_types(json, content.data);
} else if (msg_type === "pyout") {
json.prompt_number = content.execution_count;
json = this.convert_mime_types(json, content.data);
} else if (msg_type === "pyerr") {
json.ename = content.ename;
json.evalue = content.evalue;
Brian E. Granger
Adding tracebacks, evalue and etype to the nbformat and notebook.
r4540 var traceback = [];
for (var i=0; i<content.traceback.length; i++) {
traceback.push(utils.fixConsole(content.traceback[i]));
}
json.traceback = traceback;
Brian E. Granger
Added saving and loading of output of all types.
r4497 };
cell.append_output(json);
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
Added saving and loading of output of all types.
r4497 };
Notebook.prototype.convert_mime_types = function (json, data) {
if (data['text/plain'] !== undefined) {
Brian E. Granger
Adding tracebacks, evalue and etype to the nbformat and notebook.
r4540 json.text = utils.fixConsole(data['text/plain']);
Brian E. Granger
Added saving and loading of output of all types.
r4497 };
if (data['text/html'] !== undefined) {
json.html = data['text/html'];
};
if (data['image/svg+xml'] !== undefined) {
json.svg = data['image/svg+xml'];
};
if (data['image/png'] !== undefined) {
json.png = data['image/png'];
};
Brian E. Granger
Finishing display system work....
r4528 if (data['image/jpeg'] !== undefined) {
json.jpeg = data['image/jpeg'];
};
Brian E. Granger
Added saving and loading of output of all types.
r4497 if (data['text/latex'] !== undefined) {
json.latex = data['text/latex'];
};
if (data['application/json'] !== undefined) {
json.json = data['application/json'];
};
if (data['application/javascript'] !== undefined) {
json.javascript = data['application/javascript'];
}
return json;
};
Brian Granger
Basic notebook saving and loading....
r4315
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
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 default_options = {terminal: false, add_new: true};
$.extend(default_options, options);
Brian E. Granger
Fixing execution related things....
r4378 var that = this;
var cell = that.selected_cell();
var cell_index = that.find_cell_index(cell);
if (cell instanceof IPython.CodeCell) {
MinRK
add channel-selection to clear_output...
r5085 cell.clear_output(true, true, true);
MinRK
set 'In [*]' to indicate pending code cell
r5220 cell.set_input_prompt('*');
MinRK
add 'running' class to running code cells...
r5221 cell.element.addClass("running");
Brian Granger
Work on the base Cell API....
r5943 var code = cell.get_text();
var msg_id = that.kernel.execute(cell.get_text());
Brian E. Granger
Massive work on the notebook document format....
r4484 that.msg_cell_map[msg_id] = cell.cell_id;
Brian E. Granger
New HTMl cell working with CodeMirror editing.
r4499 } else if (cell instanceof IPython.HTMLCell) {
Brian E. Granger
Fixing execution related things....
r4378 cell.render();
}
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) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 that.insert_code_cell_below();
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 };
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = true;
Brian E. Granger
Fixing execution related things....
r4378 };
Notebook.prototype.execute_all_cells = function () {
var ncells = this.ncells();
for (var i=0; i<ncells; i++) {
this.select(i);
Brian E. Granger
Fixes to terminal mode execution (ctrl-enter).
r4394 this.execute_selected_cell({add_new:false});
Brian E. Granger
Fixing execution related things....
r4378 };
this.scroll_to_bottom();
};
Brian E. Granger
Autocompletion working with CTRL-SPACE.
r4389
Matthias BUSSONNIER
Add Tootip to notebook....
r5397 Notebook.prototype.request_tool_tip = function (cell,func) {
Matthias BUSSONNIER
Improve tooltip tringgering,make it configurable...
r5399 // Feel free to shorten this logic if you are better
// than me in regEx
// basicaly you shoul be able to get xxx.xxx.xxx from
// something(range(10), kwarg=smth) ; xxx.xxx.xxx( firstarg, rand(234,23), kwarg1=2,
// remove everything between matchin bracket (need to iterate)
matchBracket = /\([^\(\)]+\)/g;
oldfunc = func;
func = func.replace(matchBracket,"");
while( oldfunc != func )
{
oldfunc = func;
func = func.replace(matchBracket,"");
}
// remove everythin after last open bracket
endBracket = /\([^\(]*$/g;
func = func.replace(endBracket,"");
Matthias BUSSONNIER
Add Tootip to notebook....
r5397 var re = /[a-zA-Z._]+$/g;
Matthias BUSSONNIER
tooltip on <tab>
r5398 var msg_id = this.kernel.object_info_request(re.exec(func));
Matthias BUSSONNIER
handle null objectname on tooltip
r5409 if(typeof(msg_id)!='undefined'){
this.msg_cell_map[msg_id] = cell.cell_id;
}
Matthias BUSSONNIER
Add Tootip to notebook....
r5397 };
Brian E. Granger
Autocompletion working with CTRL-SPACE.
r4389 Notebook.prototype.complete_cell = function (cell, line, cursor_pos) {
var msg_id = this.kernel.complete(line, cursor_pos);
this.msg_cell_map[msg_id] = cell.cell_id;
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 // Persistance and loading
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 E. Granger
Implemented metadata for notebook format.
r4637 // Save the metadata
this.metadata = data.metadata;
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) {
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];
if (cell_data.cell_type == 'code') {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 new_cell = this.insert_code_cell_below();
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 new_cell.fromJSON(cell_data);
Brian E. Granger
New HTMl cell working with CodeMirror editing.
r4499 } else if (cell_data.cell_type === 'html') {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 new_cell = this.insert_html_cell_below();
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 new_cell.fromJSON(cell_data);
Brian E. Granger
Markdown cells are now saved and restored in notebooks.
r4511 } else if (cell_data.cell_type === 'markdown') {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 new_cell = this.insert_markdown_cell_below();
Brian E. Granger
Markdown cells are now saved and restored in notebooks.
r4511 new_cell.fromJSON(cell_data);
Brian E. Granger
Massive work on the notebook document format....
r4484 };
Brian Granger
Added cell level cut/copy/paste.
r5879 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Basic notebook saving and loading....
r4315 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Notebook.prototype.toJSON = function () {
var cells = this.cells();
var ncells = cells.length;
cell_array = new Array(ncells);
for (var i=0; i<ncells; i++) {
cell_array[i] = cells[i].toJSON();
};
Brian E. Granger
Massive work on the notebook document format....
r4484 data = {
// Only handle 1 worksheet for now.
Brian E. Granger
Implemented metadata for notebook format.
r4637 worksheets : [{cells:cell_array}],
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 };
Notebook.prototype.save_notebook = function () {
if (IPython.save_widget.test_notebook_name()) {
var notebook_id = IPython.save_widget.get_notebook_id();
var nbname = IPython.save_widget.get_notebook_name();
// We may want to move the name/id/nbformat logic inside toJSON?
var data = this.toJSON();
Brian E. Granger
Implemented metadata for notebook format.
r4637 data.metadata.name = nbname;
Brian E. Granger
Massive work on the notebook document format....
r4484 data.nbformat = 2;
// We do the call with settings so we can set cache to false.
var settings = {
Brian E. Granger
Improvements to file uploaded, mime types and .py reader....
r4493 processData : false,
cache : false,
type : "PUT",
data : JSON.stringify(data),
headers : {'Content-Type': 'application/json'},
Felix Werner
Notify the user of errors when saving a notebook.
r5007 success : $.proxy(this.notebook_saved,this),
error : $.proxy(this.notebook_save_failed,this)
Brian E. Granger
Massive work on the notebook document format....
r4484 };
IPython.save_widget.status_saving();
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 var url = $('body').data('baseProjectUrl') + 'notebooks/' + notebook_id;
Brian E. Granger
Updating JS URL scheme to use embedded data....
r5106 $.ajax(url, settings);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Basic notebook saving and loading....
r4315 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian E. Granger
Massive work on the notebook document format....
r4484 Notebook.prototype.notebook_saved = function (data, status, xhr) {
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = false;
Felix Werner
Update document title and last_saved_name only after a successful save.
r5006 IPython.save_widget.notebook_saved();
Brian Granger
Improving the save notification....
r5874 IPython.save_widget.status_last_saved();
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
Felix Werner
Notify the user of errors when saving a notebook.
r5007 Notebook.prototype.notebook_save_failed = function (xhr, status, error_msg) {
Brian Granger
Improving the save notification....
r5874 IPython.save_widget.status_save_failed();
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Felix Werner
Notify the user of errors when saving a notebook.
r5007
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 Notebook.prototype.load_notebook = function (callback) {
var that = this;
Brian E. Granger
Massive work on the notebook document format....
r4484 var notebook_id = IPython.save_widget.get_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",
success : function (data, status, xhr) {
that.notebook_loaded(data, status, xhr);
if (callback !== undefined) {
callback();
};
}
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian E. Granger
Massive work on the notebook document format....
r4484 IPython.save_widget.status_loading();
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 var url = $('body').data('baseProjectUrl') + 'notebooks/' + 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
Brian E. Granger
Massive work on the notebook document format....
r4484
Notebook.prototype.notebook_loaded = function (data, status, xhr) {
MinRK
add read-only view for notebooks...
r5200 var allowed = xhr.getResponseHeader('Allow');
Brian E. Granger
Massive work on the notebook document format....
r4484 this.fromJSON(data);
if (this.ncells() === 0) {
Fernando Perez
Fix above/below keybinding mismatch and rename api to use above/below
r4659 this.insert_code_cell_below();
Brian E. Granger
Massive work on the notebook document format....
r4484 };
Brian Granger
Improving the save notification....
r5874 IPython.save_widget.status_last_saved();
Brian E. Granger
Implemented metadata for notebook format.
r4637 IPython.save_widget.set_notebook_name(data.metadata.name);
Brian E. Granger
Added a notebook dirty flag that is used when exiting page.
r4550 this.dirty = false;
MinRK
move read_only flag to page-level...
r5213 if (! this.read_only) {
MinRK
add read-only view for notebooks...
r5200 this.start_kernel();
}
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 // fromJSON always selects the last cell inserted. We need to wait
// until that is done before scrolling to the top.
setTimeout(function () {
IPython.notebook.select(0);
IPython.notebook.scroll_to_top();
}, 50);
Brian E. Granger
Massive work on the notebook document format....
r4484 };
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