146 lines
4.3 KiB
JavaScript
Raw Normal View History

2023-03-20 12:21:22 +01:00
import mermaid2 from './mermaid.esm.mjs';
2023-03-17 20:53:13 +01:00
import externalExample from '../../packages/mermaid-example-diagram/dist/mermaid-example-diagram.core.mjs';
2023-04-26 00:20:00 +05:30
import zenUml from '../../packages/mermaid-zenuml/dist/mermaid-zenuml.core.mjs';
function b64ToUtf8(str) {
return decodeURIComponent(escape(window.atob(str)));
}
// Adds a rendered flag to window when rendering is done, so cypress can wait for it.
function markRendered() {
if (window.Cypress) {
window.rendered = true;
}
}
/**
* ##contentLoaded Callback function that is called when page is loaded. This functions fetches
2022-09-20 22:13:49 +05:30
* configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
* page.
*/
2022-11-10 13:51:53 +05:30
const contentLoaded = async function () {
2019-10-05 00:39:07 +02:00
let pos = document.location.href.indexOf('?graph=');
if (pos > 0) {
2019-10-05 00:39:07 +02:00
pos = pos + 7;
const graphBase64 = document.location.href.substr(pos);
const graphObj = JSON.parse(b64ToUtf8(graphBase64));
if (graphObj.mermaid && graphObj.mermaid.theme === 'dark') {
document.body.style.background = '#3f3f3f';
}
2019-10-05 00:39:07 +02:00
console.log(graphObj);
2019-11-05 17:24:07 +09:00
if (Array.isArray(graphObj.code)) {
const numCodes = graphObj.code.length;
for (let i = 0; i < numCodes; i++) {
const div = document.createElement('div');
div.id = 'block' + i;
div.className = 'mermaid';
div.innerHTML = graphObj.code[i];
document.getElementsByTagName('body')[0].appendChild(div);
}
} else {
const div = document.createElement('div');
div.id = 'block';
div.className = 'mermaid';
div.innerHTML = graphObj.code;
document.getElementsByTagName('body')[0].appendChild(div);
}
2023-04-26 00:20:00 +05:30
await mermaid2.registerExternalDiagrams([externalExample, zenUml]);
2022-09-20 22:13:49 +05:30
mermaid2.initialize(graphObj.mermaid);
2023-02-21 21:35:54 +05:30
await mermaid2.run();
}
2019-10-05 00:39:07 +02:00
};
2020-08-16 13:01:45 +02:00
/**
* @param current
* @param update
*/
2020-08-16 13:01:45 +02:00
function merge(current, update) {
Object.keys(update).forEach(function (key) {
2020-08-16 13:01:45 +02:00
// if update[key] exist, and it's not a string or array,
// we go in one level deeper
if (
2022-09-05 01:00:47 +05:30
current.hasOwnProperty(key) &&
2020-08-16 13:01:45 +02:00
typeof current[key] === 'object' &&
2022-11-23 01:05:08 +05:30
!Array.isArray(current[key])
2020-08-16 13:01:45 +02:00
) {
merge(current[key], update[key]);
// if update[key] doesn't exist in current, or it's a string
// or array, then assign/overwrite current[key] to update[key]
} else {
current[key] = update[key];
}
});
return current;
}
2023-02-19 14:03:11 +05:30
const contentLoadedApi = async function () {
2019-10-05 00:39:07 +02:00
let pos = document.location.href.indexOf('?graph=');
if (pos > 0) {
2019-10-05 00:39:07 +02:00
pos = pos + 7;
const graphBase64 = document.location.href.substr(pos);
const graphObj = JSON.parse(b64ToUtf8(graphBase64));
// const graph = 'hello'
2019-11-05 17:24:07 +09:00
if (Array.isArray(graphObj.code)) {
const numCodes = graphObj.code.length;
const divs = [];
2019-11-08 11:42:26 +01:00
let div;
2019-11-05 17:24:07 +09:00
for (let i = 0; i < numCodes; i++) {
2019-11-08 11:42:26 +01:00
div = document.createElement('div');
2019-11-05 17:24:07 +09:00
div.id = 'block' + i;
div.className = 'mermaid';
// div.innerHTML = graphObj.code
document.getElementsByTagName('body')[0].appendChild(div);
divs[i] = div;
}
2020-08-16 13:01:45 +02:00
const defaultE2eCnf = { theme: 'forest' };
const cnf = merge(defaultE2eCnf, graphObj.mermaid);
mermaid2.initialize(cnf);
2019-11-05 17:24:07 +09:00
for (let i = 0; i < numCodes; i++) {
2023-02-19 14:03:11 +05:30
const { svg, bindFunctions } = await mermaid2.render(
2019-11-05 17:24:07 +09:00
'newid' + i,
graphObj.code[i],
divs[i]
);
2023-02-19 14:03:11 +05:30
div.innerHTML = svg;
bindFunctions(div);
2019-11-05 17:24:07 +09:00
}
} else {
const div = document.createElement('div');
div.id = 'block';
div.className = 'mermaid';
console.warn('graphObj.mermaid', graphObj.mermaid);
2019-11-05 17:24:07 +09:00
document.getElementsByTagName('body')[0].appendChild(div);
mermaid2.initialize(graphObj.mermaid);
2023-02-19 14:03:11 +05:30
const { svg, bindFunctions } = await mermaid2.render('newid', graphObj.code, div);
div.innerHTML = svg;
bindFunctions(div);
2019-11-08 11:42:26 +01:00
}
}
2019-10-05 00:39:07 +02:00
};
if (typeof document !== 'undefined') {
/*!
* Wait for document loaded before starting the execution
*/
window.addEventListener(
'load',
function () {
if (this.location.href.match('xss.html')) {
2019-10-05 00:39:07 +02:00
this.console.log('Using api');
2023-03-30 23:28:41 +05:30
void contentLoadedApi().finally(markRendered);
} else {
2019-10-05 00:39:07 +02:00
this.console.log('Not using api');
2023-03-30 23:28:41 +05:30
void contentLoaded().finally(markRendered);
}
},
false
2019-10-05 00:39:07 +02:00
);
}