From f18cf90b83920443e1bc69a8653092828de057a2 Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Tue, 29 Aug 2023 11:50:25 +0100 Subject: [PATCH] Store SVG for printing/export --- src/index.ts | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index e892a73..d81d77e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,6 +28,10 @@ const MIME_TYPE = 'application/x.dagitty.dag'; */ const CLASS_NAME = 'mimerenderer-dagitty-dag'; + +const SVG_MIME = 'image/svg+xml'; + + /** * A widget for rendering Dagitty DAG. */ @@ -41,6 +45,7 @@ export class OutputWidget extends Widget implements IRenderMime.IRenderer { private _offsetWidth: number; private _offsetHeight: number; private _inDrag: boolean; + private _lastModel: IRenderMime.IMimeModel | undefined; /** * Construct a new output widget. @@ -61,6 +66,10 @@ export class OutputWidget extends Widget implements IRenderMime.IRenderer { * Render Dagitty DAG into this widget's node. */ renderModel(model: IRenderMime.IMimeModel): Promise { + if (this._lastModel) { + return; + } + this._lastModel = model; const data = model.data[this._mimeType] as string; const metadata = model.metadata as any; for (const argument of ['width', 'height']) { @@ -87,9 +96,39 @@ export class OutputWidget extends Widget implements IRenderMime.IRenderer { this.setDragListeners(); } + this._createSvgFallback(); + return Promise.resolve(); } + private _createSvgFallback() { + const model = this._lastModel; + if (!model) { + return; + } + + const svg = this.node.querySelector('svg'); + //svg.setAttribute('width', model.metadata['width'] ? model.metadata['width'] + '' : '700px'); + //svg.setAttribute('height', model.metadata['height'] ? model.metadata['height'] + '' : '400px'); + /* + document.body.appendChild(svg); + this.dagController.getView().drawGraph(); + this.dagController.getView().resize(); + this.node.appendChild(svg); + */ + + if (model.data[SVG_MIME] === svg.outerHTML) { + return + } + + if (svg) { + model.setData({ + data: { ...model.data, [SVG_MIME]: svg.outerHTML }, + metadata: model.metadata + }) + } + } + private _maybeUpdatePositions() { if (this._arePositionsOutdated) { this._updatePositions(); @@ -129,6 +168,7 @@ export class OutputWidget extends Widget implements IRenderMime.IRenderer { onUpdateRequest(message: Message): void { this._arePositionsOutdated = true; + this._createSvgFallback() } /** @@ -344,7 +384,7 @@ export const rendererFactory: IRenderMime.IRendererFactory = { const extension: IRenderMime.IExtension = { id: 'jupyterlab-dagitty:plugin', rendererFactory, - rank: 100, + rank: 50, dataType: 'string', fileTypes: [ {