Follow me
RSS feed
My sources
My Viadeo

GraphViz avec Node.js

Greg | 06 Sep 2010

Projets Le plaisir que j'ai à utiliser GraphViz ne semble pas prêt de s'estomper. La preuve, aujourd'hui, avec une rapide présentation d'un nouveau projet : node-graphviz.

Vous l'aurez certainement compris, ce projet a pour objectif de mettre à disposition un module permettant d'utiliser GraphViz avec Node.js1.

Node.js

Pour ceux qui l'ignorent encore, Node.js est un framework permettant d'écrire des applications en Javascript2. Et il n'est pas ici question seulement de Web, mais plus largement de pouvoir utiliser Javascript comme n'importe quel langage de script, et donc côté serveur. Si personne aujourd'hui n'ignore l'importance de ce langage dans le développement Web, nous pouvons dire que depuis quelque temps, avec des projets comme Node.js ou Narwhal, Javascript est en train de se faire une troisième jeunesse en passant du client vers le serveur3.

Le principal intérêt d'un outil tel que Node.js est de pouvoir utiliser le même langage côté client et serveur. Même si en général le job est totalement différent d'un bout à l'autre de la ligne, cela offre tout de même des perspectives intéressantes en terme de réutilisabilité de code.

Notez qu'au-delà du Web, Node.js vous permet aussi de développer des scripts4 qui n'ont rien à voir avec le Web5...

node-graphviz

Comme je l'ai indiqué, node-graphviz offre la possibilité d'utiliser GraphViz avec Node.js. Il s'inspire largement de Ruby/GraphViz, IoGraphViz et java-graphviz.

L'API est pour le moment très limitée, mais permet déjà de réaliser des graphs de bases avec ajout de noeuds, arcs, sous-graphs et gestion des attributs :

var sys = require('sys'),
  graphviz = require('../lib/graphviz');

// Creation d'un graph direct
var g = graphviz.digraph("G");

// Creation d'un sous-graph
var cluster_0 = g.addCluster("cluster_0");

// Attributs pour le sous-graph
cluster_0.set( "style", "filled" );
cluster_0.set( "color", "lightgrey" );

// Attributs des noeuds du sous-graph
cluster_0.setNodeAttribut( "style", "filled" )
cluster_0.setNodeAttribut( "color", "white" )

// Ajouts d'arcs
cluster_0.addEdge( "a0", "a1" );
cluster_0.addEdge( "a1", "a2" );
cluster_0.addEdge( "a2", "a3" );

// Attribut du sous-graph
cluster_0.set( "label", "process #1" )

// Nouveau sous-graph
var cluster_1 = g.addCluster("cluster_1");

// Attributs des noeuds
cluster_1.setNodeAttribut( "style", "filled" )

// Ajout d'arcs
cluster_1.addEdge( "b0", "b1" );
cluster_1.addEdge( "b1", "b2" );
cluster_1.addEdge( "b2", "b3" );

// Attributs du sous-graph
cluster_1.set( "label", "process #2" );
cluster_1.set( "color", "blue" );

// Arcs entre les noeuds du graph et des sous-graphs
g.addEdge( "start", cluster_0.getNode("a0") );
g.addEdge( "start", cluster_1.getNode("b0") );
g.addEdge( cluster_0.getNode("a1"), cluster_1.getNode("b3") );
g.addEdge( cluster_1.getNode("b2"), cluster_0.getNode("a3") );
g.addEdge( cluster_0.getNode("a3"), cluster_0.getNode("a0") );
g.addEdge( cluster_0.getNode("a3"), "end" );
g.addEdge( cluster_1.getNode("b3"), "end" );

// Création de noeuds avec attributs pour le graph
g.getNode("start").set( "shape", "Mdiamond" );
g.getNode("end").set( "shape", "Msquare" );

// Affichage du script GraphViz sur la console
console.log( g.to_dot() );

// Génération d'une sortie au format PNG
g.output( "png", "cluster.png" );

1 ou nodejs ou node...
2 Autant le dire tout de suite, si vous n'aimez pas, passez votre chemin !
3 Avec comme première jeunesse Javascript et comme seconde jeunesse AJAX.
4 Parler d'application est peut-être un peu prématuré.
5 Enfin de là à voir un sysadmin utiliser Node.js...

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.