forked from jupyterlab/jupyterlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
executable file
·134 lines (108 loc) · 3.7 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
import 'es6-promise/auto'; // polyfill Promise on IE
import '@jupyterlab/theme-light-extension/static/embed.css';
import '../index.css';
import { ClientSession, Toolbar } from '@jupyterlab/apputils';
import { CodeCellModel, CodeCell } from '@jupyterlab/cells';
import { CodeMirrorMimeTypeService } from '@jupyterlab/codemirror';
import {
CompleterModel,
Completer,
CompletionHandler,
KernelConnector
} from '@jupyterlab/completer';
import {
RenderMimeRegistry,
standardRendererFactories as initialFactories
} from '@jupyterlab/rendermime';
import { SessionManager } from '@jupyterlab/services';
import { CommandRegistry } from '@phosphor/commands';
import { BoxPanel, Widget } from '@phosphor/widgets';
function main(): void {
const manager = new SessionManager();
const session = new ClientSession({ manager, name: 'Example' });
const mimeService = new CodeMirrorMimeTypeService();
// Initialize the command registry with the bindings.
const commands = new CommandRegistry();
const useCapture = true;
// Setup the keydown listener for the document.
document.addEventListener(
'keydown',
event => {
commands.processKeydownEvent(event);
},
useCapture
);
// Create the cell widget with a default rendermime instance.
const rendermime = new RenderMimeRegistry({ initialFactories });
const cellWidget = new CodeCell({
rendermime,
model: new CodeCellModel({})
});
// Handle the mimeType for the current kernel.
session.kernelChanged.connect(() => {
session.kernel.ready.then(() => {
const lang = session.kernel.info.language_info;
const mimeType = mimeService.getMimeTypeByLanguage(lang);
cellWidget.model.mimeType = mimeType;
});
});
// Start the default kernel.
session.kernelPreference = { autoStartDefault: true };
session.initialize();
// Set up a completer.
const editor = cellWidget.editor;
const model = new CompleterModel();
const completer = new Completer({ editor, model });
const connector = new KernelConnector({ session });
const handler = new CompletionHandler({ completer, connector });
// Set the handler's editor.
handler.editor = editor;
// Hide the widget when it first loads.
completer.hide();
// Create a toolbar for the cell.
const toolbar = new Toolbar();
toolbar.addItem('spacer', Toolbar.createSpacerItem());
toolbar.addItem('interrupt', Toolbar.createInterruptButton(session));
toolbar.addItem('restart', Toolbar.createRestartButton(session));
toolbar.addItem('name', Toolbar.createKernelNameItem(session));
toolbar.addItem('status', Toolbar.createKernelStatusItem(session));
// Lay out the widgets.
const panel = new BoxPanel();
panel.id = 'main';
panel.direction = 'top-to-bottom';
panel.spacing = 0;
panel.addWidget(completer);
panel.addWidget(toolbar);
panel.addWidget(cellWidget);
BoxPanel.setStretch(toolbar, 0);
BoxPanel.setStretch(cellWidget, 1);
// Attach the panel to the DOM.
Widget.attach(panel, document.body);
// Handle widget state.
window.addEventListener('resize', () => {
panel.update();
});
cellWidget.activate();
// Add the commands.
commands.addCommand('invoke:completer', {
execute: () => {
handler.invoke();
}
});
commands.addCommand('run:cell', {
execute: () => CodeCell.execute(cellWidget, session)
});
commands.addKeyBinding({
selector: '.jp-InputArea-editor.jp-mod-completer-enabled',
keys: ['Tab'],
command: 'invoke:completer'
});
commands.addKeyBinding({
selector: '.jp-InputArea-editor',
keys: ['Shift Enter'],
command: 'run:cell'
});
}
window.addEventListener('load', main);