diff options
-rw-r--r-- | content/Informatique/rst_graphviz.rst | 85 | ||||
-rw-r--r-- | content/images/graphe.png | bin | 0 -> 4110 bytes | |||
-rwxr-xr-x | content/resources/rst_graphviz/rst2html.py | 61 | ||||
-rwxr-xr-x | content/resources/rst_graphviz/rst2latex.py | 64 |
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 Binary files differnew file mode 100644 index 0000000..9c20f10 --- /dev/null +++ b/content/images/graphe.png 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) |