index.ts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /*-----------------------------------------------------------------------------
  2. | Copyright (c) 2014-2015, Jupyter Development Team.
  3. |
  4. | Distributed under the terms of the Modified BSD License.
  5. |----------------------------------------------------------------------------*/
  6. 'use strict';
  7. import {
  8. NotebookModel, NotebookPanel, NotebookManager,
  9. deserialize, selectKernel, trustNotebook, findKernel
  10. } from 'jupyter-js-notebook';
  11. import {
  12. ContentsManager, IKernelSpecIds, startNewSession,
  13. getKernelSpecs
  14. } from 'jupyter-js-services';
  15. import {
  16. RenderMime
  17. } from 'jupyter-js-ui/lib/rendermime';
  18. import {
  19. HTMLRenderer, LatexRenderer, ImageRenderer, TextRenderer,
  20. ConsoleTextRenderer, JavascriptRenderer, SVGRenderer
  21. } from 'jupyter-js-ui/lib/renderers';
  22. import {
  23. getBaseUrl
  24. } from 'jupyter-js-utils';
  25. import {
  26. CommandPalette, StandardPaletteModel, IStandardPaletteItemOptions
  27. } from 'phosphor-commandpalette';
  28. import {
  29. KeymapManager
  30. } from 'phosphor-keymap';
  31. import {
  32. SplitPanel
  33. } from 'phosphor-splitpanel';
  34. import {
  35. Widget
  36. } from 'phosphor-widget';
  37. import 'jupyter-js-notebook/lib/index.css';
  38. import 'jupyter-js-notebook/lib/theme.css';
  39. import 'jupyter-js-ui/lib/dialog/index.css';
  40. import 'jupyter-js-ui/lib/dialog/theme.css';
  41. let SERVER_URL = getBaseUrl();
  42. let NOTEBOOK = 'test.ipynb';
  43. function main(): void {
  44. // Initialize the keymap manager with the bindings.
  45. var keymap = new KeymapManager();
  46. // Setup the keydown listener for the document.
  47. document.addEventListener('keydown', event => {
  48. keymap.processKeydownEvent(event);
  49. });
  50. // TODO: check out static example from the history
  51. // and make that a separate example.
  52. let contents = new ContentsManager(SERVER_URL);
  53. let nbModel = new NotebookModel();
  54. let nbManager = new NotebookManager(nbModel, contents);
  55. let rendermime = new RenderMime<Widget>();
  56. const transformers = [
  57. new JavascriptRenderer(),
  58. new HTMLRenderer(),
  59. new ImageRenderer(),
  60. new SVGRenderer(),
  61. new LatexRenderer(),
  62. new ConsoleTextRenderer(),
  63. new TextRenderer()
  64. ];
  65. for (let t of transformers) {
  66. for (let m of t.mimetypes) {
  67. rendermime.order.push(m);
  68. rendermime.renderers[m] = t;
  69. }
  70. }
  71. let nbWidget = new NotebookPanel(nbManager, rendermime);
  72. nbWidget.title.text = NOTEBOOK;
  73. let pModel = new StandardPaletteModel();
  74. let palette = new CommandPalette();
  75. palette.model = pModel;
  76. let panel = new SplitPanel();
  77. panel.id = 'main';
  78. panel.orientation = SplitPanel.Horizontal;
  79. SplitPanel.setStretch(palette, 1);
  80. SplitPanel.setStretch(nbWidget, 2);
  81. panel.attach(document.body);
  82. panel.addChild(palette);
  83. panel.addChild(nbWidget);
  84. window.onresize = () => { panel.update(); };
  85. let kernelspecs: IKernelSpecIds;
  86. let items: IStandardPaletteItemOptions[] = [
  87. {
  88. category: 'Notebook',
  89. text: 'Save',
  90. shortcut: 'Accel S',
  91. handler: () => { nbManager.save() ; }
  92. },
  93. {
  94. category: 'Notebook',
  95. text: 'Switch Kernel',
  96. handler: () => {
  97. if (!kernelspecs) {
  98. return;
  99. }
  100. selectKernel(nbWidget.node, nbModel, kernelspecs);
  101. }
  102. },
  103. {
  104. category: 'Notebook',
  105. text: 'Interrupt Kernel',
  106. shortcut: 'I I',
  107. handler: () => { nbManager.interrupt() ; }
  108. },
  109. {
  110. category: 'Notebook',
  111. text: 'Restart Kernel',
  112. shortcut: '0 0',
  113. handler: () => { nbManager.restart() ; }
  114. },
  115. {
  116. category: 'Notebook',
  117. text: 'Trust Notebook',
  118. handler: () => {
  119. trustNotebook(nbModel, nbWidget.node);
  120. }
  121. },
  122. {
  123. category: 'Notebook Cell',
  124. text: 'Run and Advance',
  125. shortcut: 'Shift Enter',
  126. handler: () => { nbManager.runAndAdvance(); }
  127. },
  128. {
  129. category: 'Notebook Cell',
  130. text: 'Run Selected',
  131. handler: () => { nbManager.run(); }
  132. },
  133. {
  134. category: 'Notebook Cell',
  135. text: 'Run and Insert Below',
  136. handler: () => { nbManager.runAndInsert(); }
  137. },
  138. {
  139. category: 'Notebook Cell',
  140. text: 'To Edit Mode',
  141. handler: () => { nbModel.mode = 'edit'; }
  142. },
  143. {
  144. category: 'Notebook Cell',
  145. text: 'To Command Mode',
  146. handler: () => { nbModel.mode = 'command'; }
  147. },
  148. {
  149. category: 'Notebook Cell',
  150. text: 'Cut Selected',
  151. shortcut: 'X',
  152. handler: () => { nbManager.cut() ; }
  153. },
  154. {
  155. category: 'Notebook Cell',
  156. text: 'Copy Selected',
  157. shortcut: 'C',
  158. handler: () => { nbManager.copy() ; }
  159. },
  160. {
  161. category: 'Notebook Cell',
  162. text: 'Paste',
  163. shortcut: 'V',
  164. handler: () => { nbManager.paste() ; }
  165. },
  166. {
  167. category: 'Notebook Cell',
  168. text: 'Delete Selected',
  169. shortcut: 'D D',
  170. handler: () => { nbManager.delete() ; }
  171. },
  172. {
  173. category: 'Notebook Cell',
  174. text: 'Undo Cell Deletion',
  175. shortcut: 'Z',
  176. handler: () => { nbManager.undelete() ; }
  177. },
  178. {
  179. category: 'Notebook Cell',
  180. text: 'Insert Above',
  181. shortcut: 'A',
  182. handler: () => { nbManager.insertAbove() ; }
  183. },
  184. {
  185. category: 'Notebook Cell',
  186. text: 'Insert Below',
  187. shortcut: 'B',
  188. handler: () => { nbManager.insertBelow() ; }
  189. },
  190. {
  191. category: 'Notebook Cell',
  192. text: 'Extend Selection Above',
  193. shortcut: 'Accel J',
  194. handler: () => { nbManager.extendSelectionAbove() ; }
  195. },
  196. {
  197. category: 'Notebook Cell',
  198. text: 'Extend Selection Below',
  199. shortcut: 'Accel K',
  200. handler: () => { nbManager.extendSelectionBelow() ; }
  201. },
  202. {
  203. category: 'Notebook Cell',
  204. text: 'Merge Selected',
  205. shortcut: 'Shift M',
  206. handler: () => { nbManager.merge() ; }
  207. },
  208. {
  209. category: 'Notebook Cell',
  210. text: 'To Code Type',
  211. shortcut: 'Y',
  212. handler: () => { nbManager.changeCellType('code') ; }
  213. },
  214. {
  215. category: 'Notebook Cell',
  216. text: 'To Markdown Type',
  217. shortcut: 'M',
  218. handler: () => { nbManager.changeCellType('markdown') ; }
  219. },
  220. {
  221. category: 'Notebook Cell',
  222. text: 'To Raw Type',
  223. shortcut: 'R',
  224. handler: () => { nbManager.changeCellType('raw') ; }
  225. },
  226. {
  227. category: 'Notebook Cell',
  228. text: 'Select Previous',
  229. shortcut: 'ArrowUp',
  230. handler: () => { nbModel.activeCellIndex -= 1; }
  231. },
  232. {
  233. category: 'Notebook Cell',
  234. text: 'Select Next',
  235. shortcut: 'ArrowDown',
  236. handler: () => { nbModel.activeCellIndex += 1; }
  237. },
  238. ];
  239. pModel.addItems(items);
  240. let bindings = [
  241. {
  242. selector: '.jp-Notebook',
  243. sequence: ['Shift Enter'],
  244. handler: () => { nbManager.runAndAdvance(); }
  245. },
  246. {
  247. selector: '.jp-Notebook',
  248. sequence: ['Accel S'],
  249. handler: () => { nbManager.save(); }
  250. },
  251. {
  252. selector: '.jp-Notebook.jp-mod-commandMode',
  253. sequence: ['I', 'I'],
  254. handler: () => { nbManager.interrupt(); }
  255. },
  256. {
  257. selector: '.jp-Notebook.jp-mod-commandMode',
  258. sequence: ['0', '0'],
  259. handler: () => { nbManager.restart(); }
  260. },
  261. {
  262. selector: '.jp-Notebook.jp-mod-commandMode',
  263. sequence: ['Enter'],
  264. handler: () => { nbModel.mode = 'edit'; }
  265. },
  266. {
  267. selector: '.jp-Notebook.jp-mod-editMode',
  268. sequence: ['Escape'],
  269. handler: () => { nbModel.mode = 'command'; }
  270. },
  271. {
  272. selector: '.jp-Notebook.jp-mod-commandMode',
  273. sequence: ['Y'],
  274. handler: () => { nbManager.changeCellType('code'); }
  275. },
  276. {
  277. selector: '.jp-Notebook.jp-mod-commandMode',
  278. sequence: ['M'],
  279. handler: () => { nbManager.changeCellType('markdown'); }
  280. },
  281. {
  282. selector: '.jp-Notebook.jp-mod-commandMode',
  283. sequence: ['R'],
  284. handler: () => { nbManager.changeCellType('raw'); }
  285. },
  286. {
  287. selector: '.jp-Notebook.jp-mod-commandMode',
  288. sequence: ['X'],
  289. handler: () => { nbManager.cut(); }
  290. },
  291. {
  292. selector: '.jp-Notebook.jp-mod-commandMode',
  293. sequence: ['C'],
  294. handler: () => { nbManager.copy(); }
  295. },
  296. {
  297. selector: '.jp-Notebook.jp-mod-commandMode',
  298. sequence: ['V'],
  299. handler: () => { nbManager.paste(); }
  300. },
  301. {
  302. selector: '.jp-Notebook.jp-mod-commandMode',
  303. sequence: ['D', 'D'],
  304. handler: () => { nbManager.delete(); }
  305. },
  306. {
  307. selector: '.jp-Notebook.jp-mod-commandMode',
  308. sequence: ['Z'],
  309. handler: () => { nbManager.undelete(); }
  310. },
  311. {
  312. selector: '.jp-Notebook.jp-mod-commandMode',
  313. sequence: ['Shift M'],
  314. handler: () => { nbManager.merge(); }
  315. },
  316. {
  317. selector: '.jp-Notebook.jp-mod-commandMode',
  318. sequence: ['A'],
  319. handler: () => { nbManager.insertAbove(); }
  320. },
  321. {
  322. selector: '.jp-Notebook.jp-mod-commandMode',
  323. sequence: ['B'],
  324. handler: () => { nbManager.insertBelow(); }
  325. },
  326. {
  327. selector: '.jp-Notebook.jp-mod-commandMode',
  328. sequence: ['J'],
  329. handler: () => { nbModel.activeCellIndex += 1; }
  330. },
  331. {
  332. selector: '.jp-Notebook.jp-mod-commandMode',
  333. sequence: ['ArrowDown'],
  334. handler: () => { nbModel.activeCellIndex += 1; }
  335. },
  336. {
  337. selector: '.jp-Notebook.jp-mod-commandMode',
  338. sequence: ['K'],
  339. handler: () => { nbModel.activeCellIndex -= 1; }
  340. },
  341. {
  342. selector: '.jp-Notebook.jp-mod-commandMode',
  343. sequence: ['ArrowUp'],
  344. handler: () => { nbModel.activeCellIndex -= 1; }
  345. },
  346. {
  347. selector: '.jp-Notebook.jp-mod-commandMode',
  348. sequence: ['Shift K'],
  349. handler: () => { nbManager.extendSelectionAbove(); }
  350. },
  351. {
  352. selector: '.jp-Notebook.jp-mod-commandMode',
  353. sequence: ['Shift J'],
  354. handler: () => { nbManager.extendSelectionBelow(); }
  355. }
  356. ];
  357. keymap.add(bindings);
  358. contents.get(NOTEBOOK, {}).then(data => {
  359. deserialize(data.content, nbModel);
  360. getKernelSpecs({}).then(specs => {
  361. kernelspecs = specs;
  362. // start session
  363. startNewSession({
  364. notebookPath: NOTEBOOK,
  365. kernelName: findKernel(nbModel, specs),
  366. baseUrl: SERVER_URL
  367. }).then(session => {
  368. nbModel.session = session;
  369. });
  370. });
  371. });
  372. }
  373. window.onload = main;