index.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. /**
  4. * @packageDocumentation
  5. * @module json-extension
  6. */
  7. import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
  8. import { Printing } from '@jupyterlab/apputils';
  9. import { nullTranslator, ITranslator } from '@jupyterlab/translation';
  10. import { Message } from '@lumino/messaging';
  11. import { Widget } from '@lumino/widgets';
  12. import * as React from 'react';
  13. import * as ReactDOM from 'react-dom';
  14. import { Component } from './component';
  15. import { JSONValue, JSONObject } from '@lumino/coreutils';
  16. /**
  17. * The CSS class to add to the JSON Widget.
  18. */
  19. const CSS_CLASS = 'jp-RenderedJSON';
  20. /**
  21. * The MIME type for JSON.
  22. */
  23. export const MIME_TYPE = 'application/json';
  24. /**
  25. * A renderer for JSON data.
  26. */
  27. export class RenderedJSON
  28. extends Widget
  29. implements IRenderMime.IRenderer, Printing.IPrintable {
  30. /**
  31. * Create a new widget for rendering JSON.
  32. */
  33. constructor(options: IRenderMime.IRendererOptions) {
  34. super();
  35. this.addClass(CSS_CLASS);
  36. this.addClass('CodeMirror');
  37. this.addClass('cm-s-jupyter');
  38. this._mimeType = options.mimeType;
  39. this.translator = options.translator || nullTranslator;
  40. }
  41. [Printing.symbol]() {
  42. return () => Printing.printWidget(this);
  43. }
  44. /**
  45. * Render JSON into this widget's node.
  46. */
  47. renderModel(model: IRenderMime.IMimeModel): Promise<void> {
  48. const data = (model.data[this._mimeType] || {}) as NonNullable<JSONValue>;
  49. const metadata = (model.metadata[this._mimeType] || {}) as JSONObject;
  50. return new Promise<void>((resolve, reject) => {
  51. ReactDOM.render(
  52. <Component
  53. data={data}
  54. metadata={metadata}
  55. translator={this.translator}
  56. />,
  57. this.node,
  58. () => {
  59. resolve();
  60. }
  61. );
  62. });
  63. }
  64. /**
  65. * Called before the widget is detached from the DOM.
  66. */
  67. protected onBeforeDetach(msg: Message): void {
  68. // Unmount the component so it can tear down.
  69. ReactDOM.unmountComponentAtNode(this.node);
  70. }
  71. translator: ITranslator;
  72. private _mimeType: string;
  73. }
  74. /**
  75. * A mime renderer factory for JSON data.
  76. */
  77. export const rendererFactory: IRenderMime.IRendererFactory = {
  78. safe: true,
  79. mimeTypes: [MIME_TYPE],
  80. createRenderer: options => new RenderedJSON(options)
  81. };
  82. const extensions: IRenderMime.IExtension | IRenderMime.IExtension[] = [
  83. {
  84. id: '@jupyterlab/json-extension:factory',
  85. rendererFactory,
  86. rank: 0,
  87. dataType: 'json',
  88. documentWidgetFactoryOptions: {
  89. name: 'JSON',
  90. primaryFileType: 'json',
  91. fileTypes: ['json', 'notebook', 'geojson'],
  92. defaultFor: ['json']
  93. }
  94. }
  95. ];
  96. export default extensions;