Salut,
c'est le retour des plugins et des points d'entree, voyez :
http://trac.rezo.net/trac/spip/changeset/4883
Pour les points d'entrée, j'ai essayé de faire quelque chose de simple, qui
généralise, d'une certaine manière, ce qu'on fait pour les traitements
standards des balises (dans inc-compilo-api).
Pour ce qui concerne les plugins, c'est l'architecture la plus simple, là
aussi, qui a été choisie : un répertoire /plugins/ ; il faudra l'étendre de
manière à ce qu'elle fonctionne avec les find_in_path() etc, mais dans un
premier temps je préfère ne pas compliquer les choses.
1) les "points d'entree", a.k.a. "pipelines"
On définit pour chaque "point d'entrée", dans le code de SPIP, une chaîne de
traitements (que j'ai appelé pipeline, mais on peut sans doute changer de
denomination si vous avez une meilleure idée), sous la forme d'une suite de
fonctions à appliquer.
Les cinq premiers points d'entrée sont les suivants :
$spip_pipeline = array(
'pre_typo' => array('extraire_multi'),
'post_typo' => array('quote_amp'),
'pre_propre' => array('extraire_multi'),
'post_propre' => array(),
'post_syndication' => array()
);
Aux cinq endroits qui vont bien dans le code (c'est-à-dire, respectivement,
au début de la fonction typo, à la fin de la fonction typo, au début de la
fonction propre, à la fin de la fonction propre, et à la fin de l'entree en
BDD d'un nouvel article syndiqué), on insère l'appel suivant :
$letexte = pipeline('pre_typo', $letexte);
en indiquant le nom du pipeline, éventuellement une entrée, et
éventuellement un résultat.
Le pipeline execute ensuite toutes les fonctions listees dans le tableau
$spip_pipeline pour l'action demandée.
2) les "plugins"
à la racine du site, dans /plugins/, se trouvent une série de
sous-répertoires. Chaque sous-répertoire est un "plugin", qu'on peut activer
ou désactiver à la demande.
Un "plugin" est composé obligatoirement d'un fichier version.php, qui (pour
chaque plugin actif) sera chargé à chaque hit ; ce fichier doit être le plus
léger possible.
SPIP commence par charger ecrire/mes_options.php3, qui peut définir un
tableau des plugins à charger, par exemple :
$plugins = array('smallcaps', 'revision_nbsp', 'podcast_client');
Ensuite SPIP charge /plugins/smallcaps/version.php, puis
/plugins/revision_nbsp/version.php etc.
Le fichier version.php peut manipuler les variables courantes, et donc, en
particulier, modifier les pipelines (mais ce n'est pas la seule manière pour
un plugin d'agir).
Par exemple podcast_client/version.php va inserer le traitement (la
fonction) podcast_client dans le pipeline du point d'entrée
"post_syndication", en faisant :
$spip_pipeline['post_syndication'][] = 'podcast_client';
3) la matrice des fichiers définissant les fonctions
ce qui précède ne suffit pas totalement, car comme cette fonction est
grosse, on ne va pas la définir dans version.php ; on va en revanche
indiquer à SPIP où il pourra trouver la défintion de cette fonction, s'il en
a besoin. Cela se fait en l'indiquant dans la variable globale $spip_matrice
# la matrice standard (fichiers definissant les fonctions a inclure)
$spip_matrice = array ();
version.php dit donc :
$spip_matrice['podcast_client'] = dirname(__FILE__).'/podcast_client.php';
et, quand SPIP aura besoin de cette fonction dans un pipeline, il saura
qu'il doit charger /plugins/podcast_client/podcast_client.php
4) ToDo publique : ce que vous pouvez faire
* avec cette architecture, je pense qu'il est facile de créer des plugins
dès maintenant, en sinspirant de ceux qui y sont déjà ; on verra à l'usage
les limites du modèle, qui est volontairement assez minimaliste (pas de
programmation objet, par exemple) pour permettre à n'importe quel
programmeur du dimanche d'essayer sans être rebuté par les aspects formels.
On peut déjà commencer sur SPIP Zone.
* il devrait être assez aisé aussi d'ajouter une interface graphique de
sélection (activation/désactivation) des plugins, puisqu'ils sont bien
rangés dans /plugins/ ; il faut peut-être prévoir un fichier de
documentation par plugin, et pourquoi pas un fichier spécifique
d'installation dans des cas particuliers, qui permettraient à cette
interface graphique de montrer quelque chose à l'utilisateur (et pas juste
le nom du plugin)
* il faudra, au fur et à mesure que des besoins s'expriment, trouver les
bons endroits où insérer les points d'entrée. Le faire de son côté ne
requiert qu'un patch d'une ligne à chaque fois, ce qui permet quand même de
pas mal expérimenter sans tout casser.
-- Fil