Inclure des graphes DOT avec GraphViz dans une page Sphinx

Des graphes ?

Je teste ici la fonctionnalité « expérimentale » d’embarquer des graphes écrits avec une balise .. graphviz::, et censés être rendus avec GraphViz.

Cette fonctionnalité est ajoutée par l’extension sphinx.ext.graphviz, incluse par défaut dans sphinx depuis sa version 0.6.

Cette directive graphviz utilise le langage DOT Graph de description de graphe (dirigé ou non). Ce langage est un standard dans le monde informatique : ingénieurs, chercheurs, enseignants, tous l’utilisent !

Avertissement

Si les graphes suivants ne sont pas affichés, c’est probablement parce que votre navigateur ne supporte pas les images SVG. Dans ce cas, un seul conseil : adoptez Mozilla Firefox :) !

Exemples

.. graphviz:::

Sphinx permet de réaliser la transformation suivante :

digraph Sphinx { "fichiers texte (.rst)" -> "pages web (.html)"; "fichiers texte (.rst)" -> "pages de manuel (.1)"; "fichiers texte (.rst)" -> "fichiers LaTeX (.tex)"; "fichiers texte (.rst)" -> "pages web (.epub)"; }

Le code reStructuredText est simple et contient les informations sémantiques sur le graphique, pas les informations graphiques / vectorielles / pixels :

.. graphviz::

   digraph Sphinx {
      "fichiers texte (.rst)" -> "pages web (.html)";
      "fichiers texte (.rst)" -> "pages de manuel (.1)";
      "fichiers texte (.rst)" -> "fichiers LaTeX (.tex)";
      "fichiers texte (.rst)" -> "pages web (.epub)";
   }

.. digraph:::

Cette directive sert à décrire des graphes dirigés.

Sphinx autodoc (et un script comme pytorst.py) permettent de réaliser la transformation suivante :

digraph autodoc { ".py" -> ".rst" -> ".html"; }

.. graph:::

Cette directive sert à décrire des graphes non-dirigés.

LaTeX

pdflatex permet de réaliser la transformation suivante (avec comme exemple mon CV écrit en LaTeX) :

graph latex { "fichier LaTeX" -- "fichier PDF" ".tex" -- ".pdf"; "cv.fr.tex" -- "cv.fr.pdf"; }

HeVeA permet de réaliser la transformation suivante :

graph hevea { "fichier LaTeX" -- "page web (HTML)" ".tex" -- ".html"; "cv.tex" -- "cv.hevea.html"; }

Le code reStructuredText est encore une fois simple et contient les informations sémantiques sur le graphique, pas les informations graphiques / vectorielles / pixels :

.. graph:: latex

   "LaTeX file" -- "PDF file"
   ".tex" -- ".pdf";
   "cv.en.tex" -- "cv.en.pdf";

Les Hautes-Alpes

Je suis né et j’ai vécu à Briançon, dans les Hautes-Alpes jusqu’à mes 16 ans, avant de partir étudier au Lycée Thiers de Marseille.

Dans les Hautes-Alpes, il y a notamment les villes suivantes (un arc signifie que les deux villes sont dans la même vallée, ie. reliées entre elles par une rivière !) :

graph alpes { "Bri" [color="red", style="bold", label="Briançon"]; "Veynes" -- "Gap" -- "Chorges" -- "Embrun" -- "Mont-Dauphin" -- "L'Argentière" -- "Bri"; "Mont-Dauphin" -- "Guillestre"; "L'Argentière" -- "Valouise" -- "Puit St-Vincent"; "Bri" -- "Montgenèvre"; "Embrun" -- "Les Orres"; }

Un fichier externe

On peut aussi aller chercher un fichier externe. Voici par exemple un graphe de dépendances (pour un vieux jeu en réseau écrit Python en 2012) généré via pyreverse, et inclus via .. graphviz:: .graph.dot (le fichier s’appelle .graph.dot, vous pouvez le télécharger et le visualiser dans un éditeur de texte).

