11{% - macro mermaid_js (
2- url ="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs"
2+ url ="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.10.0/mermaid.esm.min.mjs" ,
3+ elk_url ="https://cdnjs.cloudflare.com/ajax/libs/mermaid-layout-elk/0.1.9/mermaid-layout-elk.esm.min.mjs"
34) -%}
45<script type =" module" >
56 document .addEventListener (" DOMContentLoaded" , async () => {
@@ -9,6 +10,11 @@ url="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs"
910 return ;
1011 }
1112 const mermaid = (await import (" {{ url }}" )).default ;
13+ const elkUrl = " {{ elk_url | default('') }}" ;
14+ if (elkUrl) {
15+ const elkLayouts = (await import (elkUrl)).default ;
16+ mermaid .registerLayoutLoaders (elkLayouts);
17+ }
1218 const parser = new DOMParser ();
1319
1420 mermaid .initialize ({
@@ -105,7 +111,8 @@ url="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs"
105111 * Post-process to ensure mermaid diagrams contain only valid SVG and XHTML.
106112 */
107113 function cleanMermaidSvg (svg ) {
108- return svg .replace (RE_VOID_ELEMENT , replaceVoidElement);
114+ svg = svg .replace (RE_VOID_ELEMENT , replaceVoidElement);
115+ return ` ${ SVG_XML_HEADER }${ svg} ` ;
109116 }
110117
111118
@@ -132,6 +139,285 @@ url="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs"
132139 return ` <${ tag} ${ rest} >` ;
133140 }
134141
142+
143+ /**
144+ * Named HTML entities with their decimal equivalent codes.
145+ *
146+ * @see https://www.w3.org/TR/WD-html40-970708/sgml/entities.html
147+ * */
148+ const HTML_ENTITIES = ` <!ENTITY Aacute "Á">
149+ <!ENTITY aacute "á">
150+ <!ENTITY Acirc "Â">
151+ <!ENTITY acirc "â">
152+ <!ENTITY acute "´">
153+ <!ENTITY AElig "Æ">
154+ <!ENTITY aelig "æ">
155+ <!ENTITY Agrave "À">
156+ <!ENTITY agrave "à">
157+ <!ENTITY alefsym "ℵ">
158+ <!ENTITY Alpha "Α">
159+ <!ENTITY alpha "α">
160+ <!ENTITY amp "&">
161+ <!ENTITY and "⊥">
162+ <!ENTITY ang "∠">
163+ <!ENTITY Aring "Å">
164+ <!ENTITY aring "å">
165+ <!ENTITY asymp "≈">
166+ <!ENTITY Atilde "Ã">
167+ <!ENTITY atilde "ã">
168+ <!ENTITY Auml "Ä">
169+ <!ENTITY auml "ä">
170+ <!ENTITY bdquo "„">
171+ <!ENTITY Beta "Β">
172+ <!ENTITY beta "β">
173+ <!ENTITY brvbar "¦">
174+ <!ENTITY bull "•">
175+ <!ENTITY cap "∩">
176+ <!ENTITY Ccedil "Ç">
177+ <!ENTITY ccedil "ç">
178+ <!ENTITY cedil "¸">
179+ <!ENTITY cent "¢">
180+ <!ENTITY Chi "Χ">
181+ <!ENTITY chi "χ">
182+ <!ENTITY circ "ˆ">
183+ <!ENTITY clubs "♣">
184+ <!ENTITY cong "≅">
185+ <!ENTITY copy "©">
186+ <!ENTITY crarr "↵">
187+ <!ENTITY cup "∪">
188+ <!ENTITY curren "¤">
189+ <!ENTITY dagger "†">
190+ <!ENTITY Dagger "‡">
191+ <!ENTITY darr "↓">
192+ <!ENTITY dArr "⇓">
193+ <!ENTITY deg "°">
194+ <!ENTITY Delta "Δ">
195+ <!ENTITY delta "δ">
196+ <!ENTITY diams "♦">
197+ <!ENTITY divide "÷">
198+ <!ENTITY Eacute "É">
199+ <!ENTITY eacute "é">
200+ <!ENTITY Ecirc "Ê">
201+ <!ENTITY ecirc "ê">
202+ <!ENTITY Egrave "È">
203+ <!ENTITY egrave "è">
204+ <!ENTITY empty "∅">
205+ <!ENTITY emsp " ">
206+ <!ENTITY ensp " ">
207+ <!ENTITY epsilon "ε">
208+ <!ENTITY Epsilon "Ε">
209+ <!ENTITY equiv "≡">
210+ <!ENTITY Eta "Η">
211+ <!ENTITY eta "η">
212+ <!ENTITY ETH "Ð">
213+ <!ENTITY eth "ð">
214+ <!ENTITY Euml "Ë">
215+ <!ENTITY euml "ë">
216+ <!ENTITY exist "∃">
217+ <!ENTITY fnof "ƒ">
218+ <!ENTITY forall "∀">
219+ <!ENTITY frac12 "½">
220+ <!ENTITY frac14 "¼">
221+ <!ENTITY frac34 "¾">
222+ <!ENTITY frasl "⁄">
223+ <!ENTITY Gamma "Γ">
224+ <!ENTITY gamma "γ">
225+ <!ENTITY ge "≥">
226+ <!ENTITY gt ">">
227+ <!ENTITY harr "↔">
228+ <!ENTITY hArr "⇔">
229+ <!ENTITY hearts "♥">
230+ <!ENTITY hellip "…">
231+ <!ENTITY Iacute "Í">
232+ <!ENTITY iacute "í">
233+ <!ENTITY Icirc "Î">
234+ <!ENTITY icirc "î">
235+ <!ENTITY iexcl "¡">
236+ <!ENTITY Igrave "Ì">
237+ <!ENTITY igrave "ì">
238+ <!ENTITY image "ℑ">
239+ <!ENTITY infin "∞">
240+ <!ENTITY int "∫">
241+ <!ENTITY Iota "Ι">
242+ <!ENTITY iota "ι">
243+ <!ENTITY iquest "¿">
244+ <!ENTITY isin "∈">
245+ <!ENTITY Iuml "Ï">
246+ <!ENTITY iuml "ï">
247+ <!ENTITY Kappa "Κ">
248+ <!ENTITY kappa "κ">
249+ <!ENTITY Lambda "Λ">
250+ <!ENTITY lambda "λ">
251+ <!ENTITY lang "〈">
252+ <!ENTITY laquo "«">
253+ <!ENTITY larr "←">
254+ <!ENTITY lArr "⇐">
255+ <!ENTITY lceil "⌈">
256+ <!ENTITY ldquo "“">
257+ <!ENTITY le "≤">
258+ <!ENTITY lfloor "⌊">
259+ <!ENTITY lowast "∗">
260+ <!ENTITY loz "◊">
261+ <!ENTITY lrm "‎">
262+ <!ENTITY lsaquo "‹">
263+ <!ENTITY lsquo "‘">
264+ <!ENTITY lt "<">
265+ <!ENTITY macr "¯">
266+ <!ENTITY mdash "—">
267+ <!ENTITY micro "µ">
268+ <!ENTITY middot "·">
269+ <!ENTITY minus "−">
270+ <!ENTITY Mu "Μ">
271+ <!ENTITY mu "μ">
272+ <!ENTITY nabla "∇">
273+ <!ENTITY nbsp " ">
274+ <!ENTITY ndash "–">
275+ <!ENTITY ne "≠">
276+ <!ENTITY ni "∋">
277+ <!ENTITY not "¬">
278+ <!ENTITY notin "∉">
279+ <!ENTITY nsub "⊄">
280+ <!ENTITY Ntilde "Ñ">
281+ <!ENTITY ntilde "ñ">
282+ <!ENTITY Nu "Ν">
283+ <!ENTITY nu "ν">
284+ <!ENTITY Oacute "Ó">
285+ <!ENTITY oacute "ó">
286+ <!ENTITY Ocirc "Ô">
287+ <!ENTITY ocirc "ô">
288+ <!ENTITY OElig "Œ">
289+ <!ENTITY oelig "œ">
290+ <!ENTITY Ograve "Ò">
291+ <!ENTITY ograve "ò">
292+ <!ENTITY oline "‾">
293+ <!ENTITY Omega "Ω">
294+ <!ENTITY omega "ω">
295+ <!ENTITY Omicron "Ο">
296+ <!ENTITY omicron "ο">
297+ <!ENTITY oplus "⊕">
298+ <!ENTITY or "⊦">
299+ <!ENTITY ordf "ª">
300+ <!ENTITY ordm "º">
301+ <!ENTITY Oslash "Ø">
302+ <!ENTITY oslash "ø">
303+ <!ENTITY Otilde "Õ">
304+ <!ENTITY otilde "õ">
305+ <!ENTITY otimes "⊗">
306+ <!ENTITY Ouml "Ö">
307+ <!ENTITY ouml "ö">
308+ <!ENTITY para "¶">
309+ <!ENTITY part "∂">
310+ <!ENTITY permil "‰">
311+ <!ENTITY perp "⊥">
312+ <!ENTITY Phi "Φ">
313+ <!ENTITY phi "φ">
314+ <!ENTITY Pi "Π">
315+ <!ENTITY pi "π">
316+ <!ENTITY piv "ϖ">
317+ <!ENTITY plusmn "±">
318+ <!ENTITY pound "£">
319+ <!ENTITY prime "′">
320+ <!ENTITY Prime "″">
321+ <!ENTITY prod "∏">
322+ <!ENTITY prop "∝">
323+ <!ENTITY Psi "Ψ">
324+ <!ENTITY psi "ψ">
325+ <!ENTITY quot """>
326+ <!ENTITY radic "√">
327+ <!ENTITY rang "〉">
328+ <!ENTITY raquo "»">
329+ <!ENTITY rarr "→">
330+ <!ENTITY rArr "⇒">
331+ <!ENTITY rceil "⌉">
332+ <!ENTITY rdquo "”">
333+ <!ENTITY real "ℜ">
334+ <!ENTITY reg "®">
335+ <!ENTITY rfloor "⌋">
336+ <!ENTITY Rho "Ρ">
337+ <!ENTITY rho "ρ">
338+ <!ENTITY rlm "‏">
339+ <!ENTITY rsaquo "›">
340+ <!ENTITY rsquo "’">
341+ <!ENTITY sbquo "‚">
342+ <!ENTITY Scaron "Š">
343+ <!ENTITY scaron "š">
344+ <!ENTITY sdot "⋅">
345+ <!ENTITY sect "§">
346+ <!ENTITY shy "­">
347+ <!ENTITY Sigma "Σ">
348+ <!ENTITY sigma "σ">
349+ <!ENTITY sigmaf "ς">
350+ <!ENTITY sim "∼">
351+ <!ENTITY spades "♠">
352+ <!ENTITY sub "⊂">
353+ <!ENTITY sube "⊆">
354+ <!ENTITY sum "∑">
355+ <!ENTITY sup "⊃">
356+ <!ENTITY sup1 "¹">
357+ <!ENTITY sup2 "²">
358+ <!ENTITY sup3 "³">
359+ <!ENTITY supe "⊇">
360+ <!ENTITY szlig "ß">
361+ <!ENTITY Tau "Τ">
362+ <!ENTITY tau "τ">
363+ <!ENTITY there4 "∴">
364+ <!ENTITY Theta "Θ">
365+ <!ENTITY theta "θ">
366+ <!ENTITY thetasym "ϑ">
367+ <!ENTITY thinsp " ">
368+ <!ENTITY THORN "Þ">
369+ <!ENTITY thorn "þ">
370+ <!ENTITY tilde "˜">
371+ <!ENTITY times "×">
372+ <!ENTITY trade "™">
373+ <!ENTITY Uacute "Ú">
374+ <!ENTITY uacute "ú">
375+ <!ENTITY uarr "↑">
376+ <!ENTITY uArr "⇑">
377+ <!ENTITY Ucirc "Û">
378+ <!ENTITY ucirc "û">
379+ <!ENTITY Ugrave "Ù">
380+ <!ENTITY ugrave "ù">
381+ <!ENTITY uml "¨">
382+ <!ENTITY upsih "ϒ">
383+ <!ENTITY Upsilon "Υ">
384+ <!ENTITY upsilon "υ">
385+ <!ENTITY Uuml "Ü">
386+ <!ENTITY uuml "ü">
387+ <!ENTITY weierp "℘">
388+ <!ENTITY Xi "Ξ">
389+ <!ENTITY xi "ξ">
390+ <!ENTITY Yacute "Ý">
391+ <!ENTITY yacute "ý">
392+ <!ENTITY yen "¥">
393+ <!ENTITY Yuml "Ÿ">
394+ <!ENTITY yuml "ÿ">
395+ <!ENTITY Zeta "Ζ">
396+ <!ENTITY zeta "ζ">
397+ <!ENTITY zwj "‍">
398+ <!ENTITY zwnj "‌">` .replace (/ \n / g , ' ' );
399+
400+ /**
401+ * A reasonably strict xml declaration.
402+ */
403+ const XML_DECL = ' <?xml version="1.0" standalone="no"?>' ;
404+
405+ /**
406+ * The beginning of the XML doctype declaration.
407+ */
408+ const DOCTYPE_START = ` <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [` ;
409+
410+ /**
411+ * The end of the XML docype declaration.
412+ */
413+ const DOCTYPE_END = ' ]>' ;
414+
415+ /**
416+ * A full header for an SVG XML document.
417+ */
418+ const SVG_XML_HEADER = ` ${ XML_DECL }
419+ ${ DOCTYPE_START }${ HTML_ENTITIES }${ DOCTYPE_END } ` ;
420+
135421 void Promise .all ([... diagrams].map (renderOneMarmaid));
136422 });
137423< / script>
0 commit comments