Séparer le code de génération des sparklines n'a pas été trop difficile, mon code étant naturellement fortement découplé et svneeg très simple.

Mon problème a plutôt été de trouver une manière d'architecturer le code afin de permettre une intégration rapide et facile dans un projet.

Évidement, l'utilisation des espaces de noms s'est imposé.

Leur utilisation permet en effet de s'affranchir des éventuels problèmes de collision de nom au niveau des classes ou des constantes.

Cerise sur le gâteau, cela évite d'avoir des noms de classe du style maClasseRienQuaMoiQuiVaBienPourFaireLeCafe.

Cependant, il faut trouver une arborescence qui ait sémantiquement du sens tout en permettant d'identifier l'origine du code et une utilisation efficace de l'auto-chargement de classes (sic).

Je me suis donc basé sur les préconisations du PHP Standards Working Group sur le sujet et j'ai commencé par adopter la convention suivante :

  1. Afin de satisfaire mon esprit narcissique, le vendeur, au sens du PHP Standards Working Group, est mageekguy.
  2. L'ensemble du code concernant les sparklines se trouve dans l'espace de nom mageekguy\sparkline.

Petite précision, il est inutile de me dire en commentaire de ce billet que \, c'est de la merde comme séparateur pour les espaces de nommage, personnellement, je ne les voit même plus.

Bref, les trois premiers points de la recommandation du PHP Standards Working Group sont respectés.

Il ne me restait plus qu'à prendre en compte les suivants, mais j'ai alors découvert un problème.

Je voulais pouvoir écrire en PHP ceci :

<?php $sparkline = new \mageekguy\sparkline(); ?>

Or, suivant les préconisations du PHPSWG, le fichier correspondant à la la classe \mageekguy\sparkline aurait du se trouver dans /path/to/my/projetcts/classes/mageekguy/sparkline.php, ce qui ne me va pas du tout.

Je souhaite en effet que l'intégralité du code concernant les sparklines soit, en toute logique, dans un répertoire nommé sparkline.

J'ai donc décidé de passer outre aux recommandations du PHPSWG, et j'ai défini ma méthode d'auto-chargement de classes (re-sic) de façon à ce qu'elle prenne en compte cette contrainte.

Au final, pour utiliser sparkline dans vos projets, il vous suffit :

  1. D'avoir à votre disposition une version de PHP supérieure ou égale à la 5.3 avec le support de gd.
  2. De vous mettre dans le répertoire de votre projet.
  3. De faire un export du dépôt subversion de sparkline :
    # svn export https://svn.mageekbox.net/repositories/sparkline/trunk mageekguy/sparkline

En terme de code PHP, il vous suffira d'écrire un code similaire à celui ci-dessous dans un fichier nommé par exemple index.php situé à la racine du répertoire de votre projet :

<?php

use mageekguy\sparkline;
use mageekguy\sparkline\writers;
use mageekguy\sparkline\layer\linechart;

require(__DIR__ . '/mageekguy/sparkline/autoloader.php');

$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23);

$sparkline = new sparkline(100, 20, $data);
$sparkline
->setPadding(4)
->addLayer(new linechart\curves\line(3, 40, 50, 255))
->addWriter(new writers\png())
->write()
;

?>

Si tout fonctionne correctement, après éxécution de ce code via votre navigateur, vous devriez obtenir ceci à l'écran :

Il est maintenant temps de détailler un peu le fonctionnement de sparkline.

Le constructeur de mageekguy\sparkline prend trois arguments :
  1. La longueur de la sparkline.
  2. La hauteur de la sparkline.
  3. Les données que doit représenter la sparkline.

Le tableau $data contenant les données n'a pas besoin d'être associatif, chaque valeur correspondant à une itération sur les abscisses.

La méthode mageekguy\sparkline::setPadding() permet de définir l'écart entre la courbe et le bord de l'image.

Sparkline fonctionne suivant le principe des calques, chaque calque correspondant à un composant de l'image finale et étant ajouté à l'aide de la méthode mageekguy\sparkline::addLayer().

Vous pouvez donc définir un calque pour définir le fond de l'image, la grille de fond, le texte de fond, la forme de la courbe, l'axe des ordonnées, etc.

Attention, l'ordre des calques a son importance, puisqu'ils sont dessinés dans l'ordre dans lequel ils sont définis.

En conséquence, si vous créez un calque pour avoir un fond coloré après avoir défini le calque correspondant à la courbe, cette dernière ne sera pas visible sur l'image finale.

L'intégralité des calques disponibles actuellement est visible dans le répertoire mageekguy/sparkline\layer et ils sont classés en fonction de leur type.

Enfin, Il faut définir le ou les formats de sortie de l'image finale, à l'aide de la méthode mageekguy\sparkline::addWriter().

Seul le format png est actuellement disponible, vu que c'est celui qui s'adapte le mieux au style graphique des sparklines.

Une fois tout cela défini, la génération de l'image finale est déclenchée par un appel à la méthode mageekguy\sparkline::write().

Pour l'instant, il n'y a pas encore de documentation, mais je pense que le code est suffisament limpique pour que des personnes motivées s'y retrouve rapidement, et je suis disponible en cas de problèmes via l'adresse sparkline[AT]mageekbox dot net.