mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Rework mermaid integration to support off-DOM rendering
This commit is contained in:
parent
58dec7b9b0
commit
6635ff9a69
@ -151,7 +151,6 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js",
|
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/history.js",
|
"packages/node_modules/@node-red/editor-client/src/js/history.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/validators.js",
|
"packages/node_modules/@node-red/editor-client/src/js/validators.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/mermaid.js",
|
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/utils.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/utils.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js",
|
||||||
|
@ -109,7 +109,7 @@
|
|||||||
"jquery-i18next": "1.2.1",
|
"jquery-i18next": "1.2.1",
|
||||||
"jsdoc-nr-template": "github:node-red/jsdoc-nr-template",
|
"jsdoc-nr-template": "github:node-red/jsdoc-nr-template",
|
||||||
"marked": "4.3.0",
|
"marked": "4.3.0",
|
||||||
"mermaid": "^9.4.3",
|
"mermaid": "^10.4.0",
|
||||||
"minami": "1.2.3",
|
"minami": "1.2.3",
|
||||||
"mocha": "9.2.2",
|
"mocha": "9.2.2",
|
||||||
"node-red-node-test-helper": "^0.3.2",
|
"node-red-node-test-helper": "^0.3.2",
|
||||||
|
@ -169,7 +169,7 @@
|
|||||||
var currentScrollTop = $(".red-ui-editor-type-markdown-panel-preview").scrollTop();
|
var currentScrollTop = $(".red-ui-editor-type-markdown-panel-preview").scrollTop();
|
||||||
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
||||||
$(".red-ui-editor-type-markdown-panel-preview").scrollTop(currentScrollTop);
|
$(".red-ui-editor-type-markdown-panel-preview").scrollTop(currentScrollTop);
|
||||||
mermaid.init();
|
RED.editor.mermaid.render()
|
||||||
},200);
|
},200);
|
||||||
})
|
})
|
||||||
if (options.header) {
|
if (options.header) {
|
||||||
@ -178,7 +178,7 @@
|
|||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
$(".red-ui-editor-type-markdown-panel-preview").html(RED.utils.renderMarkdown(expressionEditor.getValue()));
|
||||||
mermaid.init();
|
RED.editor.mermaid.render()
|
||||||
}
|
}
|
||||||
panels = RED.panels.create({
|
panels = RED.panels.create({
|
||||||
id:"red-ui-editor-type-markdown-panels",
|
id:"red-ui-editor-type-markdown-panels",
|
||||||
|
53
packages/node_modules/@node-red/editor-client/src/js/ui/editors/mermaid.js
vendored
Normal file
53
packages/node_modules/@node-red/editor-client/src/js/ui/editors/mermaid.js
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
RED.editor.mermaid = (function () {
|
||||||
|
let initializing = false
|
||||||
|
let loaded = false
|
||||||
|
let pendingEvals = []
|
||||||
|
let diagramIds = 0
|
||||||
|
|
||||||
|
function render(selector = '.mermaid') {
|
||||||
|
// $(selector).hide()
|
||||||
|
if (!loaded) {
|
||||||
|
pendingEvals.push(selector)
|
||||||
|
|
||||||
|
if (!initializing) {
|
||||||
|
initializing = true
|
||||||
|
$.getScript(
|
||||||
|
'vendor/mermaid/mermaid.min.js',
|
||||||
|
function (data, stat, jqxhr) {
|
||||||
|
mermaid.initialize({
|
||||||
|
startOnLoad: false
|
||||||
|
})
|
||||||
|
loaded = true
|
||||||
|
while(pendingEvals.length > 0) {
|
||||||
|
const pending = pendingEvals.shift()
|
||||||
|
render(pending)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const nodes = document.querySelectorAll(selector)
|
||||||
|
|
||||||
|
nodes.forEach(async node => {
|
||||||
|
if (!node.getAttribute('mermaid-processed')) {
|
||||||
|
const mermaidContent = node.innerText
|
||||||
|
node.setAttribute('mermaid-processed', true)
|
||||||
|
try {
|
||||||
|
const { svg } = await mermaid.render('mermaid-render-'+Date.now()+'-'+(diagramIds++), mermaidContent);
|
||||||
|
node.innerHTML = svg
|
||||||
|
} catch (err) {
|
||||||
|
$('<div>').css({
|
||||||
|
fontSize: '0.8em',
|
||||||
|
border: '1px solid var(--red-ui-border-color-error)',
|
||||||
|
padding: '5px',
|
||||||
|
marginBottom: '10px',
|
||||||
|
}).text(err.toString()).prependTo(node)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
render: render,
|
||||||
|
};
|
||||||
|
})();
|
@ -1,46 +0,0 @@
|
|||||||
// Mermaid diagram stub library for on-demand dynamic loading
|
|
||||||
// Will be overwritten after script loading by $.getScript
|
|
||||||
var mermaid = (function () {
|
|
||||||
var enabled /* = undefined */;
|
|
||||||
|
|
||||||
var initializing = false;
|
|
||||||
var initCalled = false;
|
|
||||||
|
|
||||||
function initialize(opt) {
|
|
||||||
if (enabled === undefined) {
|
|
||||||
if (RED.settings.markdownEditor &&
|
|
||||||
RED.settings.markdownEditor.mermaid) {
|
|
||||||
enabled = RED.settings.markdownEditor.mermaid.enabled;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (enabled) {
|
|
||||||
initializing = true;
|
|
||||||
$.getScript("vendor/mermaid/mermaid.min.js",
|
|
||||||
function (data, stat, jqxhr) {
|
|
||||||
$(".mermaid").show();
|
|
||||||
// invoke loaded mermaid API
|
|
||||||
initializing = false;
|
|
||||||
mermaid.initialize(opt);
|
|
||||||
if (initCalled) {
|
|
||||||
mermaid.init();
|
|
||||||
initCalled = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
if (initializing) {
|
|
||||||
$(".mermaid").hide();
|
|
||||||
initCalled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
initialize: initialize,
|
|
||||||
init: init,
|
|
||||||
};
|
|
||||||
})();
|
|
@ -166,7 +166,7 @@ RED.projects.settings = (function() {
|
|||||||
var description = addTargetToExternalLinks($('<span class="red-ui-text-bidi-aware" dir=\"'+RED.text.bidi.resolveBaseTextDir(desc)+'">'+desc+'</span>')).appendTo(container);
|
var description = addTargetToExternalLinks($('<span class="red-ui-text-bidi-aware" dir=\"'+RED.text.bidi.resolveBaseTextDir(desc)+'">'+desc+'</span>')).appendTo(container);
|
||||||
description.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "<span></span>" );
|
description.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "<span></span>" );
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
mermaid.init();
|
RED.editor.mermaid.render()
|
||||||
}, 200);
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,6 +383,7 @@ RED.sidebar.help = (function() {
|
|||||||
$(this).toggleClass('expanded',!isExpanded);
|
$(this).toggleClass('expanded',!isExpanded);
|
||||||
})
|
})
|
||||||
helpSection.parent().scrollTop(0);
|
helpSection.parent().scrollTop(0);
|
||||||
|
RED.editor.mermaid.render()
|
||||||
}
|
}
|
||||||
|
|
||||||
function set(html,title) {
|
function set(html,title) {
|
||||||
|
@ -464,7 +464,7 @@ RED.sidebar.info = (function() {
|
|||||||
}
|
}
|
||||||
$(this).toggleClass('expanded',!isExpanded);
|
$(this).toggleClass('expanded',!isExpanded);
|
||||||
});
|
});
|
||||||
mermaid.init();
|
RED.editor.mermaid.render()
|
||||||
}
|
}
|
||||||
|
|
||||||
var tips = (function() {
|
var tips = (function() {
|
||||||
|
@ -101,28 +101,8 @@ RED.utils = (function() {
|
|||||||
|
|
||||||
renderer.code = function (code, lang) {
|
renderer.code = function (code, lang) {
|
||||||
if(lang === "mermaid") {
|
if(lang === "mermaid") {
|
||||||
// mermaid diagram rendering
|
return `<pre class='mermaid'>${code}</pre>`;
|
||||||
if (mermaidIsEnabled === undefined) {
|
} else {
|
||||||
if (RED.settings.markdownEditor &&
|
|
||||||
RED.settings.markdownEditor.mermaid) {
|
|
||||||
mermaidIsEnabled = RED.settings.markdownEditor.mermaid.enabled;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mermaidIsEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mermaidIsEnabled) {
|
|
||||||
if (!mermaidIsInitialized) {
|
|
||||||
mermaidIsInitialized = true;
|
|
||||||
mermaid.initialize({startOnLoad:false});
|
|
||||||
}
|
|
||||||
return `<pre class='mermaid'>${code}</pre>`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return `<details><summary>${RED._("markdownEditor.mermaid.summary")}</summary><pre><code>${code}</code></pre></details>`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return "<pre><code>" +code +"</code></pre>";
|
return "<pre><code>" +code +"</code></pre>";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user