| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- {%- macro mermaid_js(
- url="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.10.0/mermaid.esm.min.mjs",
- elk_url="https://cdnjs.cloudflare.com/ajax/libs/mermaid-layout-elk/0.1.9/mermaid-layout-elk.esm.min.mjs"
- ) -%}
- <script type="module">
- document.addEventListener("DOMContentLoaded", async () => {
- const diagrams = document.querySelectorAll(".jp-Mermaid > pre.mermaid");
- // do not load mermaidjs if not needed
- if (!diagrams.length) {
- return;
- }
- const mermaid = (await import("{{ url }}")).default;
- const elkUrl = "{{ elk_url | default('') }}";
- if(elkUrl) {
- const elkLayouts = (await import(elkUrl)).default;
- mermaid.registerLayoutLoaders(elkLayouts);
- }
- const parser = new DOMParser();
- mermaid.initialize({
- maxTextSize: 100000,
- maxEdges: 100000,
- startOnLoad: false,
- fontFamily: window
- .getComputedStyle(document.body)
- .getPropertyValue("--jp-ui-font-family"),
- theme: document.querySelector("body[data-jp-theme-light='true']")
- ? "default"
- : "dark",
- });
- let _nextMermaidId = 0;
- function makeMermaidImage(svg) {
- const img = document.createElement("img");
- const doc = parser.parseFromString(svg, "image/svg+xml");
- const svgEl = doc.querySelector("svg");
- const { maxWidth } = svgEl?.style || {};
- const firstTitle = doc.querySelector("title");
- const firstDesc = doc.querySelector("desc");
- img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`);
- if (maxWidth) {
- img.width = parseInt(maxWidth);
- }
- if (firstTitle) {
- img.setAttribute("alt", firstTitle.textContent);
- }
- if (firstDesc) {
- const caption = document.createElement("figcaption");
- caption.className = "sr-only";
- caption.textContent = firstDesc.textContent;
- return [img, caption];
- }
- return [img];
- }
- async function makeMermaidError(text) {
- let errorMessage = "";
- try {
- await mermaid.parse(text);
- } catch (err) {
- errorMessage = `${err}`;
- }
- const result = document.createElement("details");
- result.className = 'jp-RenderedMermaid-Details';
- const summary = document.createElement("summary");
- summary.className = 'jp-RenderedMermaid-Summary';
- const pre = document.createElement("pre");
- const code = document.createElement("code");
- code.innerText = text;
- pre.appendChild(code);
- summary.appendChild(pre);
- result.appendChild(summary);
- const warning = document.createElement("pre");
- warning.innerText = errorMessage;
- result.appendChild(warning);
- return [result];
- }
- async function renderOneMarmaid(src) {
- const id = `jp-mermaid-${_nextMermaidId++}`;
- const parent = src.parentNode;
- let raw = src.textContent.trim();
- const el = document.createElement("div");
- el.style.visibility = "hidden";
- document.body.appendChild(el);
- let results = null;
- let output = null;
- try {
- let { svg } = await mermaid.render(id, raw, el);
- svg = cleanMermaidSvg(svg);
- results = makeMermaidImage(svg);
- output = document.createElement("figure");
- results.map(output.appendChild, output);
- } catch (err) {
- parent.classList.add("jp-mod-warning");
- results = await makeMermaidError(raw);
- output = results[0];
- } finally {
- el.remove();
- }
- parent.classList.add("jp-RenderedMermaid");
- parent.appendChild(output);
- }
- /**
- * Post-process to ensure mermaid diagrams contain only valid SVG and XHTML.
- */
- function cleanMermaidSvg(svg) {
- svg = svg.replace(RE_VOID_ELEMENT, replaceVoidElement);
- return `${SVG_XML_HEADER}${svg}`;
- }
- /**
- * A regular expression for all void elements, which may include attributes and
- * a slash.
- *
- * @see https://developer.mozilla.org/en-US/docs/Glossary/Void_element
- *
- * Of these, only `<br>` is generated by Mermaid in place of `\n`,
- * but _any_ "malformed" tag will break the SVG rendering entirely.
- */
- const RE_VOID_ELEMENT =
- /<\s*(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\s*([^>]*?)\s*>/gi;
- /**
- * Ensure a void element is closed with a slash, preserving any attributes.
- */
- function replaceVoidElement(match, tag, rest) {
- rest = rest.trim();
- if (!rest.endsWith('/')) {
- rest = `${rest} /`;
- }
- return `<${tag} ${rest}>`;
- }
- /**
- * Named HTML entities with their decimal equivalent codes.
- *
- * @see https://www.w3.org/TR/WD-html40-970708/sgml/entities.html
- * */
- const HTML_ENTITIES = `<!ENTITY Aacute "Á">
- <!ENTITY aacute "á">
- <!ENTITY Acirc "Â">
- <!ENTITY acirc "â">
- <!ENTITY acute "´">
- <!ENTITY AElig "Æ">
- <!ENTITY aelig "æ">
- <!ENTITY Agrave "À">
- <!ENTITY agrave "à">
- <!ENTITY alefsym "ℵ">
- <!ENTITY Alpha "Α">
- <!ENTITY alpha "α">
- <!ENTITY amp "&">
- <!ENTITY and "⊥">
- <!ENTITY ang "∠">
- <!ENTITY Aring "Å">
- <!ENTITY aring "å">
- <!ENTITY asymp "≈">
- <!ENTITY Atilde "Ã">
- <!ENTITY atilde "ã">
- <!ENTITY Auml "Ä">
- <!ENTITY auml "ä">
- <!ENTITY bdquo "„">
- <!ENTITY Beta "Β">
- <!ENTITY beta "β">
- <!ENTITY brvbar "¦">
- <!ENTITY bull "•">
- <!ENTITY cap "∩">
- <!ENTITY Ccedil "Ç">
- <!ENTITY ccedil "ç">
- <!ENTITY cedil "¸">
- <!ENTITY cent "¢">
- <!ENTITY Chi "Χ">
- <!ENTITY chi "χ">
- <!ENTITY circ "ˆ">
- <!ENTITY clubs "♣">
- <!ENTITY cong "≅">
- <!ENTITY copy "©">
- <!ENTITY crarr "↵">
- <!ENTITY cup "∪">
- <!ENTITY curren "¤">
- <!ENTITY dagger "†">
- <!ENTITY Dagger "‡">
- <!ENTITY darr "↓">
- <!ENTITY dArr "⇓">
- <!ENTITY deg "°">
- <!ENTITY Delta "Δ">
- <!ENTITY delta "δ">
- <!ENTITY diams "♦">
- <!ENTITY divide "÷">
- <!ENTITY Eacute "É">
- <!ENTITY eacute "é">
- <!ENTITY Ecirc "Ê">
- <!ENTITY ecirc "ê">
- <!ENTITY Egrave "È">
- <!ENTITY egrave "è">
- <!ENTITY empty "∅">
- <!ENTITY emsp " ">
- <!ENTITY ensp " ">
- <!ENTITY epsilon "ε">
- <!ENTITY Epsilon "Ε">
- <!ENTITY equiv "≡">
- <!ENTITY Eta "Η">
- <!ENTITY eta "η">
- <!ENTITY ETH "Ð">
- <!ENTITY eth "ð">
- <!ENTITY Euml "Ë">
- <!ENTITY euml "ë">
- <!ENTITY exist "∃">
- <!ENTITY fnof "ƒ">
- <!ENTITY forall "∀">
- <!ENTITY frac12 "½">
- <!ENTITY frac14 "¼">
- <!ENTITY frac34 "¾">
- <!ENTITY frasl "⁄">
- <!ENTITY Gamma "Γ">
- <!ENTITY gamma "γ">
- <!ENTITY ge "≥">
- <!ENTITY gt ">">
- <!ENTITY harr "↔">
- <!ENTITY hArr "⇔">
- <!ENTITY hearts "♥">
- <!ENTITY hellip "…">
- <!ENTITY Iacute "Í">
- <!ENTITY iacute "í">
- <!ENTITY Icirc "Î">
- <!ENTITY icirc "î">
- <!ENTITY iexcl "¡">
- <!ENTITY Igrave "Ì">
- <!ENTITY igrave "ì">
- <!ENTITY image "ℑ">
- <!ENTITY infin "∞">
- <!ENTITY int "∫">
- <!ENTITY Iota "Ι">
- <!ENTITY iota "ι">
- <!ENTITY iquest "¿">
- <!ENTITY isin "∈">
- <!ENTITY Iuml "Ï">
- <!ENTITY iuml "ï">
- <!ENTITY Kappa "Κ">
- <!ENTITY kappa "κ">
- <!ENTITY Lambda "Λ">
- <!ENTITY lambda "λ">
- <!ENTITY lang "〈">
- <!ENTITY laquo "«">
- <!ENTITY larr "←">
- <!ENTITY lArr "⇐">
- <!ENTITY lceil "⌈">
- <!ENTITY ldquo "“">
- <!ENTITY le "≤">
- <!ENTITY lfloor "⌊">
- <!ENTITY lowast "∗">
- <!ENTITY loz "◊">
- <!ENTITY lrm "‎">
- <!ENTITY lsaquo "‹">
- <!ENTITY lsquo "‘">
- <!ENTITY lt "<">
- <!ENTITY macr "¯">
- <!ENTITY mdash "—">
- <!ENTITY micro "µ">
- <!ENTITY middot "·">
- <!ENTITY minus "−">
- <!ENTITY Mu "Μ">
- <!ENTITY mu "μ">
- <!ENTITY nabla "∇">
- <!ENTITY nbsp " ">
- <!ENTITY ndash "–">
- <!ENTITY ne "≠">
- <!ENTITY ni "∋">
- <!ENTITY not "¬">
- <!ENTITY notin "∉">
- <!ENTITY nsub "⊄">
- <!ENTITY Ntilde "Ñ">
- <!ENTITY ntilde "ñ">
- <!ENTITY Nu "Ν">
- <!ENTITY nu "ν">
- <!ENTITY Oacute "Ó">
- <!ENTITY oacute "ó">
- <!ENTITY Ocirc "Ô">
- <!ENTITY ocirc "ô">
- <!ENTITY OElig "Œ">
- <!ENTITY oelig "œ">
- <!ENTITY Ograve "Ò">
- <!ENTITY ograve "ò">
- <!ENTITY oline "‾">
- <!ENTITY Omega "Ω">
- <!ENTITY omega "ω">
- <!ENTITY Omicron "Ο">
- <!ENTITY omicron "ο">
- <!ENTITY oplus "⊕">
- <!ENTITY or "⊦">
- <!ENTITY ordf "ª">
- <!ENTITY ordm "º">
- <!ENTITY Oslash "Ø">
- <!ENTITY oslash "ø">
- <!ENTITY Otilde "Õ">
- <!ENTITY otilde "õ">
- <!ENTITY otimes "⊗">
- <!ENTITY Ouml "Ö">
- <!ENTITY ouml "ö">
- <!ENTITY para "¶">
- <!ENTITY part "∂">
- <!ENTITY permil "‰">
- <!ENTITY perp "⊥">
- <!ENTITY Phi "Φ">
- <!ENTITY phi "φ">
- <!ENTITY Pi "Π">
- <!ENTITY pi "π">
- <!ENTITY piv "ϖ">
- <!ENTITY plusmn "±">
- <!ENTITY pound "£">
- <!ENTITY prime "′">
- <!ENTITY Prime "″">
- <!ENTITY prod "∏">
- <!ENTITY prop "∝">
- <!ENTITY Psi "Ψ">
- <!ENTITY psi "ψ">
- <!ENTITY quot """>
- <!ENTITY radic "√">
- <!ENTITY rang "〉">
- <!ENTITY raquo "»">
- <!ENTITY rarr "→">
- <!ENTITY rArr "⇒">
- <!ENTITY rceil "⌉">
- <!ENTITY rdquo "”">
- <!ENTITY real "ℜ">
- <!ENTITY reg "®">
- <!ENTITY rfloor "⌋">
- <!ENTITY Rho "Ρ">
- <!ENTITY rho "ρ">
- <!ENTITY rlm "‏">
- <!ENTITY rsaquo "›">
- <!ENTITY rsquo "’">
- <!ENTITY sbquo "‚">
- <!ENTITY Scaron "Š">
- <!ENTITY scaron "š">
- <!ENTITY sdot "⋅">
- <!ENTITY sect "§">
- <!ENTITY shy "­">
- <!ENTITY Sigma "Σ">
- <!ENTITY sigma "σ">
- <!ENTITY sigmaf "ς">
- <!ENTITY sim "∼">
- <!ENTITY spades "♠">
- <!ENTITY sub "⊂">
- <!ENTITY sube "⊆">
- <!ENTITY sum "∑">
- <!ENTITY sup "⊃">
- <!ENTITY sup1 "¹">
- <!ENTITY sup2 "²">
- <!ENTITY sup3 "³">
- <!ENTITY supe "⊇">
- <!ENTITY szlig "ß">
- <!ENTITY Tau "Τ">
- <!ENTITY tau "τ">
- <!ENTITY there4 "∴">
- <!ENTITY Theta "Θ">
- <!ENTITY theta "θ">
- <!ENTITY thetasym "ϑ">
- <!ENTITY thinsp " ">
- <!ENTITY THORN "Þ">
- <!ENTITY thorn "þ">
- <!ENTITY tilde "˜">
- <!ENTITY times "×">
- <!ENTITY trade "™">
- <!ENTITY Uacute "Ú">
- <!ENTITY uacute "ú">
- <!ENTITY uarr "↑">
- <!ENTITY uArr "⇑">
- <!ENTITY Ucirc "Û">
- <!ENTITY ucirc "û">
- <!ENTITY Ugrave "Ù">
- <!ENTITY ugrave "ù">
- <!ENTITY uml "¨">
- <!ENTITY upsih "ϒ">
- <!ENTITY Upsilon "Υ">
- <!ENTITY upsilon "υ">
- <!ENTITY Uuml "Ü">
- <!ENTITY uuml "ü">
- <!ENTITY weierp "℘">
- <!ENTITY Xi "Ξ">
- <!ENTITY xi "ξ">
- <!ENTITY Yacute "Ý">
- <!ENTITY yacute "ý">
- <!ENTITY yen "¥">
- <!ENTITY Yuml "Ÿ">
- <!ENTITY yuml "ÿ">
- <!ENTITY Zeta "Ζ">
- <!ENTITY zeta "ζ">
- <!ENTITY zwj "‍">
- <!ENTITY zwnj "‌">`.replace(/\n/g, ' ');
- /**
- * A reasonably strict xml declaration.
- */
- const XML_DECL = '<?xml version="1.0" standalone="no"?>';
- /**
- * The beginning of the XML doctype declaration.
- */
- const DOCTYPE_START = `<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [`;
- /**
- * The end of the XML docype declaration.
- */
- const DOCTYPE_END = ']>';
- /**
- * A full header for an SVG XML document.
- */
- const SVG_XML_HEADER = `${XML_DECL}
- ${DOCTYPE_START}${HTML_ENTITIES}${DOCTYPE_END}`;
- void Promise.all([...diagrams].map(renderOneMarmaid));
- });
- </script>
- <style>
- .jp-Mermaid:not(.jp-RenderedMermaid) {
- display: none;
- }
- .jp-RenderedMermaid {
- overflow: auto;
- display: flex;
- }
- .jp-RenderedMermaid.jp-mod-warning {
- width: auto;
- padding: 0.5em;
- margin-top: 0.5em;
- border: var(--jp-border-width) solid var(--jp-warn-color2);
- border-radius: var(--jp-border-radius);
- color: var(--jp-ui-font-color1);
- font-size: var(--jp-ui-font-size1);
- white-space: pre-wrap;
- word-wrap: break-word;
- }
- .jp-RenderedMermaid figure {
- margin: 0;
- overflow: auto;
- max-width: 100%;
- }
- .jp-RenderedMermaid img {
- max-width: 100%;
- }
- .jp-RenderedMermaid-Details > pre {
- margin-top: 1em;
- }
- .jp-RenderedMermaid-Summary {
- color: var(--jp-warn-color2);
- }
- .jp-RenderedMermaid:not(.jp-mod-warning) pre {
- display: none;
- }
- .jp-RenderedMermaid-Summary > pre {
- display: inline-block;
- white-space: normal;
- }
- </style>
- <!-- End of mermaid configuration -->
- {%- endmacro %}
|