index.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import {
  4. NotebookPanel, NotebookWidgetFactory,
  5. NotebookModelFactory, NotebookActions
  6. } from 'jupyterlab/lib/notebook';
  7. import {
  8. CodeMirrorNotebookPanelRenderer
  9. } from 'jupyterlab/lib/notebook/codemirror/notebook/panel';
  10. import {
  11. IServiceManager, createServiceManager
  12. } from 'jupyter-js-services';
  13. import {
  14. DocumentManager
  15. } from 'jupyterlab/lib/docmanager';
  16. import {
  17. DocumentRegistry, restartKernel, selectKernelForContext
  18. } from 'jupyterlab/lib/docregistry';
  19. import {
  20. RenderMime
  21. } from 'jupyterlab/lib/rendermime';
  22. import {
  23. HTMLRenderer, LatexRenderer, ImageRenderer, TextRenderer,
  24. JavascriptRenderer, SVGRenderer, MarkdownRenderer
  25. } from 'jupyterlab/lib/renderers';
  26. import {
  27. defaultSanitizer
  28. } from 'jupyterlab/lib/sanitizer';
  29. import {
  30. MimeData
  31. } from 'phosphor/lib/core/mimedata';
  32. import {
  33. CommandRegistry
  34. } from 'phosphor/lib/ui/commandregistry';
  35. import {
  36. CommandPalette
  37. } from 'phosphor/lib/ui/commandpalette';
  38. import {
  39. Keymap
  40. } from 'phosphor/lib/ui/keymap';
  41. import {
  42. SplitPanel
  43. } from 'phosphor/lib/ui/splitpanel';
  44. import {
  45. Widget
  46. } from 'phosphor/lib/ui/widget';
  47. import 'jupyterlab/lib/basestyle/index.css';
  48. import 'jupyterlab/lib/default-theme/index.css';
  49. import '../index.css';
  50. let NOTEBOOK = 'test.ipynb';
  51. /**
  52. * The map of command ids used by the notebook.
  53. */
  54. const cmdIds = {
  55. save: 'notebook:save',
  56. interrupt: 'notebook:interrupt-kernel',
  57. restart: 'notebook:restart-kernel',
  58. switchKernel: 'notebook:switch-kernel',
  59. runAndAdvance: 'notebook-cells:run-and-advance',
  60. deleteCell: 'notebook-cells:delete',
  61. selectAbove: 'notebook-cells:select-above',
  62. selectBelow: 'notebook-cells:select-below',
  63. extendAbove: 'notebook-cells:extend-above',
  64. extendBelow: 'notebook-cells:extend-below',
  65. editMode: 'notebook:edit-mode',
  66. merge: 'notebook-cells:merge',
  67. split: 'notebook-cells:split',
  68. commandMode: 'notebook:command-mode',
  69. undo: 'notebook-cells:undo',
  70. redo: 'notebook-cells:redo'
  71. };
  72. function main(): void {
  73. createServiceManager().then(manager => {
  74. createApp(manager);
  75. });
  76. }
  77. function createApp(manager: IServiceManager): void {
  78. // Initialize the keymap manager with the bindings.
  79. let commands = new CommandRegistry();
  80. let keymap = new Keymap({ commands });
  81. let useCapture = true;
  82. // Setup the keydown listener for the document.
  83. document.addEventListener('keydown', event => {
  84. keymap.processKeydownEvent(event);
  85. }, useCapture);
  86. const transformers = [
  87. new JavascriptRenderer(),
  88. new MarkdownRenderer(),
  89. new HTMLRenderer(),
  90. new ImageRenderer(),
  91. new SVGRenderer(),
  92. new LatexRenderer(),
  93. new TextRenderer()
  94. ];
  95. let renderers: RenderMime.MimeMap<RenderMime.IRenderer> = {};
  96. let order: string[] = [];
  97. for (let t of transformers) {
  98. for (let m of t.mimetypes) {
  99. renderers[m] = t;
  100. order.push(m);
  101. }
  102. }
  103. let sanitizer = defaultSanitizer;
  104. let rendermime = new RenderMime({ renderers, order, sanitizer });
  105. let opener = {
  106. open: (widget: Widget) => {
  107. // Do nothing for sibling widgets for now.
  108. }
  109. };
  110. let docRegistry = new DocumentRegistry();
  111. let docManager = new DocumentManager({
  112. registry: docRegistry,
  113. manager,
  114. opener
  115. });
  116. let mFactory = new NotebookModelFactory();
  117. let clipboard = new MimeData();
  118. let renderer = CodeMirrorNotebookPanelRenderer.defaultRenderer;
  119. let wFactory = new NotebookWidgetFactory(rendermime, clipboard, renderer);
  120. docRegistry.addModelFactory(mFactory);
  121. docRegistry.addWidgetFactory(wFactory, {
  122. displayName: 'Notebook',
  123. modelName: 'notebook',
  124. fileExtensions: ['.ipynb'],
  125. defaultFor: ['.ipynb'],
  126. preferKernel: true,
  127. canStartKernel: true
  128. });
  129. let nbWidget = docManager.open(NOTEBOOK) as NotebookPanel;
  130. let palette = new CommandPalette({ commands, keymap });
  131. let panel = new SplitPanel();
  132. panel.id = 'main';
  133. panel.orientation = 'horizontal';
  134. panel.spacing = 0;
  135. SplitPanel.setStretch(palette, 0);
  136. panel.addWidget(palette);
  137. panel.addWidget(nbWidget);
  138. Widget.attach(panel, document.body);
  139. SplitPanel.setStretch(nbWidget, 1);
  140. window.onresize = () => panel.update();
  141. commands.addCommand(cmdIds.save, {
  142. label: 'Save',
  143. execute: () => nbWidget.context.save()
  144. });
  145. commands.addCommand(cmdIds.interrupt, {
  146. label: 'Interrupt',
  147. execute: () => {
  148. if (nbWidget.context.kernel) {
  149. nbWidget.context.kernel.interrupt();
  150. }
  151. }
  152. });
  153. commands.addCommand(cmdIds.restart, {
  154. label: 'Restart Kernel',
  155. execute: () => restartKernel(nbWidget.kernel, nbWidget.node)
  156. });
  157. commands.addCommand(cmdIds.switchKernel, {
  158. label: 'Switch Kernel',
  159. execute: () => selectKernelForContext(nbWidget.context, nbWidget.node)
  160. });
  161. commands.addCommand(cmdIds.runAndAdvance, {
  162. label: 'Run and Advance',
  163. execute: () => {
  164. NotebookActions.runAndAdvance(nbWidget.content, nbWidget.context.kernel);
  165. }
  166. });
  167. commands.addCommand(cmdIds.editMode, {
  168. label: 'Edit Mode',
  169. execute: () => { nbWidget.content.mode = 'edit'; }
  170. });
  171. commands.addCommand(cmdIds.commandMode, {
  172. label: 'Command Mode',
  173. execute: () => { nbWidget.content.mode = 'command'; }
  174. });
  175. commands.addCommand(cmdIds.selectBelow, {
  176. label: 'Select Below',
  177. execute: () => NotebookActions.selectBelow(nbWidget.content)
  178. });
  179. commands.addCommand(cmdIds.selectAbove, {
  180. label: 'Select Above',
  181. execute: () => NotebookActions.selectAbove(nbWidget.content)
  182. });
  183. commands.addCommand(cmdIds.extendAbove, {
  184. label: 'Extend Above',
  185. execute: () => NotebookActions.extendSelectionAbove(nbWidget.content)
  186. });
  187. commands.addCommand(cmdIds.extendBelow, {
  188. label: 'Extend Below',
  189. execute: () => NotebookActions.extendSelectionBelow(nbWidget.content)
  190. });
  191. commands.addCommand(cmdIds.merge, {
  192. label: 'Merge Cells',
  193. execute: () => NotebookActions.mergeCells(nbWidget.content)
  194. });
  195. commands.addCommand(cmdIds.split, {
  196. label: 'Split Cell',
  197. execute: () => NotebookActions.splitCell(nbWidget.content)
  198. });
  199. commands.addCommand(cmdIds.undo, {
  200. label: 'Undo',
  201. execute: () => NotebookActions.undo(nbWidget.content)
  202. });
  203. commands.addCommand(cmdIds.redo, {
  204. label: 'Redo',
  205. execute: () => NotebookActions.redo(nbWidget.content)
  206. });
  207. let category = 'Notebook Operations';
  208. [
  209. cmdIds.interrupt,
  210. cmdIds.restart,
  211. cmdIds.editMode,
  212. cmdIds.commandMode,
  213. cmdIds.switchKernel
  214. ].forEach(command => palette.addItem({ command, category }));
  215. category = 'Notebook Cell Operations';
  216. [
  217. cmdIds.runAndAdvance,
  218. cmdIds.split,
  219. cmdIds.merge,
  220. cmdIds.selectAbove,
  221. cmdIds.selectBelow,
  222. cmdIds.extendAbove,
  223. cmdIds.extendBelow,
  224. cmdIds.undo,
  225. cmdIds.redo
  226. ].forEach(command => palette.addItem({ command, category }));
  227. let bindings = [
  228. {
  229. selector: '.jp-Notebook',
  230. keys: ['Shift Enter'],
  231. command: cmdIds.runAndAdvance
  232. },
  233. {
  234. selector: '.jp-Notebook',
  235. keys: ['Accel S'],
  236. command: cmdIds.save
  237. },
  238. {
  239. selector: '.jp-Notebook.jp-mod-commandMode',
  240. keys: ['I', 'I'],
  241. command: cmdIds.interrupt
  242. },
  243. {
  244. selector: '.jp-Notebook.jp-mod-commandMode',
  245. keys: ['0', '0'],
  246. command: cmdIds.restart
  247. },
  248. {
  249. selector: '.jp-Notebook.jp-mod-commandMode',
  250. keys: ['Enter'],
  251. command: cmdIds.editMode
  252. },
  253. {
  254. selector: '.jp-Notebook.jp-mod-editMode',
  255. keys: ['Escape'],
  256. command: cmdIds.commandMode
  257. },
  258. {
  259. selector: '.jp-Notebook.jp-mod-commandMode',
  260. keys: ['Shift M'],
  261. command: cmdIds.merge
  262. },
  263. {
  264. selector: '.jp-Notebook.jp-mod-editMode',
  265. keys: ['Ctrl Shift -'],
  266. command: cmdIds.split
  267. },
  268. {
  269. selector: '.jp-Notebook.jp-mod-commandMode',
  270. keys: ['J'],
  271. command: cmdIds.selectBelow
  272. },
  273. {
  274. selector: '.jp-Notebook.jp-mod-commandMode',
  275. keys: ['ArrowDown'],
  276. command: cmdIds.selectBelow
  277. },
  278. {
  279. selector: '.jp-Notebook.jp-mod-commandMode',
  280. keys: ['K'],
  281. command: cmdIds.selectAbove
  282. },
  283. {
  284. selector: '.jp-Notebook.jp-mod-commandMode',
  285. keys: ['ArrowUp'],
  286. command: cmdIds.selectAbove
  287. },
  288. {
  289. selector: '.jp-Notebook.jp-mod-commandMode',
  290. keys: ['Shift K'],
  291. command: cmdIds.extendAbove
  292. },
  293. {
  294. selector: '.jp-Notebook.jp-mod-commandMode',
  295. keys: ['Shift J'],
  296. command: cmdIds.extendBelow
  297. },
  298. {
  299. selector: '.jp-Notebook.jp-mod-commandMode',
  300. keys: ['Z'],
  301. command: cmdIds.undo
  302. },
  303. {
  304. selector: '.jp-Notebook.jp-mod-commandMode',
  305. keys: ['Y'],
  306. command: cmdIds.redo
  307. }
  308. ];
  309. bindings.map(binding => keymap.addBinding(binding));
  310. }
  311. window.onload = main;