plugin.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. 'use strict';
  4. import {
  5. AbstractFileHandler, FileBrowserWidget, FileHandler
  6. } from 'jupyter-js-filebrowser';
  7. import {
  8. IContentsModel
  9. } from 'jupyter-js-services';
  10. import {
  11. Container, Token
  12. } from 'phosphor-di';
  13. import {
  14. Widget
  15. } from 'phosphor-widget';
  16. import {
  17. IServicesProvider, IDocumentManager
  18. } from '../index';
  19. /**
  20. * Register the plugin contributions.
  21. *
  22. * @param container - The di container for type registration.
  23. *
  24. * #### Notes
  25. * This is called automatically when the plugin is loaded.
  26. */
  27. export
  28. function resolve(container: Container): Promise<AbstractFileHandler> {
  29. return container.resolve({
  30. requires: [IServicesProvider, IDocumentManager],
  31. create: (services: IServicesProvider, manager: IDocumentManager) => {
  32. let handler = new ImageHandler(services.contentsManager);
  33. manager.register(handler);
  34. return handler;
  35. }
  36. });
  37. }
  38. class ImageHandler extends AbstractFileHandler {
  39. /**
  40. * Get the list of file extensions explicitly supported by the handler.
  41. */
  42. get fileExtensions(): string[] {
  43. return ['.png', '.gif', '.jpeg', '.jpg', '.svg', '.bmp', '.ico', '.xbm',
  44. '.tiff', '.tif']
  45. }
  46. /**
  47. * Get file contents given a path.
  48. */
  49. protected getContents(model: IContentsModel): Promise<IContentsModel> {
  50. return this.manager.get(model.path, { type: 'file' });
  51. }
  52. /**
  53. * Create the widget from an `IContentsModel`.
  54. */
  55. protected createWidget(model: IContentsModel): Widget {
  56. let ext = model.path.split('.').pop();
  57. var widget = new Widget();
  58. widget.node.tabIndex = 0;
  59. let image = document.createElement('img');
  60. widget.node.appendChild(image);
  61. widget.node.style.overflowX = 'auto';
  62. widget.node.style.overflowY = 'auto';
  63. widget.title.text = model.name;
  64. return widget;
  65. }
  66. /**
  67. * Populate a widget from `IContentsModel`.
  68. */
  69. protected setState(widget: Widget, model: IContentsModel): Promise<void> {
  70. return new Promise<void>((resolve, reject) => {
  71. let img = widget.node.firstChild as HTMLImageElement;
  72. img.addEventListener('load', () => {
  73. resolve(void 0);
  74. });
  75. img.addEventListener('error', error => {
  76. reject(error);
  77. });
  78. img.src = `data:${model.mimetype};${model.format},${model.content}`;;
  79. });
  80. }
  81. /**
  82. * Get the state of the Widget, returns `undefined`.
  83. */
  84. protected getState(widget: Widget): Promise<IContentsModel> {
  85. return Promise.resolve(void 0);
  86. }
  87. }