Skip to content

Fix markdown mode loading #1757

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 12, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 13 additions & 12 deletions notebook/static/notebook/js/cell.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,9 @@ define([
options = options || {};
this.keyboard_manager = options.keyboard_manager;
this.events = options.events;
var config = utils.mergeopt(Cell, options.config);
var config = options.config;
// superclass default overwrite our default

this.placeholder = config.placeholder || '';
this.selected = false;
this.anchor = false;
this.rendered = false;
Expand Down Expand Up @@ -83,19 +82,21 @@ define([
// load this from metadata later ?
this.user_highlight = 'auto';


var _local_cm_config = {};
if(this.class_config){
_local_cm_config = this.class_config.get_sync('cm_config');
// merge my class-specific config data with general cell-level config
var class_config_data = {};
if (this.class_config) {
class_config_data = this.class_config.get_sync();
}

var local = new configmod.ConfigWithDefaults(options.config,
{}, 'Cell');
var llcm = local.get_sync('cm_config');

config.cm_config = utils.mergeopt({}, config.cm_config, utils.mergeopt({}, llcm, _local_cm_config));
var cell_config = new configmod.ConfigWithDefaults(options.config,
Cell.options_default, 'Cell');
var cell_config_data = cell_config.get_sync();

// this._options is a merge of SomeCell and Cell config data:
this._options = utils.mergeopt({}, cell_config_data, class_config_data);
this.placeholder = this._options.placeholder || '';

this.cell_id = utils.uuid();
this._options = config;

// For JS VM engines optimization, attributes should be all set (even
// to null) in the constructor, and if possible, if different subclass
Expand Down
4 changes: 1 addition & 3 deletions notebook/static/notebook/js/codecell.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ define([
this.tooltip = options.tooltip;
this.config = options.config;
this.class_config = new configmod.ConfigWithDefaults(this.config,
CodeCell.config_defaults, 'CodeCell');
CodeCell.options_default, 'CodeCell');

// create all attributed in constructor function
// even if null for V8 VM optimisation
Expand Down Expand Up @@ -141,8 +141,6 @@ define([
},
};

CodeCell.config_defaults = CodeCell.options_default;

CodeCell.msg_cells = {};

CodeCell.prototype = Object.create(Cell.prototype);
Expand Down
13 changes: 12 additions & 1 deletion notebook/static/notebook/js/codemirror-ipythongfm.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,16 @@
}, 'gfm');

CodeMirror.defineMIME("text/x-ipythongfm", "ipythongfm");

// async workaround:
// Cells may be loaded before this mode is defined.
// If that happens, trigger re-load of the mode:
if (Jupyter && Jupyter.notebook) {
Jupyter.notebook.get_cells().map(function (cell) {
if (cell.code_mirror && cell.code_mirror.getOption('mode') === 'ipythongfm') {
cell.code_mirror.setOption('mode', 'ipythongfm');
}
});
}
});
})
});
21 changes: 8 additions & 13 deletions notebook/static/notebook/js/textcell.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ define([
this.notebook = options.notebook;

// we cannot put this as a class key as it has handle to "this".
var config = utils.mergeopt(TextCell, this.config);
Cell.apply(this, [{
config: options.config,
keyboard_manager: options.keyboard_manager,
Expand Down Expand Up @@ -279,9 +278,9 @@ define([
* notebook: Notebook instance
*/
options = options || {};
var config = utils.mergeopt(MarkdownCell, {});
var config_default = utils.mergeopt(TextCell, MarkdownCell.options_default);
this.class_config = new configmod.ConfigWithDefaults(options.config,
{}, 'MarkdownCell');
config_default, 'MarkdownCell');
TextCell.apply(this, [$.extend({}, options, {config: options.config})]);

this.cell_type = 'markdown';
Expand Down Expand Up @@ -527,24 +526,20 @@ define([
* notebook: Notebook instance
*/
options = options || {};
var config = utils.mergeopt(RawCell, {});
TextCell.apply(this, [$.extend({}, options, {config: options.config})]);

var config_default = utils.mergeopt(TextCell, RawCell.options_default);
this.class_config = new configmod.ConfigWithDefaults(options.config,
RawCell.config_defaults, 'RawCell');
config_default, 'RawCell');
TextCell.apply(this, [$.extend({}, options, {config: options.config})]);
this.cell_type = 'raw';
};

RawCell.options_default = {
placeholder : "Write raw LaTeX or other formats here, for use with nbconvert. " +
"It will not be rendered in the notebook. " +
"When passing through nbconvert, a Raw Cell's content is added to the output unmodified."
};

RawCell.config_defaults = {
highlight_modes : {
'diff' :{'reg':[/^diff/]}
},
placeholder : "Write raw LaTeX or other formats here, for use with nbconvert. " +
"It will not be rendered in the notebook. " +
"When passing through nbconvert, a Raw Cell's content is added to the output unmodified.",
};

RawCell.prototype = Object.create(TextCell.prototype);
Expand Down
16 changes: 15 additions & 1 deletion notebook/static/services/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,21 @@ function(utils) {
*/
ConfigWithDefaults.prototype.get_sync = function(key) {
var data = this._class_data();
return key in data ? data[key] : this.defaults[key];
if (key === undefined) {
// no key specified, return full config data
return $.extend(true, {}, this.defaults, data);
}

var value = data[key];
if (value !== undefined) {
if (typeof value == 'object') {
// merge with defaults if it's an object
return $.extend(true, {}, this.defaults[key], value);
} else {
return value;
}
}
return this.defaults[key];
};

/**
Expand Down
10 changes: 10 additions & 0 deletions notebook/tests/notebook/dualmode_cellmode.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,26 @@

// Test
casper.notebook_test(function () {
function get_cell_cm_mode(index) {
return casper.evaluate(function (index) {
return Jupyter.notebook.get_cell(index).code_mirror.getMode().name;
}, {index: index});
}

this.then(function () {
// Cell mode change
var that = this;
var index = 0;
this.select_cell(index);
var a = 'hello\nmulti\nline';
this.set_cell_text(index, a);
this.trigger_keydown('esc','r');
this.test.assertEquals(this.get_cell(index).cell_type, 'raw', 'r; cell is raw');
this.test.assertEquals(get_cell_cm_mode(index), 'null', 'raw cell codemirror mode is null');
this.trigger_keydown('1');
this.test.assertEquals(this.get_cell(index).cell_type, 'markdown', '1; cell is markdown');
this.test.assertEquals(this.get_cell_text(index), '# ' + a, '1; markdown heading');
this.test.assertEquals(get_cell_cm_mode(index), 'ipythongfm', 'codemirror cell mode is ipythongfm');
this.trigger_keydown('2');
this.test.assertEquals(this.get_cell(index).cell_type, 'markdown', '2; cell is markdown');
this.test.assertEquals(this.get_cell_text(index), '## ' + a, '2; markdown heading');
Expand All @@ -34,6 +43,7 @@ casper.notebook_test(function () {
this.trigger_keydown('y');
this.test.assertEquals(this.get_cell(index).cell_type, 'code', 'y; cell is code');
this.test.assertEquals(this.get_cell_text(index), '###### ' + a, 'y; still has hashes');
this.test.assertEquals(get_cell_cm_mode(index), 'ipython', 'code cell mode is ipython');
this.trigger_keydown('1');
this.test.assertEquals(this.get_cell(index).cell_type, 'markdown', '1; cell is markdown');
this.test.assertEquals(this.get_cell_text(index), '# ' + a, '1; markdown heading');
Expand Down