2021-07-24 12:21:51 +08:00
const { MermaidMaxSourceCharacters } = window . config ;
2020-08-05 03:56:37 +08:00
function displayError ( el , err ) {
el . closest ( 'pre' ) . classList . remove ( 'is-loading' ) ;
const errorNode = document . createElement ( 'div' ) ;
2021-05-07 16:43:41 +08:00
errorNode . setAttribute ( 'class' , 'ui message error markup-block-error mono' ) ;
2020-08-05 03:56:37 +08:00
errorNode . textContent = err . str || err . message || String ( err ) ;
el . closest ( 'pre' ) . before ( errorNode ) ;
}
2020-07-27 14:24:09 +08:00
export async function renderMermaid ( els ) {
if ( ! els || ! els . length ) return ;
2021-10-19 15:23:58 +08:00
const { default : mermaid } = await import ( /* webpackChunkName: "mermaid" */ 'mermaid' ) ;
2020-07-27 14:24:09 +08:00
2020-08-05 03:56:37 +08:00
mermaid . initialize ( {
mermaid : {
startOnLoad : false ,
} ,
flowchart : {
useMaxWidth : true ,
htmlLabels : false ,
} ,
2020-07-27 14:24:09 +08:00
theme : 'neutral' ,
securityLevel : 'strict' ,
} ) ;
for ( const el of els ) {
2021-07-24 12:21:51 +08:00
if ( MermaidMaxSourceCharacters >= 0 && el . textContent . length > MermaidMaxSourceCharacters ) {
displayError ( el , new Error ( ` Mermaid source of ${ el . textContent . length } characters exceeds the maximum allowed length of ${ MermaidMaxSourceCharacters } . ` ) ) ;
2020-08-05 03:56:37 +08:00
continue ;
}
let valid ;
try {
valid = mermaid . parse ( el . textContent ) ;
} catch ( err ) {
displayError ( el , err ) ;
}
if ( ! valid ) {
el . closest ( 'pre' ) . classList . remove ( 'is-loading' ) ;
continue ;
}
try {
mermaid . init ( undefined , el , ( id ) => {
const svg = document . getElementById ( id ) ;
svg . classList . add ( 'mermaid-chart' ) ;
svg . closest ( 'pre' ) . replaceWith ( svg ) ;
} ) ;
} catch ( err ) {
displayError ( el , err ) ;
}
2020-07-27 14:24:09 +08:00
}
}