// Optional config // If your document is not specifying `data-md-color-scheme` for color schemes, // you just need to specify `default`. window.mermaidConfig = { default: { startOnLoad: false, theme: "default", flowchart: { htmlLabels: false }, er: { useMaxWidth: false }, sequence: { useMaxWidth: false, // Mermaid handles Firefox a little different. // For some reason, it doesn't attach font sizes to the labels in Firefox. // If we specify the documented defaults, font sizes are written to the labels in Firefox. noteFontWeight: "14px", actorFontSize: "14px", messageFontSize: "16px" } }, slate: { startOnLoad: false, theme: "dark", flowchart: { htmlLabels: false }, er: { useMaxWidth: false }, sequence: { useMaxWidth: false, noteFontWeight: "14px", actorFontSize: "14px", messageFontSize: "16px" } } } // Custum loader /* Notes (as of Mermaid 8.7.0): * - Gantt: width is always relative to the parent, if you have a small parent, the chart will be squashed. * Can't help it. * - Journey: Suffers from the same issues that Gantt does. * - Pie: These charts have no default height or width. Good luck pinning them down to a reasonable size. * - Git: The render portion is agnostic to the size of the parent element. But padding of the SVG is relative * to the parent element. You will never find a happy size. */ /** * Targets special code or div blocks and converts them to UML. * @param {string} className is the name of the class to target. * @return {void} */ export default className => { // Custom element to encapsulate Mermaid content. class MermaidDiv extends HTMLElement { /** * Creates a special Mermaid div shadow DOM. * Works around issues of shared IDs. * @return {void} */ constructor() { super() // Create the Shadow DOM and attach style const shadow = this.attachShadow({mode: "open"}) const style = document.createElement("style") style.textContent = ` :host { display: block; line-height: initial; font-size: 16px; } div.mermaid { margin: 0; overflow: visible; }` shadow.appendChild(style) } } if (typeof customElements.get("mermaid-div") === "undefined") { customElements.define("mermaid-div", MermaidDiv) } const getFromCode = function(parent) { // Handles
text extraction.
let text = ""
for (let j = 0; j < parent.childNodes.length; j++) {
const subEl = parent.childNodes[j]
if (subEl.tagName.toLowerCase() === "code") {
for (let k = 0; k < subEl.childNodes.length; k++) {
const child = subEl.childNodes[k]
const whitespace = /^\s*$/
if (child.nodeName === "#text" && !(whitespace.test(child.nodeValue))) {
text = child.nodeValue
break
}
}
}
}
return text
}
// We use this to determine if we want the dark or light theme.
// This is specific for our MkDocs Material environment.
// You should load your configs based on your own environment's needs.
const defaultConfig = {
startOnLoad: false,
theme: "default",
flowchart: {
htmlLabels: false
},
er: {
useMaxWidth: false
},
sequence: {
useMaxWidth: false,
noteFontWeight: "14px",
actorFontSize: "14px",
messageFontSize: "16px"
}
}
mermaid.mermaidAPI.globalReset()
// Non Material themes should just use "default"
let scheme = null
try {
scheme = document.querySelector("[data-md-color-scheme]").getAttribute("data-md-color-scheme")
} catch (err) {
scheme = "default"
}
const config = (typeof mermaidConfig === "undefined") ?
defaultConfig :
mermaidConfig[scheme] || (mermaidConfig.default || defaultConfig)
mermaid.initialize(config)
// Find all of our Mermaid sources and render them.
const blocks = document.querySelectorAll(`pre.${className}, mermaid-div`)
const surrogate = document.querySelector("html")
for (let i = 0; i < blocks.length; i++) {
const block = blocks[i]
const parentEl = (block.tagName.toLowerCase() === "mermaid-div") ?
block.shadowRoot.querySelector(`pre.${className}`) :
block
// Create a temporary element with the typeset and size we desire.
// Insert it at the end of our parent to render the SVG.
const temp = document.createElement("div")
temp.style.visibility = "hidden"
temp.style.display = "display"
temp.style.padding = "0"
temp.style.margin = "0"
temp.style.lineHeight = "initial"
temp.style.fontSize = "16px"
surrogate.appendChild(temp)
try {
mermaid.mermaidAPI.render(
`_mermaid_${i}`,
getFromCode(parentEl),
content => {
const el = document.createElement("div")
el.className = className
el.innerHTML = content
// Insert the render where we want it and remove the original text source.
// Mermaid will clean up the temporary element.
const shadow = document.createElement("mermaid-div")
shadow.shadowRoot.appendChild(el)
block.parentNode.insertBefore(shadow, block)
parentEl.style.display = "none"
shadow.shadowRoot.appendChild(parentEl)
if (parentEl !== block) {
block.parentNode.removeChild(block)
}
},
temp
)
} catch (err) {} // eslint-disable-line no-empty
if (surrogate.contains(temp)) {
surrogate.removeChild(temp)
}
}
}