Aller au contenu

Mermaid

Le thème propose des fonctionnalités pour faciliter l'intégration dans la documentation de graphiques mermaid créés dynamiquement.


Graphes mermaid dans pyodide-mkdocs-theme

Pour pouvoir utiliser des graphes mermaid dans la documentation, il faut dans un premier temps configurer l'extension markdown pymdownx.superfences dans le fichier mkdocs.yml, si cela n'est pas déjà fait :

markdown_extensions:
  - pymdownx.superfences:
      custom_fences:
        - name: mermaid
          class: mermaid
          format: !!python/name:pymdownx.superfences.fence_code_format

Il est alors possible de déclarer des graphes mermaid simplement en déclarant des blocs de code spécifiant mermaid comme langage :

```mermaid
graph TB
    A --- B
```
graph TB
    A --- B

Principe général#

L'idée générale pour que cela fonctionne est la suivante :

  1. Insérer dans le fichier markdown un élément html (une <div>) qui accueillera la figure une fois qu'elle sera créée.
  2. Signifier au thème que la page va devoir gérer du contenu dynamique mermaid (= "marquer la page").
  3. Dans pyodide, préparer une fonction que l'utilisateur pourra appeler pour générer la figure avec mermaid.
  4. Construire les données et appeler la fonction qui va mettre à jour le contenu de la div créée au point 1.


  • L'Ă©tape 1 est facilitĂ©e par l'utilisation de la macro {{ figure(...) }}.
  • L'Ă©tape 2 est rĂ©alisĂ©e en passant MERMAID=True en argument de l'une des macros IDE, IDEv, terminal, py_btn ou run de la page (v. plus bas).
  • L'Ă©tape 3 est facilitĂ©e par la fonction mermaid_figure(figure_id), qui renvoie une fonction pour modifier le contenu de la balise div d'identifiant figure_id.
  • L'utilisateur n'a plus qu'Ă  appeler la fonction avec un code mermaid valide, Ă  l'Ă©tape 4.

Exemple simple#

Concrètement, pour un IDE qui devrait générer du code mermaid, puis afficher le graphe correspondant dans la page, les codes markdown et python suivant suffisent pour intégrer une première figure dans la page :


Fichier markdown

Dans la page markdown, on insère:

  • La balise qui accueillera la figure.
  • L'IDE qui gĂ©nĂ©rera le code mermaid, en n'oubliant pas d'utiliser l'argument MERMAID.
{{ figure() }}

{{ IDE('exemples/mermaid', MERMAID=True) }}

Fichier python

1
2
3
4
5
6
7
8
#-PYODIDE:env-#
to_mermaid = mermaid_figure()

#-PYODIDE:code-#
to_mermaid("""
graph TB
    A --- B
""")

La fonction mermaid_figure est définie par le thème. C'est une "function factory", qui crée une fonction qui insèrera le code fourni par l'utilisateur dans la bonne balise html.

Voir plus bas pour plus d'informations sur la fonction mermaid_figure.

Résultat

Votre figure

Votre tracé sera ici

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Utilisation dans pyodide#

La fonction mermaid_figure#

Cette fonction est similaire aux objets PyodidePlot :


La fonction mermaid_figure est une "function factory", et renvoie une nouvelle fonction que l'utilisateur pourra appeler pour insérer le graphe mermaid à l'endroit voulu dans la page.
Cette seconde fonction prend deux arguments :

mermaid_figure(id:str) -> (code:str, debug:bool=False) -> None


Argument Type Résumé
code str Code du graphe mermaid à insérer.
debug bool [Défaut: False] Si l'argument debug vaut True, le code passé en argument est affiché dans le terminal avant traitement.


Disponibilité de la fonction mermaid_figure

Si elle est toujours définie dans l'environnement, la fonction mermaid_figure lèvera une erreur si la page de la documentation n'a pas été "marquée" comme devant accueillir du contenu mermaid dynamique (argument MERMAID=True).

Cette contrainte permet de garantir que les différents éléments de logique nécessaires sont présents lors des exécutions.


Exécution locale de fichiers python utilisant la fonction mermaid_figure

Méthode 1 :

La "boîte à outil" du thème permet "d'utiliser" la fonction en local. Il suffit de mettre en place le fichier toolbox.py et de l'importer dans le fichier python:

Snippet Ă  ajouter en haut du fichier python
# --- PYODIDE:ignore --- #
from toolbox import *


Méthode 2 :

Il est aussi possible d'ajouter le code suivant au tout début du fichier python de la documentation :

Snippet Ă  ajouter en haut du fichier python
# --- PYODIDE:ignore --- #
mermaid_figure = lambda _: print



Les codes des sections ignore ne sont exécutés qu'en local: ils ne sont pas utilisés pour construire le site final avec mkdocs.

Mise Ă  jour du DOM#

  • Aucune action de l'utilisateur n'est requise, le thème gère la mise Ă  jour du contenu de la page automatiquement.
  • Pour information, la mise Ă  jour du DOM est faite en mode async, l'appel se situant après l'exĂ©cution des sections post et/ou post_term.

Autres exemples#

Contenu mermaid et macro py_btn

Si tout le code nécessaire est placé dns la section env, une simple macro {{ py_btn(...) }} peut suffire :

{{ figure('btn-fig-id') }}

{{ py_btn('exemples/mermaid_btn', MERMAID=True) }}


1
2
3
4
5
6
7
8
#-PYODIDE:env-#
to_mermaid = mermaid_figure('btn-fig-id')

to_mermaid("""
graph TB
    Graph --- with
    Graph --- btn
""")

Votre figure

Votre tracé sera ici

Contenu mermaid et macro terminal

Noter que l'argument MERMAID=True a été ignoré dans cet exemple, car d'autres macros ont déjà été utilisées pour "marquer" cette page.

{{ terminal('exemples/mermaid_term', FILL='generate()', TERM_H=3) }}

{{ figure('term-fig-id') }}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# --- PYODIDE:env --- #
to_mermaid = mermaid_figure('term-fig-id')

def generate():
    to_mermaid("""
graph TB
    Graph --- with
    Graph --- btn
    btn --- from
    btn --- terminal
""")
print('Utiliser: generate()')

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici

graph TB
    a