##// END OF EJS Templates
refactor to improve cell switching in edit mode...
refactor to improve cell switching in edit mode This code was repeated in both CodeCell and TextCell, both of which are extensions of Cell, so this just unifies the logic in Cell. TextCell had logic here to check if the cell was rendered or not, but I don't believe it is possible to end up triggering such a code path. (Should that be required, I can always just add back these methods to TextCell, performing the .rendered==True check, and calling the Cell prior to this, code mirror at_top would only return true on if the cursor was at the first character of the top line. Now, pressing up arrow on any character on the top line will take you to the cell above. The same applies for the bottom line. Pressing down arrow would only go to the next cell if the cursor was at a location *after* the last character (something that is only possible to achieve in vim mode if the last line is empty, for example). Now, down arrow on any character of the last line will go to the next cell.

File last commit:

r15754:d60e793e
r15754:d60e793e
Show More
codecell.js
559 lines | 19.0 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 E. Granger
Splitting notebook.js into muliple files for development ease.
r4349
//============================================================================
// CodeCell
//============================================================================
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* An extendable module that provide base functionnality to create cell for notebook.
* @module IPython
* @namespace IPython
* @submodule CodeCell
*/
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349
Matthias BUSSONNIER
monkey patch codemirror with new functionality...
r9515
/* local util for codemirror */
MinRK
jshint on codecell
r13210 var posEq = function(a, b) {return a.line == b.line && a.ch == b.ch;};
Matthias BUSSONNIER
monkey patch codemirror with new functionality...
r9515
/**
*
* function to delete until previous non blanking space character
* or first multiple of 4 tabstop.
* @private
*/
CodeMirror.commands.delSpaceToPrevTabStop = function(cm){
var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
MinRK
jshint on codecell
r13210 if (!posEq(from, to)) { cm.replaceRange("", from, to); return; }
Matthias BUSSONNIER
monkey patch codemirror with new functionality...
r9515 var cur = cm.getCursor(), line = cm.getLine(cur.line);
var tabsize = cm.getOption('tabSize');
var chToPrevTabStop = cur.ch-(Math.ceil(cur.ch/tabsize)-1)*tabsize;
MinRK
jshint on codecell
r13210 from = {ch:cur.ch-chToPrevTabStop,line:cur.line};
var select = cm.getRange(from,cur);
if( select.match(/^\ +$/) !== null){
cm.replaceRange("",from,cur);
Matthias BUSSONNIER
monkey patch codemirror with new functionality...
r9515 } else {
MinRK
jshint on codecell
r13210 cm.deleteH(-1,"char");
Matthias BUSSONNIER
monkey patch codemirror with new functionality...
r9515 }
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var IPython = (function (IPython) {
Matthias BUSSONNIER
use strict and clean a little....
r7132 "use strict";
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var utils = IPython.utils;
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 var keycodes = IPython.keyboard.keycodes;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* A Cell conceived to write code.
*
* The kernel doesn't have to be set at creation time, in that case
* it will be null and set_kernel has to be called later.
* @class CodeCell
* @extends IPython.Cell
*
* @constructor
* @param {Object|null} kernel
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537 * @param {object|undefined} [options]
* @param [options.cm_config] {object} config to pass to CodeMirror
Matthias BUSSONNIER
start docummenting kernel
r8768 */
MinRK
Cells shouldn't know about Sessions
r13133 var CodeCell = function (kernel, options) {
this.kernel = kernel || null;
MinRK
restore collapsed state for cells...
r7524 this.collapsed = false;
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537
Matthias BUSSONNIER
some optimisation and code cleaning...
r13574 // create all attributed in constructor function
// even if null for V8 VM optimisation
this.input_prompt_number = null;
this.celltoolbar = null;
this.output_area = null;
this.last_msg_id = null;
this.completer = null;
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537
var cm_overwrite_options = {
Brian E. Granger
Lots of updates and changes....
r14021 onKeyEvent: $.proxy(this.handle_keyevent,this)
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537 };
Matthias BUSSONNIER
JS Configurablity Take 2...
r10165 options = this.mergeopt(CodeCell, options, {cm_config:cm_overwrite_options});
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537
IPython.Cell.apply(this,[options]);
Matthias BUSSONNIER
autochange highlight with cell magics...
r8202
Brian E. Granger
Fixing cell_type in CodeCell constructor....
r13661 // Attributes we want to override in this subclass.
this.cell_type = "code";
Matthias BUSSONNIER
autochange highlight with cell magics...
r8202 var that = this;
this.element.focusout(
Matthias BUSSONNIER
fix some whitespace
r8281 function() { that.auto_highlight(); }
);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Matthias BUSSONNIER
JS Configurablity Take 2...
r10165 CodeCell.options_default = {
cm_config : {
MinRK
enable comment/uncomment selection...
r11488 extraKeys: {
"Tab" : "indentMore",
"Shift-Tab" : "indentLess",
"Backspace" : "delSpaceToPrevTabStop",
"Cmd-/" : "toggleComment",
"Ctrl-/" : "toggleComment"
},
Brian E. Granger
Changing mode name from python -> ipython.
r10418 mode: 'ipython',
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537 theme: 'ipython',
damianavila
Added automatic close of Brackets.
r14986 matchBrackets: true,
autoCloseBrackets: true
Matthias BUSSONNIER
JS Configurablity Take 2...
r10165 }
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537 };
Jonathan Frederic
Remove O(N) cell by msg-id lookup
r14604 CodeCell.msg_cells = {};
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 CodeCell.prototype = new IPython.Cell();
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* @method auto_highlight
*/
Matthias BUSSONNIER
autochange highlight with cell magics...
r8202 CodeCell.prototype.auto_highlight = function () {
MinRK
jshint on codecell
r13210 this._auto_highlight(IPython.config.cell_magic_highlight);
Matthias BUSSONNIER
autochange highlight with cell magics...
r8202 };
Matthias BUSSONNIER
start docummenting kernel
r8768 /** @method create_element */
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 CodeCell.prototype.create_element = function () {
Matthias BUSSONNIER
create celltoolbar in cell.js and inherit
r9073 IPython.Cell.prototype.create_element.apply(this, arguments);
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
Matthias BUSSONNIER
include vbox into .cell css definition
r10217 var cell = $('<div></div>').addClass('cell border-box-sizing code_cell');
Brian E. Granger
Better tabindex support.
r4629 cell.attr('tabindex','2');
Brian E. Granger
Fixing styling issues with CellToolbar....
r9142
Matthias BUSSONNIER
use hbox mixin instead of class...
r10215 var input = $('<div></div>').addClass('input');
Brian E. Granger
Adding prompt area to non-CodeCells to indent content....
r13776 var prompt = $('<div/>').addClass('prompt input_prompt');
var inner_cell = $('<div/>').addClass('inner_cell');
this.celltoolbar = new IPython.CellToolbar(this);
inner_cell.append(this.celltoolbar.element);
Matthias BUSSONNIER
fix celltoolbar layout on FF
r9422 var input_area = $('<div/>').addClass('input_area');
Matthias BUSSONNIER
Make CodeMirror configurable...
r9537 this.code_mirror = CodeMirror(input_area.get(0), this.cm_config);
MinRK
set `spellcheck=false` in CodeCell inputarea...
r10065 $(this.code_mirror.getInputField()).attr("spellcheck", "false");
Brian E. Granger
Adding prompt area to non-CodeCells to indent content....
r13776 inner_cell.append(input_area);
input.append(prompt).append(inner_cell);
Jonathan Frederic
Added widget output area
r14219
Jonathan Frederic
Added clear widget area button
r14234 var widget_area = $('<div/>')
Jonathan Frederic
Changed underscores in CSS names to dashes
r14293 .addClass('widget-area')
Jonathan Frederic
Added clear widget area button
r14234 .hide();
this.widget_area = widget_area;
var widget_prompt = $('<div/>')
.addClass('prompt')
.appendTo(widget_area);
var widget_subarea = $('<div/>')
Jonathan Frederic
Changed underscores in CSS names to dashes
r14293 .addClass('widget-subarea')
Jonathan Frederic
Added clear widget area button
r14234 .appendTo(widget_area);
this.widget_subarea = widget_subarea;
var widget_clear_buton = $('<button />')
.addClass('close')
.html('&times;')
.click(function() {
widget_area.slideUp('', function(){ widget_subarea.html(''); });
})
.appendTo(widget_prompt);
Jonathan Frederic
Added widget output area
r14219
Brian Granger
Refactored CodeCell to use new OutputArea object for output....
r7177 var output = $('<div></div>');
Jonathan Frederic
Added widget output area
r14219 cell.append(input).append(widget_area).append(output);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.element = cell;
Matthias BUSSONNIER
retab tab to space
r7205 this.output_area = new IPython.OutputArea(output, true);
Matthias BUSSONNIER
some optimisation and code cleaning...
r13574 this.completer = new IPython.Completer(this);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian E. Granger
More work on the dual mode UX.
r14015 /** @method bind_events */
CodeCell.prototype.bind_events = function () {
IPython.Cell.prototype.bind_events.apply(this);
var that = this;
this.element.focusout(
function() { that.auto_highlight(); }
);
};
Brian E. Granger
Lots of updates and changes....
r14021 CodeCell.prototype.handle_keyevent = function (editor, event) {
Brian E. Granger
Cleaning up console log messages.
r14089 // console.log('CM', this.mode, event.which, event.type)
Brian E. Granger
Lots of updates and changes....
r14021
if (this.mode === 'command') {
return true;
} else if (this.mode === 'edit') {
return this.handle_codemirror_keyevent(editor, event);
}
};
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* This method gets called in CodeMirror's onKeyDown/onKeyPress
* handlers and is used to provide custom key handling. Its return
* value is used to determine if CodeMirror should ignore the event:
* true = ignore, false = don't ignore.
* @method handle_codemirror_keyevent
*/
Brian E. Granger
Fixing execution related things....
r4378 CodeCell.prototype.handle_codemirror_keyevent = function (editor, event) {
Brian E. Granger
Lots of updates and changes....
r14021
Matthias BUSSONNIER
tooltip on <tab>
r5398 var that = this;
Brian E. Granger
Lots of updates and changes....
r14021 // whatever key is pressed, first, cancel the tooltip request before
// they are sent, and remove tooltip if any, except for tab again
Brian E. Granger
Special handling for CM's vim keyboard mapping.
r14062 var tooltip_closed = null;
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 if (event.type === 'keydown' && event.which != keycodes.tab ) {
Brian E. Granger
Special handling for CM's vim keyboard mapping.
r14062 tooltip_closed = IPython.tooltip.remove_and_cancel_tooltip();
Brian E. Granger
Lots of updates and changes....
r14021 }
Brian Granger
Making keyboard shortcut for showing line numbers consistent.
r6059
Brian E. Granger
Lots of updates and changes....
r14021 var cur = editor.getCursor();
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 if (event.keyCode === keycodes.enter){
Brian E. Granger
Lots of updates and changes....
r14021 this.auto_highlight();
}
Brian Granger
Making keyboard shortcut for showing line numbers consistent.
r6059
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 if (event.keyCode === keycodes.enter && (event.shiftKey || event.ctrlKey || event.altKey)) {
Brian E. Granger
Lots of updates and changes....
r14021 // Always ignore shift-enter in CodeMirror as we handle it.
return true;
} else if (event.which === 40 && event.type === 'keypress' && IPython.tooltip.time_before_tooltip >= 0) {
// triger on keypress (!) otherwise inconsistent event.which depending on plateform
// browser and keyboard layout !
// Pressing '(' , request tooltip, don't forget to reappend it
// The second argument says to hide the tooltip if the docstring
// is actually empty
IPython.tooltip.pending(that, true);
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 } else if (event.which === keycodes.up && event.type === 'keydown') {
Brian E. Granger
Lots of updates and changes....
r14021 // If we are not at the top, let CM handle the up arrow and
// prevent the global keydown handler from handling it.
if (!that.at_top()) {
event.stop();
return false;
} else {
Michael Droettboom
Handle carriage return characters ("\r") in HTML notebook output....
r7339 return true;
Brian E. Granger
Lots of updates and changes....
r14021 }
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 } else if (event.which === keycodes.esc && event.type === 'keydown') {
Brian E. Granger
Special handling for CM's vim keyboard mapping.
r14062 // First see if the tooltip is active and if so cancel it.
if (tooltip_closed) {
// The call to remove_and_cancel_tooltip above in L177 doesn't pass
// force=true. Because of this it won't actually close the tooltip
// if it is in sticky mode. Thus, we have to check again if it is open
// and close it with force=true.
if (!IPython.tooltip._hidden) {
IPython.tooltip.remove_and_cancel_tooltip(true);
}
// If we closed the tooltip, don't let CM or the global handlers
// handle this event.
event.stop();
return true;
}
if (that.code_mirror.options.keyMap === "vim-insert") {
// vim keyMap is active and in insert mode. In this case we leave vim
// insert mode, but remain in notebook edit mode.
// Let' CM handle this event and prevent global handling.
event.stop();
return false;
} else {
// vim keyMap is not active. Leave notebook edit mode.
// Don't let CM handle the event, defer to global handling.
return true;
}
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 } else if (event.which === keycodes.down && event.type === 'keydown') {
Brian E. Granger
Lots of updates and changes....
r14021 // If we are not at the bottom, let CM handle the down arrow and
// prevent the global keydown handler from handling it.
if (!that.at_bottom()) {
event.stop();
return false;
} else {
Michael Droettboom
Handle carriage return characters ("\r") in HTML notebook output....
r7339 return true;
Brian E. Granger
Lots of updates and changes....
r14021 }
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 } else if (event.keyCode === keycodes.tab && event.type === 'keydown' && event.shiftKey) {
Brian E. Granger
Lots of updates and changes....
r14021 if (editor.somethingSelected()){
var anchor = editor.getCursor("anchor");
var head = editor.getCursor("head");
if( anchor.line != head.line){
return false;
Bussonnier Matthias
shift tqb for tooltip
r8949 }
}
IPython.tooltip.request(that);
event.stop();
return true;
Brian E. Granger
Removing old keyboard handling from IPython.utils.
r15619 } else if (event.keyCode === keycodes.tab && event.type == 'keydown') {
Brian E. Granger
Fixing tab completion edge cases.
r4555 // Tab completion.
Matthias BUSSONNIER
prompt '*' strore fix + tab remove tooltip...
r13572 IPython.tooltip.remove_and_cancel_tooltip();
if (editor.somethingSelected()) {
return false;
}
Matthias BUSSONNIER
tooltip on <tab>
r5398 var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);
if (pre_cursor.trim() === "") {
Fernando Perez
Add Ctrl-L as a way to toggle line-numbers for any individual code cell
r5016 // Don't autocomplete if the part of the line before the cursor
// is empty. In this case, let CodeMirror handle indentation.
Brian E. Granger
Notebook now uses tab for autocompletion.
r4393 return false;
} else {
Brian E. Granger
Lots of updates and changes....
r14021 event.stop();
this.completer.startCompletion();
return true;
}
} else {
// keypress/keyup also trigger on TAB press, and we don't want to
// use those to disable tab completion.
Brian E. Granger
Fixing execution related things....
r4378 return false;
MinRK
jshint on codecell
r13210 }
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 return false;
Brian E. Granger
Fixing execution related things....
r4378 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 // Kernel related calls.
MinRK
Cells shouldn't know about Sessions
r13133 CodeCell.prototype.set_kernel = function (kernel) {
this.kernel = kernel;
MinRK
jshint on codecell
r13210 };
Brian Granger
Fixed order of notebook loading and kernel starting....
r7197
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* Execute current code cell to the kernel
* @method execute
*/
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 CodeCell.prototype.execute = function () {
MinRK
fixup bad rebase
r13102 this.output_area.clear_output();
Jonathan Frederic
Fixed glitch when widgetarea wouldn't get completely hidden upon re-execution
r14248
// Clear widget area
Jonathan Frederic
Clear widgets upon cell execute
r14235 this.widget_subarea.html('');
this.widget_subarea.height('');
this.widget_area.height('');
Jonathan Frederic
Fixed glitch when widgetarea wouldn't get completely hidden upon re-execution
r14248 this.widget_area.hide();
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 this.set_input_prompt('*');
this.element.addClass("running");
MinRK
add CodeCell.get_callbacks...
r13225 if (this.last_msg_id) {
this.kernel.clear_callbacks_for_msg(this.last_msg_id);
}
var callbacks = this.get_callbacks();
Jonathan Frederic
Remove O(N) cell by msg-id lookup
r14604 var old_msg_id = this.last_msg_id;
MinRK
add CodeCell.get_callbacks...
r13225 this.last_msg_id = this.kernel.execute(this.get_text(), callbacks, {silent: false, store_history: true});
Jonathan Frederic
Remove O(N) cell by msg-id lookup
r14604 if (old_msg_id) {
delete CodeCell.msg_cells[old_msg_id];
}
CodeCell.msg_cells[this.last_msg_id] = this;
MinRK
add CodeCell.get_callbacks...
r13225 };
/**
* Construct the default callbacks for
* @method get_callbacks
*/
CodeCell.prototype.get_callbacks = function () {
return {
MinRK
refactor js callbacks...
r13207 shell : {
reply : $.proxy(this._handle_execute_reply, this),
payload : {
set_next_input : $.proxy(this._handle_set_next_input, this),
MinRK
add CodeCell.get_callbacks...
r13225 page : $.proxy(this._open_with_pager, this)
MinRK
refactor js callbacks...
r13207 }
},
iopub : {
output : $.proxy(this.output_area.handle_output, this.output_area),
clear_output : $.proxy(this.output_area.handle_clear_output, this.output_area),
},
input : $.proxy(this._handle_input_request, this)
MinRK
jshint on codecell
r13210 };
MinRK
add CodeCell.get_callbacks...
r13225 };
CodeCell.prototype._open_with_pager = function (payload) {
$([IPython.events]).trigger('open_with_text.Pager', payload);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* @method _handle_execute_reply
* @private
*/
MinRK
refactor js callbacks...
r13207 CodeCell.prototype._handle_execute_reply = function (msg) {
this.set_input_prompt(msg.content.execution_count);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 this.element.removeClass("running");
MinRK
setting the notebook dirty flag is now an event...
r10781 $([IPython.events]).trigger('set_dirty.Notebook', {value: true});
MinRK
jshint on codecell
r13210 };
Brian E. Granger
Autocompletion working with CTRL-SPACE.
r4389
MinRK
use inline raw_input instead of a dialog
r10368 /**
* @method _handle_set_next_input
* @private
*/
MinRK
refactor js callbacks...
r13207 CodeCell.prototype._handle_set_next_input = function (payload) {
MinRK
jshint on codecell
r13210 var data = {'cell': this, 'text': payload.text};
Brian Granger
Removing cell from execute callbacks in kernel.js.
r7223 $([IPython.events]).trigger('set_next_input.Notebook', data);
MinRK
jshint on codecell
r13210 };
Takeshi Kanmae
ESC should be handled by CM if tooltip is not on
r12458
MinRK
use inline raw_input instead of a dialog
r10368 /**
* @method _handle_input_request
* @private
*/
MinRK
refactor js callbacks...
r13207 CodeCell.prototype._handle_input_request = function (msg) {
this.output_area.append_raw_input(msg);
MinRK
jshint on codecell
r13210 };
MinRK
use inline raw_input instead of a dialog
r10368
Brian Granger
Removing cell from execute callbacks in kernel.js.
r7223
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 // Basic cell manipulation.
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 CodeCell.prototype.select = function () {
Brian E. Granger
More work on the dual mode UX.
r14015 var cont = IPython.Cell.prototype.select.apply(this);
if (cont) {
Brian E. Granger
Adding new logic to cells.
r14014 this.code_mirror.refresh();
this.auto_highlight();
Brian E. Granger
Semicolon cleanup.
r14092 }
Brian E. Granger
More work on the dual mode UX.
r14015 return cont;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian E. Granger
Adding new logic to cells.
r14014 CodeCell.prototype.render = function () {
Brian E. Granger
More work on the dual mode UX.
r14015 var cont = IPython.Cell.prototype.render.apply(this);
// Always execute, even if we are already in the rendered state
return cont;
Brian E. Granger
Starting work on select/focus logic.
r14013 };
Brian E. Granger
More work on the dual mode UX.
r14015
Brian E. Granger
Adding new logic to cells.
r14014 CodeCell.prototype.unrender = function () {
Brian E. Granger
More work on the dual mode UX.
r14015 // CodeCell is always rendered
return false;
Brian E. Granger
Starting work on select/focus logic.
r14013 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Jonathan Frederic
Fixed lots of bugs...
r15493 /**
Jonathan Frederic
Standardized comments and removed last logs
r15500 * Determine whether or not the unfocus event should be aknowledged.
*
* @method should_cancel_blur
*
* @return results {bool} Whether or not to ignore the cell's blur event.
**/
Jonathan Frederic
s/unfocus/blur
r15498 CodeCell.prototype.should_cancel_blur = function () {
Jonathan Frederic
Post in person review...
r15497 // Cancel this unfocus event if the base wants to cancel or the cell
Jonathan Frederic
Move should cancel blur into codecell
r15538 // completer is open or the tooltip is open.
Jonathan Frederic
s/unfocus/blur
r15498 return IPython.Cell.prototype.should_cancel_blur.apply(this) ||
Jonathan Frederic
Move should cancel blur into codecell
r15538 (this.completer && this.completer.is_visible()) ||
(IPython.tooltip && IPython.tooltip.is_visible());
Jonathan Frederic
Fixed lots of bugs...
r15493 };
Brian E. Granger
Adding new logic to cells.
r14014
Brian E. Granger
Ctrl-Enter now does not delete input, but selects it.
r4675 CodeCell.prototype.select_all = function () {
var start = {line: 0, ch: 0};
var nlines = this.code_mirror.lineCount();
var last_line = this.code_mirror.getLine(nlines-1);
var end = {line: nlines-1, ch: last_line.length};
this.code_mirror.setSelection(start, end);
};
Brian E. Granger
Cleaning up output management in code and menus.
r14867 CodeCell.prototype.collapse_output = function () {
MinRK
restore collapsed state for cells...
r7524 this.collapsed = true;
this.output_area.collapse();
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
Brian E. Granger
Cleaning up output management in code and menus.
r14867 CodeCell.prototype.expand_output = function () {
MinRK
restore collapsed state for cells...
r7524 this.collapsed = false;
this.output_area.expand();
Brian E. Granger
Cleaning up output management in code and menus.
r14867 this.output_area.unscroll_area();
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
Brian E. Granger
Cleaning up output management in code and menus.
r14867 CodeCell.prototype.scroll_output = function () {
this.output_area.expand();
this.output_area.scroll_if_long();
};
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
CodeCell.prototype.toggle_output = function () {
MinRK
restore collapsed state for cells...
r7524 this.collapsed = Boolean(1 - this.collapsed);
this.output_area.toggle_output();
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
MinRK
add ^M-O for toggling output scroll
r7429 CodeCell.prototype.toggle_output_scroll = function () {
Brian E. Granger
Cleaning up output management in code and menus.
r14867 this.output_area.toggle_scroll();
MinRK
add ^M-O for toggling output scroll
r7429 };
Bussonnier Matthias
add ability to create continuation prompt
r8467 CodeCell.input_prompt_classical = function (prompt_value, lines_number) {
Matthias BUSSONNIER
avoid injection in input prompt
r14714 var ns;
if (prompt_value == undefined) {
ns = "&nbsp;";
} else {
ns = encodeURIComponent(prompt_value);
}
MinRK
jshint on codecell
r13210 return 'In&nbsp;[' + ns + ']:';
Bussonnier Matthias
add ability to create continuation prompt
r8467 };
Matthias BUSSONNIER
start docummenting kernel
r8768
Bussonnier Matthias
add ability to create continuation prompt
r8467 CodeCell.input_prompt_continuation = function (prompt_value, lines_number) {
var html = [CodeCell.input_prompt_classical(prompt_value, lines_number)];
MinRK
jshint on codecell
r13210 for(var i=1; i < lines_number; i++) {
html.push(['...:']);
}
return html.join('<br/>');
Bussonnier Matthias
add ability to create continuation prompt
r8467 };
Matthias BUSSONNIER
start docummenting kernel
r8768
Bussonnier Matthias
add ability to create continuation prompt
r8467 CodeCell.input_prompt_function = CodeCell.input_prompt_classical;
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 CodeCell.prototype.set_input_prompt = function (number) {
MinRK
jshint on codecell
r13210 var nline = 1;
if (this.code_mirror !== undefined) {
Bussonnier Matthias
add ability to create continuation prompt
r8467 nline = this.code_mirror.lineCount();
}
Paul Ivanov
clear In[ ] prompt numbers again
r8603 this.input_prompt_number = number;
Bussonnier Matthias
add ability to create continuation prompt
r8467 var prompt_html = CodeCell.input_prompt_function(this.input_prompt_number, nline);
Jonathan Frederic
Audit .html() calls take #2
r15376 // This HTML call is okay because the user contents are escaped.
Bussonnier Matthias
add ability to create continuation prompt
r8467 this.element.find('div.input_prompt').html(prompt_html);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
CodeCell.prototype.clear_input = function () {
this.code_mirror.setValue('');
};
CodeCell.prototype.get_text = function () {
return this.code_mirror.getValue();
};
CodeCell.prototype.set_text = function (code) {
return this.code_mirror.setValue(code);
};
MinRK
fixup bad rebase
r13102 CodeCell.prototype.clear_output = function (wait) {
this.output_area.clear_output(wait);
Brian E. Granger
Cleaning up output management in code and menus.
r14867 this.set_input_prompt();
MinRK
[notebook] clear_output is handled after a delay...
r6423 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
// JSON serialization
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 CodeCell.prototype.fromJSON = function (data) {
MinRK
add empty metadata field on cells/worksheets...
r7523 IPython.Cell.prototype.fromJSON.apply(this, arguments);
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 if (data.cell_type === 'code') {
Brian E. Granger
Massive work on the notebook document format....
r4484 if (data.input !== undefined) {
Brian Granger
Work on the base Cell API....
r5943 this.set_text(data.input);
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
this.code_mirror.clearHistory();
Matthias BUSSONNIER
autochange highlight with cell magics...
r8202 this.auto_highlight();
Brian E. Granger
Massive work on the notebook document format....
r4484 }
if (data.prompt_number !== undefined) {
this.set_input_prompt(data.prompt_number);
} else {
this.set_input_prompt();
MinRK
jshint on codecell
r13210 }
MinRK
sign notebooks
r14856 this.output_area.trusted = data.trusted || false;
Brian Granger
Refactored CodeCell to use new OutputArea object for output....
r7177 this.output_area.fromJSON(data.outputs);
Brian E. Granger
Added collapsed field to the code cell.
r4533 if (data.collapsed !== undefined) {
if (data.collapsed) {
Brian E. Granger
Cleaning up output management in code and menus.
r14867 this.collapse_output();
Brian Granger
Fixing minor bugs in nbformat and saving....
r6032 } else {
Brian E. Granger
Cleaning up output management in code and menus.
r14867 this.expand_output();
MinRK
jshint on codecell
r13210 }
}
}
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
CodeCell.prototype.toJSON = function () {
MinRK
add empty metadata field on cells/worksheets...
r7523 var data = IPython.Cell.prototype.toJSON.apply(this);
Brian Granger
Work on the base Cell API....
r5943 data.input = this.get_text();
Matthias BUSSONNIER
prompt '*' strore fix + tab remove tooltip...
r13572 // is finite protect against undefined and '*' value
if (isFinite(this.input_prompt_number)) {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 data.prompt_number = this.input_prompt_number;
MinRK
jshint on codecell
r13210 }
Brian Granger
Refactored CodeCell to use new OutputArea object for output....
r7177 var outputs = this.output_area.toJSON();
Brian E. Granger
Added saving and loading of output of all types.
r4497 data.outputs = outputs;
Brian E. Granger
Massive work on the notebook document format....
r4484 data.language = 'python';
MinRK
sign notebooks
r14856 data.trusted = this.output_area.trusted;
Brian E. Granger
Added collapsed field to the code cell.
r4533 data.collapsed = this.collapsed;
Brian E. Granger
Massive work on the notebook document format....
r4484 return data;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian E. Granger
Added saving and loading of output of all types.
r4497
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 IPython.CodeCell = CodeCell;
return IPython;
MinRK
refactor js callbacks...
r13207 }(IPython));