|
274 | 274 | "execution_count": null,
|
275 | 275 | "metadata": {},
|
276 | 276 | "outputs": [],
|
277 |
| - "source": [] |
| 277 | + "source": [ |
| 278 | + "#| export\n", |
| 279 | + "def MermaidJS(\n", |
| 280 | + " sel='.language-mermaid', # CSS selector for mermaid elements\n", |
| 281 | + " theme='base', # Mermaid theme to use\n", |
| 282 | + " ):\n", |
| 283 | + " \"Implements browser-based Mermaid diagram rendering.\"\n", |
| 284 | + " src = \"\"\"\n", |
| 285 | + "import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';\n", |
| 286 | + "\n", |
| 287 | + "mermaid.initialize({\n", |
| 288 | + " startOnLoad: false,\n", |
| 289 | + " theme: '%s',\n", |
| 290 | + " securityLevel: 'loose',\n", |
| 291 | + " flowchart: { useMaxWidth: false, useMaxHeight: false }\n", |
| 292 | + "});\n", |
| 293 | + "\n", |
| 294 | + "function renderMermaidDiagrams(element, index) {\n", |
| 295 | + " try {\n", |
| 296 | + " const graphDefinition = element.textContent;\n", |
| 297 | + " const graphId = `mermaid-diagram-${index}`;\n", |
| 298 | + " mermaid.render(graphId, graphDefinition)\n", |
| 299 | + " .then(({svg, bindFunctions}) => {\n", |
| 300 | + " element.innerHTML = svg;\n", |
| 301 | + " bindFunctions?.(element);\n", |
| 302 | + " })\n", |
| 303 | + " .catch(error => {\n", |
| 304 | + " console.error(`Error rendering Mermaid diagram ${index}:`, error);\n", |
| 305 | + " element.innerHTML = `<p>Error rendering diagram: ${error.message}</p>`;\n", |
| 306 | + " });\n", |
| 307 | + " } catch (error) {\n", |
| 308 | + " console.error(`Error processing Mermaid diagram ${index}:`, error);\n", |
| 309 | + " }\n", |
| 310 | + "}\n", |
| 311 | + "\n", |
| 312 | + "// Assuming proc_htmx is a function that triggers rendering\n", |
| 313 | + "proc_htmx('%s', renderMermaidDiagrams);\n", |
| 314 | + "\"\"\" % (theme, sel)\n", |
| 315 | + " return Script(src, type='module')\n" |
| 316 | + ] |
| 317 | + }, |
| 318 | + { |
| 319 | + "cell_type": "markdown", |
| 320 | + "metadata": {}, |
| 321 | + "source": [ |
| 322 | + "```python\n", |
| 323 | + "app, rt = fast_app(hdrs=[MermaidJS()])\n", |
| 324 | + "@rt('/')\n", |
| 325 | + "def get():\n", |
| 326 | + " return Titled(\"Mermaid Examples\", \n", |
| 327 | + " # Assigning 'marked' class to components renders content as markdown\n", |
| 328 | + " Pre(Code(cls =\"language-mermaid\")('''flowchart TD\n", |
| 329 | + " A[main] --> B[\"fact(5)\"] --> C[\"fact(4)\"] --> D[\"fact(3)\"] --> E[\"fact(2)\"] --> F[\"fact(1)\"] --> G[\"fact(0)\"]\n", |
| 330 | + " ''')))\n", |
| 331 | + "```\n", |
| 332 | + "In a markdown file, just like a code cell you can define \n", |
| 333 | + "\n", |
| 334 | + "\\```mermaid\n", |
| 335 | + "\n", |
| 336 | + " graph TD\n", |
| 337 | + " A --> B \n", |
| 338 | + " B --> C \n", |
| 339 | + " C --> E\n", |
| 340 | + "\n", |
| 341 | + "\\```" |
| 342 | + ] |
278 | 343 | }
|
279 | 344 | ],
|
280 | 345 | "metadata": {
|
|
0 commit comments