@jupyterlab/mermaid 4.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @jupyterlab/mermaid
2
+
3
+ A JupyterLab provider rendering Mermaid text-based diagrams.
package/lib/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * @module mermaid
4
+ */
5
+ export * from './manager';
6
+ export * from './markdown';
7
+ export * from './mime';
8
+ export * from './tokens';
package/lib/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+ /**
4
+ * @packageDocumentation
5
+ * @module mermaid
6
+ */
7
+ export * from './manager';
8
+ export * from './markdown';
9
+ export * from './mime';
10
+ export * from './tokens';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAC3D;;;GAGG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type MermaidType from 'mermaid';
2
+ import { LruCache } from '@jupyterlab/coreutils';
3
+ import { IThemeManager } from '@jupyterlab/apputils';
4
+ import { IMermaidManager } from './tokens';
5
+ /**
6
+ * A mermaid diagram manager with cache.
7
+ */
8
+ export declare class MermaidManager implements IMermaidManager {
9
+ protected _diagrams: LruCache<string, HTMLElement>;
10
+ protected _themes: IThemeManager | null;
11
+ constructor(options?: MermaidManager.IOptions);
12
+ /**
13
+ * Handle (re)-initializing mermaid based on external values.
14
+ */
15
+ initialize(): void;
16
+ /**
17
+ * Get the underlying, potentially un-initialized mermaid module.
18
+ */
19
+ getMermaid(): Promise<typeof MermaidType>;
20
+ /**
21
+ * Get the version of the currently-loaded mermaid module
22
+ */
23
+ getMermaidVersion(): string | null;
24
+ /**
25
+ * Get a pre-cached mermaid figure.
26
+ *
27
+ * This primarily exists for the needs of `marked`, which supports async node
28
+ * visitors, but not async rendering.
29
+ */
30
+ getCachedFigure(text: string): HTMLElement | null;
31
+ /**
32
+ * Attempt a raw rendering of mermaid to an SVG string, extracting some metadata.
33
+ */
34
+ renderSvg(text: string): Promise<IMermaidManager.IRenderInfo>;
35
+ /**
36
+ * Provide and cache a fully-rendered element, checking the cache first.
37
+ */
38
+ renderFigure(text: string): Promise<HTMLElement>;
39
+ /**
40
+ * Provide a code block with the mermaid source.
41
+ */
42
+ makeMermaidCode(text: string): HTMLElement;
43
+ /**
44
+ * Get the parser message element from a failed parse.
45
+ *
46
+ * This doesn't do much of anything if the text is successfully parsed.
47
+ */
48
+ makeMermaidError(text: string): Promise<HTMLElement>;
49
+ /**
50
+ * Extract extra attributes to add to a generated figure.
51
+ */
52
+ makeMermaidFigure(info: IMermaidManager.IRenderInfo): HTMLElement;
53
+ }
54
+ /**
55
+ * A namespace for implementation-specific details of this mermaid manager.
56
+ */
57
+ export declare namespace MermaidManager {
58
+ /**
59
+ * Initialization options for the mermaid manager.
60
+ */
61
+ interface IOptions {
62
+ maxCacheSize?: number | null;
63
+ themes?: IThemeManager | null;
64
+ }
65
+ }
package/lib/manager.js ADDED
@@ -0,0 +1,258 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+ import { PromiseDelegate } from '@lumino/coreutils';
4
+ import { LruCache } from '@jupyterlab/coreutils';
5
+ import { DETAILS_CLASS, MERMAID_CLASS, MERMAID_CODE_CLASS, MERMAID_DARK_THEME, MERMAID_DEFAULT_THEME, SUMMARY_CLASS, WARNING_CLASS } from './tokens';
6
+ /**
7
+ * A mermaid diagram manager with cache.
8
+ */
9
+ export class MermaidManager {
10
+ constructor(options = {}) {
11
+ this._diagrams = new LruCache({ maxSize: options.maxCacheSize || null });
12
+ // handle reacting to themes
13
+ if (options.themes) {
14
+ Private.initThemes(options.themes || null);
15
+ options.themes.themeChanged.connect(this.initialize, this);
16
+ }
17
+ }
18
+ /**
19
+ * Handle (re)-initializing mermaid based on external values.
20
+ */
21
+ initialize() {
22
+ this._diagrams.clear();
23
+ Private.initMermaid();
24
+ }
25
+ /**
26
+ * Get the underlying, potentially un-initialized mermaid module.
27
+ */
28
+ async getMermaid() {
29
+ return await Private.ensureMermaid();
30
+ }
31
+ /**
32
+ * Get the version of the currently-loaded mermaid module
33
+ */
34
+ getMermaidVersion() {
35
+ return Private.version();
36
+ }
37
+ /**
38
+ * Get a pre-cached mermaid figure.
39
+ *
40
+ * This primarily exists for the needs of `marked`, which supports async node
41
+ * visitors, but not async rendering.
42
+ */
43
+ getCachedFigure(text) {
44
+ return this._diagrams.get(text);
45
+ }
46
+ /**
47
+ * Attempt a raw rendering of mermaid to an SVG string, extracting some metadata.
48
+ */
49
+ async renderSvg(text) {
50
+ const _mermaid = await this.getMermaid();
51
+ const id = `jp-mermaid-${Private.nextMermaidId()}`;
52
+ // create temporary element into which to render
53
+ const el = document.createElement('div');
54
+ document.body.appendChild(el);
55
+ try {
56
+ const { svg } = await _mermaid.render(id, text, el);
57
+ const parser = new DOMParser();
58
+ const doc = parser.parseFromString(svg, 'image/svg+xml');
59
+ const info = { text, svg };
60
+ const svgEl = doc.querySelector('svg');
61
+ const { maxWidth } = (svgEl === null || svgEl === void 0 ? void 0 : svgEl.style) || {};
62
+ info.width = maxWidth ? parseFloat(maxWidth) : null;
63
+ const firstTitle = doc.querySelector('title');
64
+ const firstDesc = doc.querySelector('desc');
65
+ if (firstTitle) {
66
+ info.accessibleTitle = firstTitle.textContent;
67
+ }
68
+ if (firstDesc) {
69
+ info.accessibleDescription = firstDesc.textContent;
70
+ }
71
+ return info;
72
+ }
73
+ finally {
74
+ el.remove();
75
+ }
76
+ }
77
+ /**
78
+ * Provide and cache a fully-rendered element, checking the cache first.
79
+ */
80
+ async renderFigure(text) {
81
+ // bail if already cached
82
+ let output = this._diagrams.get(text);
83
+ if (output != null) {
84
+ return output;
85
+ }
86
+ let className = MERMAID_CLASS;
87
+ let result = null;
88
+ // the element that will be returned
89
+ output = document.createElement('div');
90
+ output.className = className;
91
+ try {
92
+ const response = await this.renderSvg(text);
93
+ result = this.makeMermaidFigure(response);
94
+ }
95
+ catch (err) {
96
+ output.classList.add(WARNING_CLASS);
97
+ result = await this.makeMermaidError(text);
98
+ }
99
+ let version = this.getMermaidVersion();
100
+ if (version) {
101
+ result.dataset.jpMermaidVersion = version;
102
+ }
103
+ output.appendChild(result);
104
+ // update the cache for use when rendering synchronously
105
+ this._diagrams.set(text, output);
106
+ return output;
107
+ }
108
+ /**
109
+ * Provide a code block with the mermaid source.
110
+ */
111
+ makeMermaidCode(text) {
112
+ // append the source
113
+ const pre = document.createElement('pre');
114
+ const code = document.createElement('code');
115
+ code.innerText = text;
116
+ pre.appendChild(code);
117
+ code.className = MERMAID_CODE_CLASS;
118
+ code.textContent = text;
119
+ return pre;
120
+ }
121
+ /**
122
+ * Get the parser message element from a failed parse.
123
+ *
124
+ * This doesn't do much of anything if the text is successfully parsed.
125
+ */
126
+ async makeMermaidError(text) {
127
+ const _mermaid = await this.getMermaid();
128
+ let errorMessage = '';
129
+ try {
130
+ await _mermaid.parse(text);
131
+ }
132
+ catch (err) {
133
+ errorMessage = `${err}`;
134
+ }
135
+ const result = document.createElement('details');
136
+ result.className = DETAILS_CLASS;
137
+ const summary = document.createElement('summary');
138
+ summary.className = SUMMARY_CLASS;
139
+ summary.appendChild(this.makeMermaidCode(text));
140
+ result.appendChild(summary);
141
+ const warning = document.createElement('pre');
142
+ warning.innerText = errorMessage;
143
+ result.appendChild(warning);
144
+ return result;
145
+ }
146
+ /**
147
+ * Extract extra attributes to add to a generated figure.
148
+ */
149
+ makeMermaidFigure(info) {
150
+ const figure = document.createElement('figure');
151
+ const img = document.createElement('img');
152
+ figure.appendChild(img);
153
+ img.setAttribute('src', `data:image/svg+xml,${encodeURIComponent(info.svg)}`);
154
+ // add dimension information
155
+ if (info.width) {
156
+ img.width = info.width;
157
+ }
158
+ // add accessible alt title
159
+ if (info.accessibleTitle) {
160
+ img.setAttribute('alt', info.accessibleTitle);
161
+ }
162
+ figure.appendChild(this.makeMermaidCode(info.text));
163
+ // add accessible caption, with fallback to raw mermaid source
164
+ if (info.accessibleDescription) {
165
+ const caption = document.createElement('figcaption');
166
+ caption.className = 'sr-only';
167
+ caption.textContent = info.accessibleDescription;
168
+ figure.appendChild(caption);
169
+ }
170
+ return figure;
171
+ }
172
+ }
173
+ /**
174
+ * A namespace for global, private mermaid data.
175
+ */
176
+ var Private;
177
+ (function (Private) {
178
+ let _themes = null;
179
+ let _mermaid = null;
180
+ let _loading = null;
181
+ let _nextMermaidId = 0;
182
+ let _version = null;
183
+ /**
184
+ * Cache a reference to the theme manager.
185
+ */
186
+ function initThemes(themes) {
187
+ _themes = themes;
188
+ }
189
+ Private.initThemes = initThemes;
190
+ /**
191
+ * Get the version of mermaid used for rendering.
192
+ */
193
+ function version() {
194
+ return _version;
195
+ }
196
+ Private.version = version;
197
+ /**
198
+ * (Re-)initialize mermaid with lab-specific theme information
199
+ */
200
+ function initMermaid() {
201
+ if (!_mermaid) {
202
+ return false;
203
+ }
204
+ let theme = MERMAID_DEFAULT_THEME;
205
+ if (_themes) {
206
+ const jpTheme = _themes.theme;
207
+ theme =
208
+ jpTheme && _themes.isLight(jpTheme)
209
+ ? MERMAID_DEFAULT_THEME
210
+ : MERMAID_DARK_THEME;
211
+ }
212
+ const fontFamily = window
213
+ .getComputedStyle(document.body)
214
+ .getPropertyValue('--jp-ui-font-family');
215
+ _mermaid.mermaidAPI.globalReset();
216
+ _mermaid.mermaidAPI.initialize({
217
+ theme,
218
+ fontFamily,
219
+ maxTextSize: 100000,
220
+ startOnLoad: false
221
+ });
222
+ return true;
223
+ }
224
+ Private.initMermaid = initMermaid;
225
+ /**
226
+ * Determine whether mermaid has been loaded yet.
227
+ */
228
+ function getMermaid() {
229
+ return _mermaid;
230
+ }
231
+ Private.getMermaid = getMermaid;
232
+ /**
233
+ * Provide a globally-unique, but unstable, ID for disambiguation.
234
+ */
235
+ function nextMermaidId() {
236
+ return _nextMermaidId++;
237
+ }
238
+ Private.nextMermaidId = nextMermaidId;
239
+ /**
240
+ * Ensure mermaid has been lazily loaded once, initialized, and cached.
241
+ */
242
+ async function ensureMermaid() {
243
+ if (_mermaid != null) {
244
+ return _mermaid;
245
+ }
246
+ if (_loading) {
247
+ return _loading.promise;
248
+ }
249
+ _loading = new PromiseDelegate();
250
+ _version = (await import('mermaid/package.json')).version;
251
+ _mermaid = (await import('mermaid')).default;
252
+ initMermaid();
253
+ _loading.resolve(_mermaid);
254
+ return _mermaid;
255
+ }
256
+ Private.ensureMermaid = ensureMermaid;
257
+ })(Private || (Private = {}));
258
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { IMermaidManager, IMermaidMarkdown } from './tokens';
2
+ /**
3
+ * An implementation of mermaid fenced code blocks in markdown.
4
+ */
5
+ export declare class MermaidMarkdown implements IMermaidMarkdown {
6
+ protected _mermaid: IMermaidManager;
7
+ readonly languages: string[];
8
+ readonly rank = 100;
9
+ constructor(options: MermaidMarkdown.IOptions);
10
+ /**
11
+ * Pre-parse and cache the rendered text.
12
+ */
13
+ walk(text: string): Promise<void>;
14
+ /**
15
+ * Render the diagram.
16
+ */
17
+ render(text: string): string | null;
18
+ }
19
+ /**
20
+ * A namespace for mermaid markdown
21
+ */
22
+ export declare namespace MermaidMarkdown {
23
+ /**
24
+ * Initialization options for mermaid markdown
25
+ */
26
+ interface IOptions {
27
+ mermaid: IMermaidManager;
28
+ }
29
+ }
@@ -0,0 +1,30 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+ /**
4
+ * An implementation of mermaid fenced code blocks in markdown.
5
+ */
6
+ export class MermaidMarkdown {
7
+ constructor(options) {
8
+ this.languages = ['mermaid'];
9
+ this.rank = 100;
10
+ this._mermaid = options.mermaid;
11
+ }
12
+ /**
13
+ * Pre-parse and cache the rendered text.
14
+ */
15
+ async walk(text) {
16
+ await this._mermaid.renderFigure(text);
17
+ }
18
+ /**
19
+ * Render the diagram.
20
+ */
21
+ render(text) {
22
+ // handle pre-cached mermaid figures
23
+ let cachedFigure = this._mermaid.getCachedFigure(text);
24
+ if (cachedFigure) {
25
+ return cachedFigure.outerHTML;
26
+ }
27
+ return null;
28
+ }
29
+ }
30
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAI3D;;GAEG;AACH,MAAM,OAAO,eAAe;IAK1B,YAAY,OAAiC;QAHpC,cAAS,GAAG,CAAC,SAAS,CAAC,CAAC;QACxB,SAAI,GAAG,GAAG,CAAC;QAGlB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAY;QACjB,oCAAoC;QACpC,IAAI,YAAY,GAAuB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,YAAY,EAAE;YAChB,OAAO,YAAY,CAAC,SAAS,CAAC;SAC/B;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
package/lib/mime.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * @module mermaid-extension
4
+ */
5
+ import { IMermaidManager } from './tokens';
6
+ import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
7
+ import { PromiseDelegate } from '@lumino/coreutils';
8
+ import { Widget } from '@lumino/widgets';
9
+ /**
10
+ * A widget for rendering mermaid text-based diagrams, for usage with rendermime.
11
+ */
12
+ export declare class RenderedMermaid extends Widget implements IRenderMime.IRenderer {
13
+ protected static _manager: IMermaidManager | null;
14
+ protected static _managerReady: PromiseDelegate<IMermaidManager>;
15
+ protected _lastRendered: string | null;
16
+ /**
17
+ * Create a new widget for rendering Vega/Vega-Lite.
18
+ */
19
+ constructor(options: IRenderMime.IRendererOptions);
20
+ static set manager(manager: IMermaidManager);
21
+ /**
22
+ * Render mermaid text-based diagrams into this widget's node.
23
+ */
24
+ renderModel(model: IRenderMime.IMimeModel): Promise<void>;
25
+ private _mimeType;
26
+ }
27
+ /**
28
+ * A mime renderer factory for mermaid text-based diagrams.
29
+ */
30
+ export declare const rendererFactory: IRenderMime.IRendererFactory;
package/lib/mime.js ADDED
@@ -0,0 +1,98 @@
1
+ /* -----------------------------------------------------------------------------
2
+ | Copyright (c) Jupyter Development Team.
3
+ | Distributed under the terms of the Modified BSD License.
4
+ |----------------------------------------------------------------------------*/
5
+ /**
6
+ * @packageDocumentation
7
+ * @module mermaid-extension
8
+ */
9
+ import { MERMAID_CLASS, MERMAID_MIME_TYPE, WARNING_CLASS } from './tokens';
10
+ import { PromiseDelegate } from '@lumino/coreutils';
11
+ import { Widget } from '@lumino/widgets';
12
+ const SVG_MIME = 'image/svg+xml';
13
+ /**
14
+ * A widget for rendering mermaid text-based diagrams, for usage with rendermime.
15
+ */
16
+ class RenderedMermaid extends Widget {
17
+ /**
18
+ * Create a new widget for rendering Vega/Vega-Lite.
19
+ */
20
+ constructor(options) {
21
+ super();
22
+ this._lastRendered = null;
23
+ this._mimeType = options.mimeType;
24
+ this.addClass(MERMAID_CLASS);
25
+ }
26
+ static set manager(manager) {
27
+ if (RenderedMermaid._manager) {
28
+ console.warn('Mermaid manager may only be set once, and is already set.');
29
+ return;
30
+ }
31
+ RenderedMermaid._manager = manager;
32
+ RenderedMermaid._managerReady.resolve(manager);
33
+ }
34
+ /**
35
+ * Render mermaid text-based diagrams into this widget's node.
36
+ */
37
+ async renderModel(model) {
38
+ const manager = await RenderedMermaid._managerReady.promise;
39
+ const text = model.data[this._mimeType];
40
+ if (text == null || text === this._lastRendered) {
41
+ return;
42
+ }
43
+ this._lastRendered = text;
44
+ // get a div containing a figure or parser message
45
+ const figure = await manager.renderFigure(text);
46
+ if (figure.classList.contains(WARNING_CLASS)) {
47
+ this.node.classList.add(WARNING_CLASS);
48
+ }
49
+ else {
50
+ this.node.classList.remove(WARNING_CLASS);
51
+ }
52
+ if (!figure.firstChild) {
53
+ return;
54
+ }
55
+ if (this.node.innerHTML !== figure.innerHTML) {
56
+ this.node.innerHTML = figure.innerHTML;
57
+ }
58
+ // capture the version of mermaid used
59
+ const version = manager.getMermaidVersion();
60
+ const mermaidMetadata = {
61
+ ...(model.metadata[MERMAID_MIME_TYPE] || {}),
62
+ version
63
+ };
64
+ const metadata = {
65
+ ...model.metadata,
66
+ [MERMAID_MIME_TYPE]: mermaidMetadata
67
+ };
68
+ // if available, set the fully-rendered SVG
69
+ const img = figure.querySelector('img');
70
+ if (img) {
71
+ const svg = decodeURIComponent(img.src.split(',')[1]);
72
+ const oldSvg = model.data[SVG_MIME];
73
+ if (svg !== oldSvg) {
74
+ model.setData({
75
+ data: { ...model.data, [SVG_MIME]: svg },
76
+ metadata
77
+ });
78
+ }
79
+ }
80
+ else {
81
+ const dataWithoutSvg = { ...model.data };
82
+ delete dataWithoutSvg[SVG_MIME];
83
+ model.setData({ data: dataWithoutSvg, metadata });
84
+ }
85
+ }
86
+ }
87
+ RenderedMermaid._manager = null;
88
+ RenderedMermaid._managerReady = new PromiseDelegate();
89
+ export { RenderedMermaid };
90
+ /**
91
+ * A mime renderer factory for mermaid text-based diagrams.
92
+ */
93
+ export const rendererFactory = {
94
+ safe: true,
95
+ mimeTypes: [MERMAID_MIME_TYPE],
96
+ createRenderer: options => new RenderedMermaid(options)
97
+ };
98
+ //# sourceMappingURL=mime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { Token } from '@lumino/coreutils';
2
+ import type MermaidType from 'mermaid';
3
+ export declare const MERMAID_MIME_TYPE = "text/vnd.mermaid";
4
+ export declare const MERMAID_FILE_EXTENSIONS: string[];
5
+ export declare const MERMAID_DEFAULT_THEME = "default";
6
+ export declare const MERMAID_DARK_THEME = "dark";
7
+ export declare const MERMAID_CLASS = "jp-RenderedMermaid";
8
+ export declare const MERMAID_CODE_CLASS = "mermaid";
9
+ export declare const WARNING_CLASS = "jp-mod-warning";
10
+ export declare const DETAILS_CLASS = "jp-RenderedMermaid-Details";
11
+ export declare const SUMMARY_CLASS = "jp-RenderedMermaid-Summary";
12
+ /**
13
+ * The exported token for a mermaid manager
14
+ */
15
+ export declare const IMermaidManager: Token<IMermaidManager>;
16
+ /**
17
+ * A namespace for public mermaid interfaces.
18
+ */
19
+ export interface IMermaidManager {
20
+ /**
21
+ * Get the (potentially uninitialized) mermaid module.
22
+ */
23
+ getMermaid(): Promise<typeof MermaidType>;
24
+ /**
25
+ * Get the version of the currently-loaded mermaid module
26
+ */
27
+ getMermaidVersion(): string | null;
28
+ /**
29
+ * Render mermaid source to an SVG string with extraced metadata.
30
+ */
31
+ renderSvg(text: string): Promise<IMermaidManager.IRenderInfo>;
32
+ /**
33
+ * Render and cache mermaid source as a figure of an image, or a unsuccessful parser message.
34
+ */
35
+ renderFigure(text: string): Promise<HTMLElement>;
36
+ /**
37
+ * Get the pre-cached element for a mermaid string, if available.
38
+ */
39
+ getCachedFigure(text: string): HTMLElement | null;
40
+ }
41
+ /**
42
+ * A namespace for the mermaid manager.
43
+ */
44
+ export declare namespace IMermaidManager {
45
+ /**
46
+ * The results of a successful rendering of a mermaid text-based diagram.
47
+ */
48
+ interface IRenderInfo {
49
+ /** the original source of the diagram. */
50
+ text: string;
51
+ /** The raw rendered SVG. */
52
+ svg: string;
53
+ /** The extracted accessible description, if found. */
54
+ accessibleDescription?: string | null;
55
+ /** The extracted accessible title, if found. */
56
+ accessibleTitle?: string | null;
57
+ /** The extracted width of the digaram, if found. */
58
+ width?: number | null;
59
+ }
60
+ }
61
+ /**
62
+ * The exported token for a mermaid manager
63
+ */
64
+ export declare const IMermaidMarkdown: Token<IMermaidMarkdown>;
65
+ /**
66
+ * A handler for mermaid fenced code blocks in markdown
67
+ *
68
+ * This duplicates the (currently) private `IFencedBlockRenderer` in
69
+ * `@jupyterlab/markedparser-extension`.
70
+ */
71
+ export interface IMermaidMarkdown {
72
+ /**
73
+ * The languages this block accepts.
74
+ */
75
+ languages: string[];
76
+ /**
77
+ * The order in which the block would be processed
78
+ */
79
+ rank: number;
80
+ /**
81
+ * Handle up-front loading/parsing mermaid
82
+ */
83
+ walk: (text: string) => Promise<void>;
84
+ /**
85
+ * Provide pre-rendered diagram content
86
+ */
87
+ render: (text: string) => string | null;
88
+ }
package/lib/tokens.js ADDED
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+ import { Token } from '@lumino/coreutils';
4
+ // documented upstream constants
5
+ export const MERMAID_MIME_TYPE = 'text/vnd.mermaid';
6
+ export const MERMAID_FILE_EXTENSIONS = ['.mmd', '.mermaid'];
7
+ // mermaid themes
8
+ export const MERMAID_DEFAULT_THEME = 'default';
9
+ export const MERMAID_DARK_THEME = 'dark';
10
+ // DOM
11
+ export const MERMAID_CLASS = 'jp-RenderedMermaid';
12
+ export const MERMAID_CODE_CLASS = 'mermaid';
13
+ export const WARNING_CLASS = 'jp-mod-warning';
14
+ export const DETAILS_CLASS = 'jp-RenderedMermaid-Details';
15
+ export const SUMMARY_CLASS = 'jp-RenderedMermaid-Summary';
16
+ /**
17
+ * The exported token for a mermaid manager
18
+ */
19
+ export const IMermaidManager = new Token('@jupyterlab/mermaid:IMermaidManager', `a manager for rendering mermaid text-based diagrams`);
20
+ /**
21
+ * The exported token for a mermaid manager
22
+ */
23
+ export const IMermaidMarkdown = new Token('@jupyterlab/mermaid:IMermaidMarkdown', `a manager for rendering mermaid text-based diagrams in markdown fenced code blocks`);
24
+ //# sourceMappingURL=tokens.js.map