[dev] Le Couteau Suisse à piloter

... ou comment le pré-configurer et/ou lui ajouter des outils à la volée

Ici est décrit la façon de pré-configurer facilement le Couteau Suisse, tout en lui ajoutant éventuellement vos propres lames personnalisées...

Le Couteau Suisse est un plugin qui propose d’introduire facilement de simples fonctionnalités supplémentaires à SPIP, et que vous pouvez trouver ici. Le présent article est destiné à tous ceux qui créent leurs propres squelettes et pensent trouver avec ce plugin une amélioration notable de leurs sites.

Le but de cet article est d’indiquer comment mieux associer un jeu de squelettes avec Le Couteau Suisse.

Pré-configuration du Couteau Suisse

Une pré-configuration est la mise en place d’un pack permettant en un seul clic de configurer Le Couteau Suisse. Il permettra ensuite de choisir les outils à activer, de définir la valeur de certaines de leurs variables ainsi que certains define() surchargeables.

Voici un exemple qui s’allie avec le squelette « Alternatives ». Ce code est à placer dans le fichier mes_options.php que vous trouverez/placerez dans le dossier config/ :

######## CONFIGURATION COUTEAU SUISSE ########

// Installation des outils par defaut
$GLOBALS['cs_installer']['Alternatives']['outils'] = 
	'supprimer_numero|decoupe|sommaire';

// Installation des variables par defaut
$GLOBALS['cs_installer']['Alternatives']['variables'] = array(
	'auto_sommaire' => 1,
	'balise_sommaire' => 1, // ou 0, si on n'utilise pas la balise #CS_SOMMAIRE
);

// Compatibilite ascendante avec l'ancien filtre 'decoupe'
@define('_decoupe_COMPATIBILITE', '-----');

Observez le résultat sur la page de configuration du Couteau Suisse (ecrire/?exec=admin_couteau_suisse), dans le cadre de gauche, sous la mention « Réinitialisations ». Un lien cliquable « pour Alternatives » est apparu et vous permet de réinitialiser le plugin, tout en :

Astuce : Le fichier tmp/couteau-suisse/config.php contient la configuration en cours de votre Couteau Suisse.

Forcer la valeur d’une variable par défaut

Le Couteau Suisse comporte plus de 120 paramètres de configuration (appelés aussi variables)... Ce paragraphe oblige à connaître le nom de la variable dont vous désirez surcharger la valeur par défaut.

La fonction dont nous avons besoin ici doit être placée dans le fichier mes_options.php — que vous trouverez/placerez dans le dossier config/ — et doit être nommée comme ceci : ’initialiser_variable_’ auquel on ajoute le nom de la variable. Le paramètre de cette fonction est l’ancienne valeur par défaut que l’on peut utiliser ou non. Le résultat de cette fonction (parfois un simple nombre, parfois une chaine de caractères, parfois un code PHP) doit être conforme à la définition originale de la variable, et notamment de sa valeur par défaut native. Il est donc impossible pour vous d’écrire une fonction d’initialisation sans avoir parcouru le code source de l’outil et de sa variable.

Exemple qui oblige le passage par défaut aux URLs « libres » et non « page » (valeur par défaut de SPIP et du Couteau Suisse) :

// Initialiser le type d'URLs sous SPIP 2.0
// Nom de la variable : radio_type_urls3
// Résultat de la fonction : code PHP
function initialiser_variable_radio_type_urls3($defaut) {
    return "'libres'";
}

Exemple qui ajoute deux corrections automatiques. Notez que la manipulation d’un code PHP placé en variable est un peu délicate :

// Initialiser les corrections automatiques (version CS >= 1.8.41.00)
// Nom de la variable : insertions
// Résultat de la fonction : code PHP
function initialiser_variable_insertions($defaut) {
	eval('$test='.$defaut.';');
	$test = "insertions = INSERTIONS
/\ba *capella\b/ = <i>a capella</i>
$test";
    return var_export($test,1);
}

