Skip to content

Commit 72e37de

Browse files
authored
Merge pull request #765 from kukanya/master
[Freeze] Extend functionality to markdown cells
2 parents 3d2fce8 + c4c4ac9 commit 72e37de

File tree

2 files changed

+159
-139
lines changed

2 files changed

+159
-139
lines changed
Lines changed: 152 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,142 +1,156 @@
11
define([
2-
'base/js/namespace',
3-
'base/js/events',
4-
'notebook/js/codecell',
5-
'jquery'
2+
'base/js/namespace',
3+
'base/js/events',
4+
'notebook/js/codecell',
5+
'notebook/js/textcell',
6+
'jquery'
67
], function (
7-
Jupyter,
8-
events,
9-
codecell,
10-
$
8+
Jupyter,
9+
events,
10+
codecell,
11+
textcell,
12+
$
1113
){
12-
'use strict';
13-
14-
var CodeCell = codecell.CodeCell;
15-
16-
function patch_CodeCell_execute () {
17-
console.log('[Freeze] patching CodeCell.prototype.execute')
18-
var old_execute = CodeCell.prototype.execute;
19-
20-
CodeCell.prototype.execute = function () {
21-
if (this.metadata.run_control === undefined ||
22-
!this.metadata.run_control.frozen
23-
) {
24-
old_execute.apply(this, arguments);
25-
}
26-
}
27-
}
28-
29-
function set_state(cell, state) {
30-
if (cell instanceof CodeCell) {
31-
if (cell.metadata.run_control === undefined)
32-
cell.metadata.run_control = {};
33-
if (state === undefined)
34-
state = 'normal';
35-
switch(state) {
36-
case 'normal':
37-
var new_run_control_values = {
38-
read_only : false,
39-
frozen : false
40-
};
41-
var bg = "";
42-
break;
43-
case 'read_only':
44-
var new_run_control_values = {
45-
read_only : true,
46-
frozen : false
47-
};
48-
var bg = "#FFFEF0";
49-
break;
50-
case 'frozen':
51-
var new_run_control_values = {
52-
read_only : true,
53-
frozen : true
54-
};
55-
var bg = "#f0feff";
56-
break;
57-
}
58-
$.extend(cell.metadata.run_control, new_run_control_values);
59-
cell.code_mirror.setOption('readOnly', cell.metadata.run_control.read_only);
60-
var prompt = cell.element.find('div.input_area');
61-
prompt.css("background-color", bg);
62-
}
63-
}
64-
65-
function set_state_selected (state) {
66-
var cells = Jupyter.notebook.get_selected_cells();
67-
for (var i = 0; i < cells.length; i++) {
68-
set_state(cells[i], state)
69-
}
70-
}
71-
72-
function make_normal_selected () {
73-
set_state_selected('normal');
74-
}
75-
76-
function make_read_only_selected () {
77-
set_state_selected('read_only');
78-
}
79-
80-
function make_frozen_selected () {
81-
set_state_selected('frozen');
82-
}
83-
84-
85-
function initialize_states () {
86-
var cells = Jupyter.notebook.get_cells();
87-
for (var i in cells) {
88-
var cell = cells[i];
89-
if (cell instanceof CodeCell) {
90-
if (cell.metadata.run_control != undefined) {
91-
if (cell.metadata.run_control.read_only) {
92-
if (cell.metadata.run_control.frozen) {
93-
set_state(cell, 'frozen')
94-
} else {
95-
set_state(cell, 'read_only')
96-
}
97-
} else {
98-
set_state(cell, 'normal')
99-
}
100-
} else {
101-
set_state(cell, 'normal');
102-
}
103-
}
104-
}
105-
}
106-
107-
function load_extension () {
108-
Jupyter.toolbar.add_buttons_group([
109-
{
110-
id : 'make_normal',
111-
label : 'lift restrictions from selected cells',
112-
icon : 'fa-unlock-alt',
113-
callback : make_normal_selected
114-
},
115-
{
116-
id : 'make_read_only',
117-
label : 'make selected cells read-only',
118-
icon: 'fa-lock',
119-
callback : make_read_only_selected
120-
},
121-
{
122-
id : 'freeze_cells',
123-
label : 'freeze selected cells',
124-
icon : 'fa-asterisk',
125-
callback : make_frozen_selected
126-
}
127-
]);
128-
129-
if (typeof Jupyter.notebook === "undefined") {
130-
events.on("notebook_loaded.Notebook", initialize_states)
131-
} else {
132-
initialize_states();
133-
}
134-
135-
patch_CodeCell_execute();
136-
}
137-
138-
return {
139-
load_jupyter_extension : load_extension,
140-
load_ipython_extension : load_extension
141-
}
14+
'use strict';
15+
16+
var CodeCell = codecell.CodeCell;
17+
var MarkdownCell = textcell.MarkdownCell;
18+
19+
function patch_MarkdownCell_unrender () {
20+
console.log('[Freeze] patching MarkdownCell.prototype.unrender');
21+
var old_unrender = MarkdownCell.prototype.unrender;
22+
23+
MarkdownCell.prototype.unrender = function () {
24+
// console.log('[Freeze] patched unrender applied');
25+
if (this.metadata.run_control === undefined ||
26+
!this.metadata.run_control.frozen
27+
) {
28+
old_unrender.apply(this, arguments);
29+
}
30+
}
31+
}
32+
33+
function patch_CodeCell_execute () {
34+
console.log('[Freeze] patching CodeCell.prototype.execute');
35+
var old_execute = CodeCell.prototype.execute;
36+
37+
CodeCell.prototype.execute = function () {
38+
if (this.metadata.run_control === undefined ||
39+
!this.metadata.run_control.frozen
40+
) {
41+
old_execute.apply(this, arguments);
42+
}
43+
}
44+
}
45+
46+
function set_state(cell, state) {
47+
if (!(cell instanceof CodeCell || cell instanceof MarkdownCell)) {
48+
return
49+
}
50+
51+
if (cell.metadata.run_control === undefined)
52+
cell.metadata.run_control = {};
53+
54+
state = state || 'normal';
55+
var new_run_control_values;
56+
var bg;
57+
switch (state) {
58+
case 'normal':
59+
new_run_control_values = {
60+
read_only: false,
61+
frozen: false
62+
};
63+
bg = "";
64+
break;
65+
case 'read_only':
66+
new_run_control_values = {
67+
read_only: true,
68+
frozen: false
69+
};
70+
bg = "#FFFEF0";
71+
break;
72+
case 'frozen':
73+
new_run_control_values = {
74+
read_only: true,
75+
frozen: true
76+
};
77+
bg = "#f0feff";
78+
break;
79+
}
80+
$.extend(cell.metadata.run_control, new_run_control_values);
81+
cell.code_mirror.setOption('readOnly', cell.metadata.run_control.read_only);
82+
var prompt = cell.element.find('div.input_area');
83+
prompt.css("background-color", bg);
84+
}
85+
86+
function set_state_selected (state) {
87+
var cells = Jupyter.notebook.get_selected_cells();
88+
for (var i = 0; i < cells.length; i++) {
89+
set_state(cells[i], state);
90+
}
91+
}
92+
93+
function make_normal_selected () {
94+
set_state_selected('normal');
95+
}
96+
97+
function make_read_only_selected () {
98+
set_state_selected('read_only');
99+
}
100+
101+
function make_frozen_selected () {
102+
set_state_selected('frozen');
103+
}
104+
105+
function initialize_states () {
106+
var cells = Jupyter.notebook.get_cells();
107+
for (var i = 0; i < cells.length; i++) {
108+
var cell = cells[i];
109+
if (!(cell instanceof CodeCell || cell instanceof MarkdownCell)) {
110+
continue;
111+
}
112+
var state = 'normal';
113+
if (cell.metadata.run_control != undefined && cell.metadata.run_control.read_only) {
114+
state = cell.metadata.run_control.frozen ? 'frozen' : 'read_only';
115+
}
116+
set_state(cell, state);
117+
}
118+
}
119+
120+
function load_extension () {
121+
Jupyter.toolbar.add_buttons_group([
122+
{
123+
id : 'make_normal',
124+
label : 'lift restrictions from selected cells',
125+
icon : 'fa-unlock-alt',
126+
callback : make_normal_selected
127+
},
128+
{
129+
id : 'make_read_only',
130+
label : 'make selected cells read-only',
131+
icon: 'fa-lock',
132+
callback : make_read_only_selected
133+
},
134+
{
135+
id : 'freeze_cells',
136+
label : 'freeze selected cells',
137+
icon : 'fa-asterisk',
138+
callback : make_frozen_selected
139+
}
140+
]);
141+
142+
if (typeof Jupyter.notebook === "undefined") {
143+
events.on("notebook_loaded.Notebook", initialize_states);
144+
} else {
145+
initialize_states();
146+
}
147+
148+
patch_CodeCell_execute();
149+
patch_MarkdownCell_unrender();
150+
}
151+
152+
return {
153+
load_jupyter_extension : load_extension,
154+
load_ipython_extension : load_extension
155+
};
142156
});

src/jupyter_contrib_nbextensions/nbextensions/freeze/readme.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Freeze
22

3-
This extension allows to make cells read-only or frozen. If a cell is read-only, it can be executed, but its input cannot be changed. Frozen cells cannot be either altered or executed.
3+
This extension allows to make cells read-only or frozen.
4+
5+
If a code cell is read-only, it can be executed, but its input cannot be changed.
6+
Frozen code cells cannot be either altered or executed.
7+
8+
If a markdown cell is read-only, its input can be viewed by double-clicking on it, but cannot be changed.
9+
Frozen markdown cells' input cannot be viewed by double-clicking.
410

511
To change cells' state, select them and press corresponding button.
612

0 commit comments

Comments
 (0)