mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-07 01:26:42 +02:00

* develop: (840 commits) use default export in `error` diagram create `ParserDefinition` type standardized `error` diagram' style: format packages/mermaid/src/config.type.ts build(types): use prettier conf on config.types.ts Syntax Update CONTRIBUTING.md fix!(deps): fix zenuml style leakage. update @zenuml/core to ^3.0.6 to fix the style leakage. Update selectSvgElement.ts create `Group` type Add specialChars in textNoTagsToken, alphaNumToken Return Unicode Text to idStringToken definition Add underscore to unit test on special Chars Revert to old docs concerning quotations marks in string Refactor unit tests and remove repetition Correct idStringToken definition to include all individual special tokens Add unit tests for node ids with special Chars Create lychee.toml create `selectSvgElement` change `svgElem` to `SVG` in `configureSvgSize` add `configureSvgSize` in infoRenderer ...
151 lines
4.5 KiB
JavaScript
151 lines
4.5 KiB
JavaScript
import mermaid2 from './mermaid.esm.mjs';
|
|
import externalExample from '../../packages/mermaid-example-diagram/dist/mermaid-example-diagram.core.mjs';
|
|
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
|
|
* configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
|
* page.
|
|
*/
|
|
const contentLoaded = async function () {
|
|
let pos = document.location.href.indexOf('?graph=');
|
|
if (pos > 0) {
|
|
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';
|
|
}
|
|
console.log(graphObj);
|
|
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);
|
|
}
|
|
|
|
await mermaid2.registerExternalDiagrams([externalExample, zenUml]);
|
|
mermaid2.initialize(graphObj.mermaid);
|
|
await mermaid2.run();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param current
|
|
* @param update
|
|
*/
|
|
function merge(current, update) {
|
|
Object.keys(update).forEach(function (key) {
|
|
// if update[key] exist, and it's not a string or array,
|
|
// we go in one level deeper
|
|
if (
|
|
current.hasOwnProperty(key) &&
|
|
typeof current[key] === 'object' &&
|
|
!Array.isArray(current[key])
|
|
) {
|
|
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;
|
|
}
|
|
|
|
const contentLoadedApi = async function () {
|
|
let pos = document.location.href.indexOf('?graph=');
|
|
if (pos > 0) {
|
|
pos = pos + 7;
|
|
const graphBase64 = document.location.href.substr(pos);
|
|
const graphObj = JSON.parse(b64ToUtf8(graphBase64));
|
|
// const graph = 'hello'
|
|
if (Array.isArray(graphObj.code)) {
|
|
const numCodes = graphObj.code.length;
|
|
const divs = [];
|
|
let div;
|
|
for (let i = 0; i < numCodes; i++) {
|
|
div = document.createElement('div');
|
|
div.id = 'block' + i;
|
|
div.className = 'mermaid';
|
|
// div.innerHTML = graphObj.code
|
|
document.getElementsByTagName('body')[0].appendChild(div);
|
|
divs[i] = div;
|
|
}
|
|
|
|
const defaultE2eCnf = { theme: 'forest', startOnLoad: false };
|
|
|
|
const cnf = merge(defaultE2eCnf, graphObj.mermaid);
|
|
|
|
mermaid2.initialize(cnf);
|
|
|
|
for (let i = 0; i < numCodes; i++) {
|
|
const { svg, bindFunctions } = await mermaid2.render(
|
|
'newid' + i,
|
|
graphObj.code[i],
|
|
divs[i]
|
|
);
|
|
div.innerHTML = svg;
|
|
bindFunctions(div);
|
|
}
|
|
} else {
|
|
const div = document.createElement('div');
|
|
div.id = 'block';
|
|
div.className = 'mermaid';
|
|
console.warn('graphObj', graphObj);
|
|
document.getElementsByTagName('body')[0].appendChild(div);
|
|
mermaid2.initialize(graphObj.mermaid);
|
|
const { svg, bindFunctions } = await mermaid2.render('newid', graphObj.code, div);
|
|
div.innerHTML = svg;
|
|
console.log(div.innerHTML);
|
|
bindFunctions(div);
|
|
}
|
|
}
|
|
};
|
|
|
|
if (typeof document !== 'undefined') {
|
|
/*!
|
|
* Wait for document loaded before starting the execution
|
|
*/
|
|
window.addEventListener(
|
|
'load',
|
|
function () {
|
|
if (this.location.href.match('xss.html')) {
|
|
this.console.log('Using api');
|
|
void contentLoadedApi().finally(markRendered);
|
|
} else {
|
|
this.console.log('Not using api');
|
|
void contentLoaded().finally(markRendered);
|
|
}
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
export function init(mermaid, external) {
|
|
mermaid2 = mermaid;
|
|
externalExample = external;
|
|
}
|