Si l’utilisateur n’a jamais validé la configuration d’un outil, si le Couteau Suisse est tout nouvellement installé ou si l’utilisateur clique sur le bouton ’Par défaut’ dans la configuration de l’outil en question, alors les variables associées prennent leur valeur par défaut. Dès la première validation du formulaire de configuration, la nouvelle valeur est stockée en base de données et la valeur par défaut est désormais ignorée. De cette façon, l’utilisateur peut infirmer, s’il le veut, le choix qui a été fait par la fonction initialiser_variable_toto().

Astuce : dans le cas d’une mutualisation et en jouant avec les différentes autorisations, il vous est donc possible de :
-  Forcer l’initialisation d’une variable
-  Et interdire ensuite sa modification future

Voici la liste des outils et des variables disponibles au 09/04/2012 sous SPIP 3.0 :

Nom de l’outilid de l’outilVariables éventuelles
Affiche tout aff_tout tout_rub, tout_aut
Allègement de l’interface privée simpl_interface
Ancres douces soft_scroller scrollTo, LocalScroll
Balise #INSERT_HEAD insert_head
Balise #INTRODUCTION introduction lgr_introduction, suite_introduction, lien_introduction
Balise #SET étendue balise_set
Balises #TITRE_PARENT/OBJET titre_parent titres_etendus
Belles URLs liens_orphelins liens_interrogation, liens_orphelins, long_url, coupe_url
Belles puces pucesli puceSPIP
Blocs Dépliables blocs bloc_unique, blocs_cookie, bloc_h4, blocs_slide, blocs_millisec, pp_edition_blocs, pp_forum_blocs
Blocs multilingues toutmulti
Bouton « Voir le site public » icone_visiter
Boîtes privées boites_privees cs_rss, format_spip, stat_auteurs, qui_webmasters, bp_urls_propres, bp_tri_auteurs
Chatons chatons pp_edition_chatons, pp_forum_chatons
Citations bien balisées citations_bb
Comportements du Couteau Suisse cs_comportement log_couteau_suisse, spip_options_on, distant_off, distant_outils_off
Corrections automatiques insertions insertions
Dans la même rubrique meme_rubrique meme_rubrique
Dossier du squelette dossier_squelettes dossier_squelettes
Débogueur de développement devdebug devdebug_mode, devdebug_espace, devdebug_niveau
Décoration decoration decoration_styles, pp_edition_decoration, pp_forum_decoration
Découpe en pages et onglets decoupe balise_decoupe, pp_edition_decoupe, pp_forum_decoupe
Désactive jQuery f_jQuery
Désactive les objets flash desactiver_flash
Ecran de sécurité ecran_securite ecran_actif, ecran_load
Exposants typographiques typo_exposants expo_bofbof
Filets de Séparation filets_sep pp_edition_filets_sep, pp_forum_filets_sep
Force la langue forcer_langue
Format des URLs type_urls radio_type_urls3, terminaison_urls_page, separateur_urls_page, terminaison_urls_propres, debut_urls_propres, marqueurs_urls_propres, url_max_propres, debut_urls_propres2, marqueurs_urls_propres2, url_max_propres2, terminaison_urls_libres, debut_urls_libres, url_max_libres, url_arbo_minuscules, urls_arbo_sans_type, url_arbo_sep_id, terminaison_urls_arbo, url_max_arbo, terminaison_urls_propres_qs, url_max_propres_qs, terminaison_urls_propres_qs, marqueurs_urls_propres_qs, url_max_propres_qs, spip_script, urls_minuscules, urls_avec_id, urls_avec_id2, urls_id_3_chiffres, urls_id_sauf_rubriques, urls_id_sauf_liste
Gestion du JavaScript filtrer_javascript radio_filtrer_javascript3
Glossaire interne glossaire glossaire_groupes, glossaire_limite, glossaire_js, glossaire_abbr
Guillemets typographiques guillemets
Horloge horloge
Intertitres en image titres_typo i_taille, i_couleur, i_police, i_largeur, i_hauteur, i_padding, i_align
Jolis Coins jcorner jcorner_classes, jcorner_plugin
La corbeille corbeille arret_optimisation
Largeur d’écran spip_ecran spip_ecran
Les tris de SPIP tri_articles tri_articles, tri_perso, tri_groupes, tri_perso_groupes
Liens en clair liens_en_clair
Limites mémoire SPIP_tailles img_Hmax, img_Wmax, img_Smax, logo_Hmax, logo_Wmax, logo_Smax, doc_Smax, copie_Smax, img_GDmax, img_GDqual
Liste des webmestres webmestres webmestres
Lutte contre le SPAM spam spam_mots, spam_ips
MailCrypt mailcrypt
Masquer du contenu masquer mot_masquer
Mises à jour automatiques maj_auto
Modération modérée moderation_moderee moderation_admin, moderation_redac, moderation_visit
Orientation des images orientation
Page des auteurs auteurs max_auteurs_page, auteurs_tout_voir, auteurs_0, auteurs_1, auteurs_5, auteurs_6, auteurs_n
Paragrapher paragrapher2 paragrapher
Pas de forums anonymes auteur_forum auteur_forum_nom, auteur_forum_email, auteur_forum_deux
Pas de stockage IP no_IP
Pas de verrouillage de fichiers flock
Prévisualisation des articles previsualisation
Retours de ligne automatiques autobr alinea, alinea2, pp_edition_autobr, pp_forum_autobr
Réglage des sélecteurs brouteur rubrique_brouteur, select_mots_clefs, select_min_auteurs, select_max_auteurs
SPIP et le cache… spip_cache radio_desactive_cache4, quota_cache, derniere_modif_invalide, duree_cache, duree_cache_mutu, compacte_css, compacte_js, compacte_prive, compacte_tout
SPIP et les liens… externes SPIP_liens radio_target_blank3, url_glossaire_externe2, enveloppe_mails
SPIP et ses raccourcis… class_spip racc_hr, puce, racc_h1, racc_h2, racc_g1, racc_g2, racc_i1, racc_i2, ouvre_ref, ferme_ref, ouvre_note, ferme_note, style_p, style_h
Site en travaux en_travaux message_travaux, titre_travaux, admin_travaux, avertir_travaux, cache_travaux, prive_travaux
Smileys smileys pp_edition_smileys, pp_forum_smileys
Sommaire automatique sommaire prof_sommaire, lgr_sommaire, jolies_ancres, auto_sommaire, balise_sommaire
Suivi des forums publics suivi_forums radio_suivi_forums3
Supprime le numéro supprimer_numero
Taille des forums forum_lgrmaxi forum_lgrmaxi
Tout en couleurs couleurs couleurs_fonds, set_couleurs, couleurs_perso, pp_edition_couleurs, pp_forum_couleurs
Trousse à balises trousse_balises
Type d’interface privée set_options radio_set_options4
Validateur XML xml
Version texte verstexte
Visiteurs connectés visiteurs_connectes