digraph "packages_Bomberman" { charset="utf-8" rankdir=BT "3" [shape="octagon", color="yellow", style="bold" label="PyRlwrap"]; "4" [shape="egg", color="red", style="bold" label="ParseMessageIn"]; "6" [shape="box", color="blue", style="bold" label="Bomb"]; "9" [color="green", style="bold" label="BombermanServer"]; "10" [shape="box", color="blue", style="bold" label="Matrix"]; "12" [shape="box", color="blue", style="bold" label="Bonus"]; "14" [color="green", style="bold" label="BombermanClient"]; "15" [shape="house", color="magenta", style="bold" label="KeyBinding"]; "17" [shape="house", color="magenta", style="bold" label="AffichPygame"]; "19" [shape="box", color="blue", style="bold" label="Player"]; "23" [shape="house", color="magenta", style="bold" label="SimpleGame"]; "24" [color="green", style="bold" label="ConfigClient"]; "25" [shape="box", color="blue", style="bold" label="Board"]; "29" [shape="octagon", color="yellow", style="bold" label="conf"]; "30" [shape="hexagon", color="black", style="bold" label="ANSIColors"]; "31" [color="green", style="bold" label="IA_Bomberman"]; "32" [shape="egg", color="red", style="bold" label="ParseMessageOut"]; "33" [shape="hexagon", color="black", style="bold" label="ParseCommandArgs"]; "34" [shape="octagon", color="yellow", style="bold" label="scanf"]; "44" [shape="box", label="Constants"]; "45" [color="green", style="bold" label="ConfigServer"]; "4" -> "34" [arrowtail="none", arrowhead="open"]; "4" -> "30" [arrowtail="none", arrowhead="open"]; "4" -> "44" [arrowtail="none", arrowhead="open"]; "6" -> "30" [arrowtail="none", arrowhead="open"]; "6" -> "44" [arrowtail="none", arrowhead="open"]; "9" -> "10" [arrowtail="none", arrowhead="open"]; "9" -> "19" [arrowtail="none", arrowhead="open"]; "9" -> "30" [arrowtail="none", arrowhead="open"]; "9" -> "4" [arrowtail="none", arrowhead="open"]; "9" -> "25" [arrowtail="none", arrowhead="open"]; "9" -> "33" [arrowtail="none", arrowhead="open"]; "9" -> "32" [arrowtail="none", arrowhead="open"]; "9" -> "17" [arrowtail="none", arrowhead="open"]; "9" -> "44" [arrowtail="none", arrowhead="open"]; "9" -> "45" [arrowtail="none", arrowhead="open"]; "12" -> "44" [arrowtail="none", arrowhead="open"]; "14" -> "10" [arrowtail="none", arrowhead="open"]; "14" -> "19" [arrowtail="none", arrowhead="open"]; "14" -> "30" [arrowtail="none", arrowhead="open"]; "14" -> "4" [arrowtail="none", arrowhead="open"]; "14" -> "25" [arrowtail="none", arrowhead="open"]; "14" -> "33" [arrowtail="none", arrowhead="open"]; "14" -> "6" [arrowtail="none", arrowhead="open"]; "14" -> "32" [arrowtail="none", arrowhead="open"]; "14" -> "17" [arrowtail="none", arrowhead="open"]; "14" -> "44" [arrowtail="none", arrowhead="open"]; "14" -> "24" [arrowtail="none", arrowhead="open"]; "15" -> "30" [arrowtail="none", arrowhead="open"]; "17" -> "19" [arrowtail="none", arrowhead="open"]; "17" -> "23" [arrowtail="none", arrowhead="open"]; "17" -> "4" [arrowtail="none", arrowhead="open"]; "17" -> "32" [arrowtail="none", arrowhead="open"]; "17" -> "44" [arrowtail="none", arrowhead="open"]; "19" -> "6" [arrowtail="none", arrowhead="open"]; "19" -> "30" [arrowtail="none", arrowhead="open"]; "19" -> "32" [arrowtail="none", arrowhead="open"]; "19" -> "44" [arrowtail="none", arrowhead="open"]; "23" -> "10" [arrowtail="none", arrowhead="open"]; "23" -> "19" [arrowtail="none", arrowhead="open"]; "23" -> "30" [arrowtail="none", arrowhead="open"]; "23" -> "15" [arrowtail="none", arrowhead="open"]; "23" -> "25" [arrowtail="none", arrowhead="open"]; "23" -> "33" [arrowtail="none", arrowhead="open"]; "23" -> "32" [arrowtail="none", arrowhead="open"]; "23" -> "17" [arrowtail="none", arrowhead="open"]; "23" -> "44" [arrowtail="none", arrowhead="open"]; "25" -> "6" [arrowtail="none", arrowhead="open"]; "25" -> "10" [arrowtail="none", arrowhead="open"]; "25" -> "30" [arrowtail="none", arrowhead="open"]; "25" -> "32" [arrowtail="none", arrowhead="open"]; "25" -> "12" [arrowtail="none", arrowhead="open"]; "25" -> "44" [arrowtail="none", arrowhead="open"]; "31" -> "14" [arrowtail="none", arrowhead="open"]; "32" -> "30" [arrowtail="none", arrowhead="open"]; "32" -> "44" [arrowtail="none", arrowhead="open"]; "44" -> "15" [arrowtail="none", arrowhead="open"]; "44" -> "30" [arrowtail="none", arrowhead="open"]; }


Utiliser ceci pour la doc de scipy

Pour le module scipy.sparse.csgraph du projet scipy, la page principale de documentation utilise deux petits graphes comme exemples, qui étaient montrés en ASCII au début, ainsi je voulais ajouter deux fichiers SVG à la place.

J’avais ouvert ce ticket (#5344), et ce commentaire est aussi relié. La demande d’ajout (#5345) n’était pas satisfaisante : le fichier SVG inclus dans la page rST ne fonctionne pas pour une sortie PDF ni pour l’inspection de la docstring (avec IPython ou autre).

Graphe G1 :

Graph G1 0 0 1 1 0--1 2 2 2 0--2 1

Graphe G2 :

Graph G2 0 0 1 1 0--1 2 2 2 0--2 0

Un autre extension : sphinx.ext.todolist

Cette page permet aussi de tester la fonctionnalité ajouté par l’extension sphinx.ext.todolist. Cette extension ajoute une directive .. todo:: qui permet de déclarer un TODO, i.e. une chose à régler.

À faire

Comment l’utiliser à partir d’une page MyST ou Markdown dans Sphinx?

Et ensuite, il est possible d’afficher une liste des TODOs via la directive .. totolist::, comme dans la page todo.