summaryrefslogtreecommitdiff
path: root/content/Informatique/2013-10-12-rst_graphviz.rst
blob: 82b9c7b1f04efc73bb76742e16544818db2e4042 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
.. -*- mode: rst -*-
.. -*-  coding: utf-8 -*-

Ajouter graphviz dans les documents restructuredText
####################################################

:date: 2013-10-12
:tags: Libre, reStructuredText
:logo: /images/graphviz/graphe.png
:summary: |summary|

.. default-role:: literal

:2014-05-05:    Je met l'article à jour avec la dernière version du script que
                j'utilise. J'en profite pour donner un peu plus d'exemples.

.. image:: {filename}/images/graphviz/graphe.png
    :class: floatleft
    :scale: 50
    :alt: Graphe

|summary|

.. |summary| replace::
    C'est en utilisant un produit tous les jours que nous vient l'envie de
    l'améliorer. Dernièrement, j'ai eu besoin de générer un texte contenant des
    graphes. Il y a quelques temps, j'aurais préparé mes graphes dans des
    images à part, et inclus les images dans mon document, sauf que cette fois,
    j'ai décidé d'inclure directement le code du graphe dans mon document.

Graphviz_ est une merveilleuse librairie pour générer des représentations de
graphes comme celle qui se trouve à côté. À partir d'un fichier texte contenant
la description du graphe, l'application nous génère une image (avec différents
formats possibles) du graphe. Par exemple, l'image ci contre peut-être
représentée avec le code suivant :

.. code-block:: dot

    digraph G {

        a -> a
        a -> b
        d -> b
        b -> c
        c -> b
    }

.. _Graphviz: http://graphviz.org/

Je ne rentre pas davantage dans la description de gv, l'application est très
complète, et un article ne suffirait pas à tout couvrir !

La question qui se pose est donc de pouvoir inclure directement graphviz lors
de la génération du document. Pour ça, j'ai créé une nouvelle directive_,
`graphviz` qui appele directement dot lors de la génération du document.

.. _directive: http://docutils.sourceforge.net/docs/ref/rst/directives.html

.. list-table::
    :header-rows: 1
    :stub-columns: 1
    :widths:    10 45 45

    *   - Exemple
        - Code
        - Résultat
    *   - Insérer un graphe orienté
        -
            .. code-block:: rst

                .. graphviz:: digraph

                    a -> a
                    a -> b
                    d -> b
                    b -> c
                    c -> b

                    ..
                    ceci est une légende
        -

            .. figure:: {filename}/images/graphviz/graphe.png
                :alt: graphe orienté avec légende

                ceci est une légende

    *   - Insérer un graphe non-orienté
        -
            .. code-block:: rst

                .. graphviz:: graph

                    a -- a
                    a -- b
                    d -- b
                    b -- c
                    c -- b
        -

            .. figure:: {filename}/images/graphviz/no.png
                :alt: graphe non orienté

    *   - Utiliser des options
        -
            .. code-block:: rst

                .. graphviz:: digraph

                    rankdir = LR;

                    a -> a
                    a -> b
                    d -> b
                    b -> c
                    c -> b
        -

            .. figure:: {filename}/images/graphviz/options.png
                :alt:   graphe horizontal


Pour ceux que ça intéresse, voici le script pour rst2html_ et rst2latex_. Le
code est similaire, cela ajoute une nouvelle directive qui génère le document à
l'aide de graphviz, et stocke l'image dans un fichier temporaire, créé dans un
répertoire *tmp* (qui doit exister avant de lancer la commande). On pourrait
très facilement l'ajouter à rst2odt en suivant le même principe.

Le script rst2latex génère les images en pdf, il est prévu pour être utilisé
avec `pdflatex`.

C'est tout, le langage est tellement simple que ça serait dommage de ne pas en
profiter !

.. _rst2html: {filename}/resources/rst_graphviz/rst2html.py
.. _rst2latex: {filename}/resources/rst_graphviz/rst2latex.py