Voici la liste des outils et des variables disponibles au 17/01/2010 sous SPIP 2.0.10 :

Nom de l’outilid de l’outilVariables éventuelles
Allègement de l’interface privée simpl_interface
Ancres douces soft_scroller scrollTo, LocalScroll
Balise #INSERT_HEAD insert_head
Balise #INTRODUCTION introduction lgr_introduction, suite_introduction, lien_introduction
Balises #TITRE_PARENT/OBJET titre_parent titres_etendus
Belles URLs liens_orphelins liens_interrogation, liens_orphelins
Belles puces pucesli puceSPIP
Blocs Dépliables blocs bloc_unique, blocs_cookie, bloc_h4, blocs_slide, blocs_millisec, pp_edition_blocs, pp_forum_blocs
Blocs multilingues toutmulti
Boîtes privées boites_privees cs_rss, format_spip, stat_auteurs, qui_webmasters, bp_urls_propres, bp_tri_auteurs
Bouton « Visiter » icone_visiter
Chatons chatons pp_edition_chatons, pp_forum_chatons
Citations bien balisées citations_bb
Comportements du Couteau Suisse cs_comportement log_couteau_suisse, spip_options_on, distant_off, distant_outils_off
Corrections automatiques insertions insertions
Décoration decoration decoration_styles, pp_edition_decoration, pp_forum_decoration
Découpe en pages et onglets decoupe balise_decoupe, pp_edition_decoupe, pp_forum_decoupe
Désactive jQuery f_jQuery
Désactive les objets flash desactiver_flash
Dossier du squelette dossier_squelettes dossier_squelettes
Exposants typographiques typo_exposants expo_bofbof
Filets de Séparation filets_sep
Force la langue forcer_langue
Format des URLs type_urls radio_type_urls3, terminaison_urls_page, separateur_urls_page, terminaison_urls_propres, debut_urls_propres, marqueurs_urls_propres, url_max_propres, debut_urls_propres2, marqueurs_urls_propres2, url_max_propres2, terminaison_urls_libres, debut_urls_libres, url_max_libres, url_arbo_minuscules, urls_arbo_sans_type, url_arbo_sep_id, terminaison_urls_arbo, url_max_arbo, terminaison_urls_propres_qs, url_max_propres_qs, terminaison_urls_propres_qs, marqueurs_urls_propres_qs, url_max_propres_qs, spip_script, urls_minuscules, urls_avec_id, urls_avec_id2, urls_id_3_chiffres, urls_id_sauf_rubriques
Gestion du JavaScript filtrer_javascript radio_filtrer_javascript3
Glossaire interne glossaire glossaire_groupes, glossaire_limite, glossaire_js
Guillemets typographiques guillemets
Horloge horloge
Intertitres en image titres_typo i_taille, i_couleur, i_police, i_largeur, i_hauteur, i_padding, i_align
Jolis Coins jcorner jcorner_classes, jcorner_plugin
La corbeille corbeille arret_optimisation
Largeur d’écran spip_ecran spip_ecran
Les tris de SPIP tri_articles tri_articles, tri_perso, tri_groupes, tri_perso_groupes
Liens en clair liens_en_clair
Limites mémoire SPIP_tailles img_Hmax, img_Wmax, img_Smax, logo_Hmax, logo_Wmax, logo_Smax, doc_Smax, copie_Smax, img_GDmax
Liste des webmestres webmestres webmestres
Lutte contre le SPAM spam spam_mots
MailCrypt mailcrypt
Mises à jour automatiques maj_auto
Modération modérée moderation_moderee moderation_admin, moderation_redac, moderation_visit
Orientation des images orientation
Page des auteurs auteurs max_auteurs_page, auteurs_tout_voir, auteurs_0, auteurs_1, auteurs_5, auteurs_6, auteurs_n
Paragrapher paragrapher2 paragrapher
Pas de forums anonymes auteur_forum auteur_forum_nom, auteur_forum_email, auteur_forum_deux
Pas de stockage IP no_IP
Pas de verrouillage de fichiers flock
Prévisualisation des articles previsualisation
Réglage du sélecteur de rubrique brouteur rubrique_brouteur
SPIP et le cache… spip_cache radio_desactive_cache4, quota_cache, derniere_modif_invalide, duree_cache, duree_cache_mutu
SPIP et les liens… externes SPIP_liens radio_target_blank3, url_glossaire_externe2, enveloppe_mails
SPIP et ses raccourcis… class_spip racc_hr, puce, racc_h1, racc_h2, racc_g1, racc_g2, racc_i1, racc_i2, ouvre_ref, ferme_ref, ouvre_note, ferme_note, style_p, style_h
Site en travaux en_travaux message_travaux, titre_travaux, admin_travaux, avertir_travaux, prive_travaux
Smileys smileys pp_edition_smileys, pp_forum_smileys
Sommaire automatique sommaire prof_sommaire, lgr_sommaire, jolies_ancres, auto_sommaire, balise_sommaire
Suivi des forums publics suivi_forums radio_suivi_forums3
Supprime le numéro supprimer_numero
Taille des forums forum_lgrmaxi forum_lgrmaxi
Tout en couleurs couleurs couleurs_fonds, set_couleurs, couleurs_perso, pp_edition_couleurs, pp_forum_couleurs
Trousse à balises trousse_balises
Type d’interface privée set_options radio_set_options4
Validateur XML xml
Version texte verstexte
Visiteurs connectés visiteurs_connectes
// à placer à la fin de config_outils
// lancer ensuite exec=admin_couteau_suisse
global $outils;
include_spip('inc/cs_outils');
$x = array();
foreach($outils as $o) {
	$description_outil = charger_fonction('description_outil', 'inc');
	cs_initialisation_d_un_outil($o['id'], charger_fonction('description_outil', 'inc'), true);
	$oo = &$outils[$o['id']];
	$x[]="|$oo[nom]|$oo[id]|".@join(', ',$oo['variables'])."|";
}
sort($x);
$x=join("\n",$x);
print_r($x);

