aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/Informatique/rst_graphviz.rst85
-rw-r--r--content/images/graphe.pngbin0 -> 4110 bytes
-rwxr-xr-xcontent/resources/rst_graphviz/rst2html.py61
-rwxr-xr-xcontent/resources/rst_graphviz/rst2latex.py64
4 files changed, 210 insertions, 0 deletions
diff --git a/content/Informatique/rst_graphviz.rst b/content/Informatique/rst_graphviz.rst
new file mode 100644
index 0000000..2b6df48
--- /dev/null
+++ b/content/Informatique/rst_graphviz.rst
@@ -0,0 +1,85 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+Ajouter graphviz dans les documents restructuredText
+####################################################
+
+:date: 2013-10-12
+:tags: Libre, reStructuredText
+:logo: static/images/graphe.png
+:summary: |summary|
+
+.. image:: |filename|/images/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:: C
+
+ 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
+
+.. code-block:: rst
+
+ Voici une image :
+
+ .. graphviz::
+
+ digraph G {
+
+ a -> a
+ a -> b
+ d -> b
+ b -> c
+ c -> b
+ }
+
+deviendra :
+
+ Voici une image :
+
+ .. image:: |filename|/images/graphe.png
+
+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.
+
+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
diff --git a/content/images/graphe.png b/content/images/graphe.png
new file mode 100644
index 0000000..9c20f10
--- /dev/null
+++ b/content/images/graphe.png
Binary files differ
diff --git a/content/resources/rst_graphviz/rst2html.py b/content/resources/rst_graphviz/rst2html.py
new file mode 100755
index 0000000..ab09012
--- /dev/null
+++ b/content/resources/rst_graphviz/rst2html.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+
+# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing HTML.
+"""
+
+try:
+ import locale
+ locale.setlocale(locale.LC_ALL, '')
+except:
+ pass
+
+import subprocess
+import os.path
+
+from docutils.core import publish_cmdline, default_description
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives.images import Figure
+
+
+description = ('Generates (X)HTML documents from standalone reStructuredText '
+ 'sources. ' + default_description)
+
+class Graphviz(Figure):
+ """ Generate a graphviz image
+ """
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+
+ option_spec = Figure.option_spec.copy()
+
+ def run(self):
+
+ text = '\n'.join(self.content)
+ extension = 'png'
+ imageFile = "tmp/%s.%s" % (hash(text), extension)
+ if not os.path.exists(imageFile):
+ conversion = subprocess.Popen(['/usr/bin/dot',
+ '-T', 'png',
+ '-o', imageFile,
+ ],
+ stdin=subprocess.PIPE
+ )
+ conversion.communicate(text)
+ conversion.wait()
+
+ self.arguments = [imageFile]
+ self.options['scale'] = 50
+ self.content = None
+ return Figure.run(self)
+
+directives.register_directive('graphviz', Graphviz)
+
+publish_cmdline(writer_name='html', description=description)
diff --git a/content/resources/rst_graphviz/rst2latex.py b/content/resources/rst_graphviz/rst2latex.py
new file mode 100755
index 0000000..9185405
--- /dev/null
+++ b/content/resources/rst_graphviz/rst2latex.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+
+# $Id: rst2latex.py 5905 2009-04-16 12:04:49Z milde $
+# Author: David Goodger <goodger@python.org>
+# Copyright: This module has been placed in the public domain.
+
+"""
+A minimal front end to the Docutils Publisher, producing LaTeX.
+"""
+
+try:
+ import locale
+ locale.setlocale(locale.LC_ALL, '')
+except:
+ pass
+
+import subprocess
+import os.path
+
+from docutils.core import publish_cmdline
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives.images import Figure
+
+description = ('Generates LaTeX documents from standalone reStructuredText '
+ 'sources. '
+ 'Reads from <source> (default is stdin) and writes to '
+ '<destination> (default is stdout). See '
+ '<http://docutils.sourceforge.net/docs/user/latex.html> for '
+ 'the full reference.')
+
+class Graphviz(Figure):
+ """ Generate a graphviz image
+ """
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ has_content = True
+
+ option_spec = Figure.option_spec.copy()
+
+ def run(self):
+
+ text = '\n'.join(self.content)
+ extension = 'png'
+ imageFile = "tmp/%s.%s" % (hash(text), extension)
+ if not os.path.exists(imageFile):
+ conversion = subprocess.Popen(['/usr/bin/dot',
+ '-T', 'png',
+ '-o', imageFile,
+ ],
+ stdin=subprocess.PIPE
+ )
+ conversion.communicate(text)
+ conversion.wait()
+
+ self.arguments = [imageFile]
+ self.options['scale'] = 50
+ self.content = None
+ return Figure.run(self)
+
+directives.register_directive('graphviz', Graphviz)
+
+publish_cmdline(writer_name='latex', description=description)