index.ts 9.7 KB

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