Ajouter une lame [1] personnalisée

Il vous est possible d’ajouter à la volée un outil au Couteau Suisse. La syntaxe ressemble à celle utilisée par les outils déjà présents au sein du plugin, et expliquée ici : [dev] Le Couteau Suisse : développer un outil.

Les lames [1] personnalisées apparaissent en italique sur la page de configuration du plugin (ecrire/?exec=admin_couteau_suisse) et doivent être activée comme toutes les autres fournies par défaut. Leur initialisation doit être placée dans un fichier nommé mon_nouvel_outil_config.php. Ce fichier doit être placé dans le dossier outils/ de votre squelette et obligatoirement comporter une fonction appelée mon_nouvel_outil_config_dist() .

Voici un premier exemple qui remplace toutes les citations entre (vrais !) guillemets par des italiques simples. Exemple : « une citation » est changé en une citation. Le code ci-dessous doit être placé dans le fichier outils/mes_citations_config.php :

<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

# --------------------------------------------------------------
# Fichier de configuration pris en compte par config_outils.php 
# et specialement dedie a la configuration de ma lame perso
# --------------------------------------------------------------

// Ajout de l'outil 'mes_citations'
function outils_mes_citations_config_dist() { add_outil(array(
	'id' => 'mes_citations',
	'nom' => 'Citations en italique',
 	'description' => 'Une lame qui transforme toutes les citations <html>&laquo; toto &raquo;</html> en simple {italique}.',
 	'categorie' => 'typo-corr',
 	'pipeline:pre_typo' => 'mes_citations_pre_typo',
	'code:options' =>'
 // Fonction de remplacement
 function mes_citations_rempl($texte) {
 	return preg_replace(\',«\s*(.*?)\s*»,msS\', \'{$1}\', $texte);
 }
 
 // Fonction de pipeline
 function mes_citations_pre_typo($texte) {
 	if (strpos($texte, \'«\')===false) return $texte;
 	// appeler mes_citations_rempl() une fois que certaines balises ont ete protegees
 	return cs_echappe_balises(\'\', \'mes_citations_rempl\', $texte);
 }
	',
));}

?>

Voici un second exemple qui permet d’offrir un nouveau raccourci à vos rédacteurs pour mettre un texte en évidence. La programmation de cet outil pouvant être un peu plus complète que la précédente, il faut créer ici deux fichiers : un pour la configuration et un pour la définition des fonctions de pipeline.

1. Le code ci-dessous doit être placé dans le fichier outils/mise_evidence_config.php :

<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

# --------------------------------------------------------------
# Fichier de configuration pris en compte par config_outils.php 
# et specialement dedie a la configuration de ma lame perso
# --------------------------------------------------------------

// Ajout de l'outil 'mise_evidence'
function outils_mise_evidence_config_dist() { add_outil(array(
	'id' => 'mise_evidence',
	'nom'         => 'Mise en &eacute;vidence',
	'description' => 'Un nouveau raccourci pour mettre un texte en &eacute;vidence. Syntaxe : [*un texte*]',
	'auteur'      => 'Moi-m&ecirc;me',
	'categorie'   => 'typo-racc',
	'pipeline:pre_typo'   => 'mise_evidence_pre_typo',
	'pipeline:nettoyer_raccourcis_typo' => 'mise_evidence_nettoie',
	'pipeline:BT_toolbox' => 'mise_evidence_BarreTypo',
));}

?>

2. Le code ci-dessous doit être placé dans le fichier outils/mise_evidence.php :

<?php
if (!defined("_ECRIRE_INC_VERSION")) return;

// Fonction de remplacement
function mise_evidence_rempl($texte) {
	return preg_replace(',\[\*(.*?)\*\],', '<span style="color:orange;">$1</span>', $texte);
}

// Fonction de pipeline
function mise_evidence_pre_typo($texte) {
	if (strpos($texte, '[*')===false) return $texte;
	// appeler mise_evidence_rempl() une fois que certaines balises ont ete protegees
	return cs_echappe_balises('', 'mise_evidence_rempl', $texte);
}

// Fonction indiquant le nouveau raccourci
function mise_evidence_raccourcis() {
	return 'Mise en &eacute;vidence : <b>[*texte*]</b>';
}

// Aide le Couteau Suisse a calculer la balise #INTRODUCTION
function mise_evidence_nettoie($texte) {
	return preg_replace(',\[\*(.*?)\*\],', '$1', $texte);
}
$GLOBALS['cs_introduire'][] = 'mise_evidence_nettoie';

// Fonction qui renvoie une ligne de tableau entre <tr></tr>
// afin de l'inserer dans la Barre Typo V2, si elle est presente
function mise_evidence_BarreTypo($tr) {
	return $tr.'<tr><td><a title="Mise en &eacute;vidence" href="javascript:barre_raccourci(\'[*\',\'*]\',@@champ@@)">Mise en &eacute;vidence</a></td></tr>';
}

?>

Notes

[1Autre nom d’un outil du Couteau Suisse

Discussion

4 discussions

  • Bonjour,
    Débutante, j’ai sans doute mal regardé et je passe à côté d’un truc idiot.
    Mais je n’arrive pas à modifier les paramètres du Couteau : j’obtiens le message :
    "Forbidden
    You don’t have permission to access /spip/ecrire/ Je travaille sur un site en localhost.

    Merci

    Répondre à ce message

  • 1

    La possibilité de sauvegarder la config du CS est géniale.
    Par contre je n’ai l’impression qu’un fois un pack sauvegardé on puisse le supprimé sans editer à la main le fichier config/mes_options.php

    Super Plugin en tous cas ...

    Répondre à ce message

  • 3

    J’ai ajouté au squelette Ahuntsic (évolution du squelette Alternatives) une pré-configuration du Couteau Suisse, très semblable à celle recommandée dans le présent article. J’ai placé le code dans ahuntsic_options.php du jeu de squelettes Ahuntsic. Ça fonctionne parfaitement. Un petit soucis toutefois. Si des outils sont déjà activé lors de la réinitialisation du pack pour Ahuntsic , tous les autres outils déjà activés sont désactivés.

    Y a-t-il un moyen de conserver les outils déjà activés et installer ou réinitialiser uniquement ceux de la pré-configuration du pack Ahuntsic ?

    • Eh oui, pour l’instant les choses sont très basiques : une configuration réinitialise totalement le Couteau Suisse pour le remettre dans l’état exact où il était lors de la sauvegarde en question, ou conformément à la configuration spécifiée à la main dans mes_options.php.

      Le sujet des collisions est une question délicate, car que doit-on faire des variables actives et existant avant ce clic ? Un petit formulaire ajax permettant de détailler un peu ses choix serait pas mal en effet... Au moins pour l’instant, un message d’avertissement avant « l’écrasement général »...

    • Oui, je conçois assez facilement les risques de collisions d’un tel mécanisme. Mais, effectivement, un message avant l’écrasement serait hautement souhaitable.

      Merci encore pour tout cela.

    • Mais en fait le plugin le fait déjà, ça m’était sorti de la tête... Un message d’avertissement met en garde contre la réinitialisation du plugin avant l’installation du pack.

      Dans l’idéal, il faudrait ajaxer la boîte info pour lister les outils inclus dans le pack avant la confirmation de l’utilisateur... Dès que j’ai un peu de temps...

    Répondre à ce message

  • 1

    Très pratique ça pour aider à la configuration d’un squelette.
    Merci pour cette contrib.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom