Un glossaire interne pour vos sites

Gestion par mots-clés

Votre site utilise un vocabulaire technique spécialisé, vous avez une tendance maladive à jargonner sans vous en rendre compte, voici une solution pour que votre prose reste néanmoins accessible au commun des mortels.

Quelques mots d’introduction

Cet outil est une fonctionnalité du plugin Le Couteau Suisse que vous pouvez trouver ici : Le Couteau Suisse. Pour avoir accès aux fonctionnalités décrites dans cet article, il vous faut donc avoir préalablement installé ce plugin.

Après maintes lectures sur le sujet, le glossaire décrit ici présente les caractéristiques suivantes :

-  Il est interne. Ce glossaire ne fait pas appel à des ressources extérieures. Il exploite un glossaire interne au site (que nous allons créer en utilisant des mots-clés dans un groupe dédié). Il est donc typiquement dédié à des sites très spécialisés, dont le centre d’intérêt fait appel à un vocabulaire très spécifique. Par exemple, si vous créez un site parlant d’architecture antique, vous pourrez définir les mots métope, triglyphe ou architrave si vous craignez que vos visiteurs ignorent ce dont il s’agit.

-  Il est automatique. Contrairement au raccourci typographique existant actuellement dans SPIP qui renvoie par défaut vers Wikipedia et qui demande une intervention humaine chaque fois qu’on veut créer un lien (comme celui-ci : architrave, codé [?architrave], ou architrave, codé [?architrave|Ma bulle...]), le principe du présent outil est d’automatiser le référencement. Concrètement, il s’agit d’une fonction qui va analyser l’ensemble des textes de SPIP à la recherche des termes que vous aurez préalablement répertoriés, et reconnaître toutes les occurences afin de les transformer en liens de glossaire.

-  Il n’ouvre pas de nouvelle fenêtre (popup) et fonctionne sur la base des feuilles de style ou de JavaScript : lorsque le curseur de la souris passe au-dessus du mot répertorié, un petit cadre s’active automatiquement afin d’y voir la définition du mot. Si le lecteur clique sur le mot, alors il se retrouve sur la page du mot-clé, construite à l’aide du fichier de squelette «mot.html».

-  Il est visible que du côté public de votre site comme du côté privé.

-  Il est insensible à la casse par défaut (majuscules/minuscules).

-  Il accepte tous les accents, les mots composés, les différentes formes d’un mot et les expressions régulières.

-  Il prend en compte le contexte linguistique.

Exemple

Un exemple visuel, c’est toujours mieux qu’un discours...

Voici le texte seul :

Voici le résultat lorsque le mot «architrave» est survolé par la souris :

Créer les données

Le contenu en lui-même du glossaire sera «physiquement» placé dans un groupe de mots-clés nommé « Glossaire » (ou tout autre groupe que vous définissez sur la page de configuration). Chaque mot-clé de ce groupe représente alors une entrée de notre petit dictionnaire, et le texte du mot-clé sa définition.

Pour créer le groupe « Glossaire » en partie privée, vous pouvez cliquer sur ce bouton :

Ensuite, une fois ce groupe créé, ajoutez vos nouveaux mots-clés :

La définition réelle du mot doit être placée dans le “texte explicatif”. Mais, au cas où la définition réelle du mot est trop longue, vous pouvez également proposer un résumé dans le “descriptif rapide”.

Pour afficher la définition du mots du glossaire, Le plugin retiendra donc de préférence le descriptif rapide. S’il est vide, alors la définition retenue sera le texte explicatif entier.

Note 1 : les raccourcis SPIP sont autorisés dans les définitions.
Note 2 : n’utilisez pas des mots trop courts, ils risque de perturber le rendu de vos textes et le calcul de vos liens. Préférez des mots de plus de 3, voire 4 lettres.

Plusieurs formes du mot

Si plusieurs formes du mot se réfèrent à la même définition, vous pouvez alors les séparer par un slash [1] («/») directement dans le titre du mot-clé.

Exemple pour souligner également le pluriel : «architrave / architraves».

Il est possible d’utiliser les expressions régulières en les entourant par des virgules. Veillez à ce que le premier mot soit une expression valide afin que le plugin puisse fabriquer facilement le titre de la fenêtre de glossaire. Exemples :
-  «Architrave/,architraves?,i»
-  «la France/,[lL]a +France,»

Pour l’expression “TCP/IP”, utilisez le code ASCII du slash ainsi que les expressions régulières : «TCP/IP/,TCP.IP,».

Pour les accents (et peut-être aussi les apostrophes), il est possible que la configuration de votre site vous oblige à contourner le problème, par exemple :
«Régiment d'Infanterie/,R[. ]I[.]|R\S+giment d\S+Infanterie,i»

Ces expressions régulières sont utiles pour la recherche d’un mot sensible à la casse. Exemple : «,\bCES\b,» (abbréviation de Collège d’Enseignement Secondaire à ne pas confondre avec le pronom «ces»). Attention, les expressions régulières sont à manier avec précaution : elles sont très puissantes et parfois coûteuses en performance.

Notamment, il n’est pas recommandé d’utiliser l’expression «,CES,» sans les limites de mots car cette suite trop courte de caractères peut être présente hors du contexte souhaité, et perturber les séquences préalablement protégées dans le texte (comme les liens échappés par le Couteau Suisse ou les modèles échappés par SPIP). Méfiez-vous donc de vos expressions régulières si un jour un truc bizarre ressemblant à «uIHByb2Zlc3Npb25uZWxsZTwvYT4=» apparaît dans vos textes à la place d’un hyperlien ou d’un modèle !

Balises multi

Afin d’utiliser le glossaire dans plusieurs langues, il est possible d’utiliser les balises <multi> dans le titre et la définition. Le contexte linguistique sera alors pris en compte. Exemple : <multi>[fr]anticonstitutionnellement[en]anticonstitutionally</multi>

Redirections

Si le lien vers le mot ne vous convient pas, il est possible de le remplacer par le lien de votre choix (Couteau Suisse version 1.8.142 minimum). Ceci pourra se faire grâce au séparateur : «/=».
Note : Si le séparateur «/» est surchargé, alors utilisez votre nouveau séparateur suivi du caractère «=».

-  Exemple en externe : «Bretagne/=http://www.tourismebretagne.com/»
-  Exemple en interne (article 337) : «Bretagne/=337»
-  Exemple en interne (rubrique 33) : «Bretagne/=rub33»

Attention, ce lien de redirection doit toujours être placé en fin de titre, après les expressions régulières éventuelles. Ceci par exemple n’est pas correct : «Bretagne/=337/Vendée»

Installation

Cet outil est une fonctionnalité du plugin «Le Couteau Suisse» que vous pouvez trouver ici : Le Couteau Suisse.

Pour avoir accès au glossaire, il vous faut donc avoir installé ce plugin en suivant la procédure normale d’installation des plugins SPIP.

Ensuite, veuillez activer l’outil «Glossaire interne» en vous rendant sur la page d’administration du plugin en espace privé (Bouton «Configuration», et onglet «Le Couteau Suisse»).

La définition des mots répertoriés pour le glossaire peut être faite avant ou après cette installation du plugin car ces deux processus sont complètement indépendants. Chaque nouveau mot-clé créé est instantanément pris en compte dans vos textes, après recalcul de la page bien sûr.

Configuration du Glossaire

Certains paramètres peuvent être définis sur la page de configuration du Couteau Suisse :

-  Nombre maximal d’occurrences traitées. Si vous choisissez une valeur nulle (valeur par défaut) ou négative, ce sont tous les mots reconnus (parmi les mots-clés du groupe «Glossaire») qui seront affublés d’une définition. Si par exemple vous choisissez «2», seuls les deux premières apparitions de chaque mot seront traitées. Un tel chiffre évite une répétition visuelle trop importante des mots soulignés dans votre texte et économise un peu de temps serveur.
-  Groupe(s) utilisé(s). Par défaut, le groupe de mots-clés est : «Glossaire». Mais vous pouvez avoir besoin de plusieurs groupes si le nombre de mots-clés est trop important dans votre site, ou tout simplement d’utiliser un autre nom de groupe.
-  Technique utilisée. Voir ci-dessous le paragaphe sur les modes de fonctionnement du glossaire.

Dépendances

-  La librairie jQuery est requise pour l’outil «Glossaire interne» Si le mode Javascript est sélectionné dans la configuration. Ce jeu de fonctions Javascript très utile a été intégré au core dès la version 1.9.2 de SPIP. Pour les versions inférieures, il vous faut installer et activer le plugin Jquery que vous pouvez télécharger ici : http://zone.spip.org/files/spip-zon....]].
-  Les styles CSS et les fonctions Javascript du plugin sont insérés grâce à la balise #INSERT_HEAD qui doit absolumet être présente (en un seul exemplaire) dans le header de vos squelettes (entre les balises <head> et </head> des fichiers HTML). Si vous ne trouvez pas cette balise dans vos codes et que le glossaire n’apparait pas avec l’apparence voulue, alors l’outil “Balise #INSERT_HEAD” du Couteau Suisse permet d’insérer automatiquement cette balise sans manipulation de votre part.

Modes de fonctionnement

La page de configuration vous permet de choisir entre deux modes de fonctionnement :
-  La solution CSS, qui joue que la visibilité de blocs <span> sensibles au passage de la souris et insérés dans le texte d’origine à côté du mot à définir.
-  La solution Javascript/jQuery, qui joue sur l’insertion en temps réel de la définition du mot dans un bloc <div> qui apparait au niveau du mot survolé par la souris.

Ces deux solutions présentent l’avantage d’être automatiques. Aucune nouvelle fenêtre (popup) n’est ouverte.

Voici les tests de compatibilité effectués avec cet outil et différents navigateurs. Il s’agit ici de tester si la petite fenêtre de définition apparait bien au survol de la souris. N’hésitez pas à nous transmettre vos résultats !

NavigateurMode CSSMode JS
Win FF2&suiv.
oui
oui
Win IE6
non
oui
Win IE7&suiv.
oui
oui
Win SAF3
oui
oui
MacOSX FF2
oui
oui
MacOSX SAF3
oui
oui

-  Le premier mode reste mal interprété par Internet Explorer 6.
-  Le second mode ne fonctionnera que si l’utilisateur a autorisé l’interprétation du Javascript. De plus, sous SPIP 2 (ou si vous installez le plugin jquery.dimensions sous SPIP 1.9x), les tabulations au clavier sont prises en compte et provoquent l’affichage automatique des définitions.

Dans tous les cas, le mot à définir reste cliquable et renvoie directement sur la page du mot-clé correspondant.

Notes

En résumé :
-  Le traitement sur #TEXTE utilisé est : cs_glossaire(propre(%s))
-  Le fichier inclus est : outils/glossaire_fonctions.php
-  Les styles sont dans : outils/glossaire.css
-  Les scripts sont dans : outils/glossaire.js
-  Les fonds (que vos squelettes peuvent surcharger et qui permettent d’afficher la définition des mots trouvés) sont : fonds/glossaire_js.html et fonds/glossaire_css.html (voir le § sur les surcharges ci-dessous).

Le texte situé entre les balises <html> et </html>, <code> et </code>, <cadre> et </cadre>, <frame> et </frame>, <script> et </script>, <acronym> et </acronym>, <cite > et </cite > ou <a> et </a> est protégé : aucun lien de glossaire n’y sera inséré.

Les apostrophes sont acceptées dans les mots-clés, mais SPIP remplace le guillemet droit par le guillemet courbe : &#8217; («’»). Il faut donc le prendre en compte dans le titre du mot-clé. Exemple : entrer «salon d&#8217;art» ou «salon d'art», mais pas «salon d'art».

Techniquement parlant, cet outil agit sur toutes les balises #TEXTE, #TITRE et #CHAPO trouvées dans vos squelettes et insère donc des définitions là où il trouve les mots du glossaire : dans vos articles, vos textes de rubrique, etc.

Une condition est cependant nécessaire : le glossaire ne fonctionnera pas si votre squelette utilise la balise #TEXTE étoilée («#TEXTE*»). En effet, cette syntaxe permet de s’affranchir de tous les filtres automatiques et SPIP renvoie donc le texte brut sans aucune transformation. Si vous tenez absolument à l’étoile pour ajouter un de vos filtres par exemple, alors il faut écrire dans une boucle ARTICLES : [(#TEXTE*|mon_filtre|cs_traitements{TEXTE,articles})] à la place de [(#TEXTE)]. Explication : l’étoile de la balise empêche tout traitement SPIP et renvoie le texte brut stocké en base de données, le filtre ’|mon_filtre’ est votre fonction perso écrite dans le fichier mes_fonctions.php, puis le filtre ’|cs_traitement’ du Couteau Suisse rétablit les traitements originaux de SPIP correspondant à la balise ’#TEXTE’ et aux objets ’articles’.

Par ailleurs, si une balise n’est pas couverte par le traitement du glossaire, alors utilisez le filtre |cs_glossaire. Exemple : [(#MA_BALISE|cs_glossaire)].

Les mots-clés sont permanents dans votre base de donnée et complètement indépendants du plugin : ils sont gérés par SPIP. Il n’est pas obligatoire d’utiliser ces mots-clés sur vos articles ou vos rubriques. Désactiver par la suite le plugin (ou la fonctionnalité «Glossaire interne» dans le plugin) ne crée bien sûr aucune erreur : simplement les liens de glossaire ne sont plus insérés dans les textes. En effet, ce glossaire ne pratique aucune modification de la base de donnée.

Exception : il est possible d’ajouter dans un texte le raccourci [!glossaire] si vous ne voulez pas que les mots du glossaire y soient recherchés. Bien sûr, ce raccourci n’apparaît pas lorsque SPIP affiche votre texte intégral ou son introduction (balise #INTRODUCTION).

Astuce 1 : comment faire pour éviter le glossaire quelque part dans mon squelette ? Prenons par exemple la balise #TEXTE de la boucle (ARTICLES). Le code à utiliser est : [(#TEXTE*|concat{#EVAL{_CS_SANS_GLOSSAIRE}}|cs_traitements{TEXTE,articles})]. Explication : l’étoile de la balise empêche tout traitement SPIP et renvoie le texte brut stocké en base de donnée, le filtre ’|concat ’ ajoute au texte brut ’[!glossaire]’ pour empêcher la recherche future des mots du glossaire, puis le filtre ’|cs_traitement’ du Couteau Suisse rétablit les traitements originaux de SPIP correspondant à la balise ’#TEXTE’ et aux objets ’articles’. Si vous préférez restreindre le glossaire à certaines rubriques, utilisez alors le test suivant : [(#ID_RUBRIQUE|match{'^(3|4|5)$'}|oui) placez votre balise #TEXTE étoilée et filtrée ici]

Correctif : : Depuis la révision 43782 du Couteau Suisse, la notation précédente est caduque. Ceci :
[(#TEXTE*|concat{#EVAL{_CS_SANS_GLOSSAIRE}}|cs_traitements{TEXTE,articles})]
doit être remplacé par cela :
[(#TEXTE*|cs_traitements{TEXTE,articles,cs_glossaire})]

Astuce 2 : comment appliquer le glossaire directement sur une chaine de caractères donnée ?
-  Première solution, en direct : [(#VAL{Ma phrase contenant un mot du glossaire}|cs_glossaire)]
-  Deuxième solution, multilingue cette fois : <:ma_chaine|cs_glossaire:> si une chaine de langue ’ma_chaine’ a été définie dans le fichier local_fr.php ( cf : http://www.spip.net/fr_article2128.html).

Surcharges

1. Autre fenêtre de définition

Si vous désirez modifier l’aspect de la fenêtre de définition, vous pouvez surcharger l’un des deux fonds prévus pour son affichage. Ces fichiers sont : couteau_suisse/fonds/glossaire_js.html ou couteau_suisse/fonds/glossaire_csss.html ; ils sont utilisés par le plugin en fonction du mode de fonctionnement choisi dans la configuration (JS ou CSS).

La surcharge au sens SPIP consiste à repérer le fichier original (par exemple couteau_suisse/fonds/glossaire_js.html), le recopier dans le répertoire de votre squelette (par exemple mon_squelette/fonds/glossaire_js.html), puis le modifier à votre guise, mais respectant la structure proposée (deux spans pour le mode JS : .gl_js pour le titre et .gl_jst pour la définition, les textes étant placés en attribut title). Ces surcharges vous permettent de personnaliser vos outils sans toucher au code original : vous bénéficiez ainsi de la possibilité de mettre à jour le plugin très facilement.

Les fonds recoivent des variables pré-remplies (id_mot, titre, texte et descriptif) correspondant aux champs utilisés dans la base de données. Il vous suffit de les utiliser grâce à la balise SPIP : #ENV.

Voici le code du fichier glossaire_js.html livré avec le plugin :

[(#REM) 
	champs disponibles : 
		id_mot (pour une boucle MOTS eventuellement)
		titre (multi ready)
		texte (safehtml)
		descriptif (safehtml)
	deux spans indispensables : 
		.gl_js : titre
		.gl_jst : definition
	par defaut : la definition affichee est le texte du mot si le descriptif est vide
	attention : le retour a la ligne entre les deux span provoque l'ajout d'un espace apres le mot reconnu
]
#SET{def,#ENV*{descriptif}|sinon{#ENV*{texte}}}
<span class="gl_js" title="[(#ENV*{titre}|htmlspecialchars)]"></span><span class="gl_jst" title="[(#GET{def}|htmlspecialchars)]"></span>

Voici une variante du fichier glossaire_js.html où le descriptif est placé systématiquement après le titre :

<span class="gl_js" title="[(#ENV*{titre}|htmlspecialchars)][ ((#ENV*{descriptif}|htmlspecialchars))]"></span>
<span class="gl_jst" title="[(#ENV*{texte}|htmlspecialchars)]"></span>

2. Autre table pour le glossaire

Pour ceux qui préfèrent utiliser une autre table que celle proposée par ce plugin (table des mots-clefs : ’mots’), il est possible de définir soi-même une constantes dans votre fichier mes_options.php [2] :

-  _GLOSSAIRE_QUERY : chaine SQL permettant de récupérer l’ensemble des mots du glossaire. Veillez à ce que les champs suivants soient bien renseignés : id_mot, titre, texte et descriptif. Ils seront alors disponibles dans le fond utilisé pour afficher la fenêtre de définition (voir ci-dessus).

Par exemple : define('_GLOSSAIRE_QUERY', 'SELECT id AS id_mot, mot AS titre, def AS texte, def AS descriptif FROM lexique WHERE spip=true ORDER BY id ASC');

Par défaut : define('_GLOSSAIRE_QUERY', 'SELECT id_mot, titre, texte, descriptif FROM spip_mots WHERE type=Glossaire ORDER BY id_mot ASC');

3. Autre lien pour les mots trouvés

Pour ceux qui préfèrent utiliser une autre forme de liens que celle proposée par ce plugin (lien de mot standard SPIP), il est possible d’écrire soi-même une fonction dans votre fichier mes_options.php [2] :

-  La fonction fonction glossaire_generer_url($id_mot, $titre) surchargera la fonction glossaire_generer_url_dist($id_mot)prévue par défaut dans le plugin, dont voici le code :

function glossaire_generer_url_dist($id_mot) {
  if(defined('_SPIP19300')) 
    return generer_url_entite($id_mot, 'mot'); // depuis SPIP 2.0
    else { charger_generer_url(); return generer_url_mot($id_mot); } // avant SPIP 2.0
}

Exemple pour supprimer le clic :

function glossaire_generer_url($id_mot, $titre) { 
  return 'javascript:;'; 
}

4. Autres constantes de séparation

Deux constantes permettant de définir la séparation des formes d’un mot sont définies par défaut :
-  _GLOSSAIRE_TITRE_BASE_SEP permet de définir le séparateur utilisé en base de donnée. Par défaut : '/'.
-  _GLOSSAIRE_TITRE_SEP permet de définir le séparateur utilisé pour fabriquer le titre de la fenêtre de glossaire. Par défaut : '<br />'.

Pour changer ces constantes, placez la nouvelle définition dans votre fichier mes_options.php [2]. Exemple :

@define('_GLOSSAIRE_TITRE_BASE_SEP', '//');
@define('_GLOSSAIRE_TITRE_SEP', ' &ndash; ');

Rappel : la fenêtre de glossaire est obtenue grâce aux fichiers fonds/glossaire_xx.html.

5. Autre traitement du mot trouvé dans le texte

Par défaut, le plugin reprend tout simplement l’expression identifiée dans le texte, sans autre artifice qu’un léger soulignement pour indiquer qu’une définition est disponible. Si par exemple on veut styler cette expression en fonction du groupe auquel appartient le mot-clé associé, il faut créer un fond personnalisé et surcharger la fonction glossaire_generer_mot_dist($id_mot, $mot) utilisée pour traiter l’expression trouvée dans le texte.

La nouvelle fonction glossaire_generer_mot($id_mot, $mot) est à placer dans le fichier mes_fonctions.php du squelette (ou au pire, dans config/mes_options.php). Elle permettra d’appeler le fond personnalisé qui va boucler sur l’id_mot en cours et utiliser le champ id_groupe pour créer une classe par groupe. Cette fonction présente deux paramètres :
-  $id_mot : identifiant en base du mot-clé détecté par le plugin
-  $mot : reproduction exacte de l’expression trouvée dans le texte.

function glossaire_generer_mot($id_mot, $mot) { 
	return recuperer_fond('/fonds/couleurs_glossaire',
		array('id_mot'=>$id_mot, 'mot'=>$mot));
}

Dans le dossier du squelette, il faut créer ensuite le fichier fonds/couleurs_glossaire.html et y mettre la fameuse boucle. Grâce à #ID_GROUPE, il est facile de créer une classe que l’on pourra styler dans un fichier CSS. Par exemple :

[(#REM) 
	champs disponibles : 
		id_mot (pour une boucle MOTS)
		mot (mot du texte)
]
<BOUCLE_mots(MOTS){id_mot}>
	<span class="groupe#ID_GROUPE">#ENV*{mot}</span>
</BOUCLE_mots>

Dans le code ci-dessus, les classes obtenues seront : .groupe1, .groupe2, .groupe3. Voici maintenant un exemple de style CSS :

	.groupe1 { color: #FF0000; }

Lister les mots reconnus

Depuis la version 1.8.33.03 du Couteau Suisse, le filtre |cs_mots_glossaire permet de fabriquer une liste de mots reconnus par le glossaire dans un texte. Ces données peuvent être réinjectées dans une boucle SPIP, ou servir directement à la confection d’une simple liste ou d’un nuage de mots-clés.

Exemples de syntaxe :

[(#CHAPO|concat{#TEXTE}|cs_mots_glossaire{lien_mot,' '})]
[<ul><li>(#TEXTE|cs_mots_glossaire{nuage, '</li><li>'})</li></ul>]
[(#TEXTE|cs_mots_glossaire|var_export{1})]

Exemple de noisette (testée sous SPIP 2.1) :

#SET{liste_mots, #TEXTE|cs_mots_glossaire{id_mot}}
<BOUCLE_m(MOTS){id_mot IN #GET{liste_mots}}{' - '}>#TITRE</BOUCLE_m>

Ce filtre comporte deux paramètres optionnels : le type de résultat voulu, et un séparateur.

Sans argument, ce filtre renvoie le tableau complet des mots trouvés dans le texte. Chaque élément du tableau renvoyé est :
array(’mot trouvé’, id_mot, ’lien mot’, ’titre complet du mot’);

Sans séparateur, un tableau est renvoyé, utilisable comme la balise #ARRAY.

Liste de types de résultat actuellement disponibles :
-  id_mot : liste simple des ’id_mot’ présents dans le texte
-  mot : liste simple des mots trouvés dans le texte
-  titre : liste simple des mots-clés trouvés dans le texte (titre complet)
-  titre_unique : idem (mais premier mot du titre)
-  lien_mot : liste cliquable des mots trouvés dans le texte
-  lien_titre : liste cliquable des mots-clés trouvés dans le texte (titre complet)
-  lien_titre_unique : idem (mais premier mot du titre)
-  nuage : liste cliquable des mots-clés trouvés dans le texte affublés d’une classe selon l’importance (nuage1 à nuage10, à l’instar des tags du plugin “Nuage”) (titre complet)
-  nuage_unique : idem (mais premier mot du titre)

Selon les besoins, on pourra étoffer cette liste. Tout retour (bugs, noisettes, lignes de code, ...) à ce sujet est le bienvenu !

Merci beaucoup à Pierre-Jean qui a écrit ce code d’exemple :

<!-- Afficher les mots du glossaire contenus à la fois dans le titre et dans le texte (entre une boucle ARTICLES ou dans le squelette article) -->
 
#SET{concatenation,#TEXTE|concat{#TITRE}}
#SET{liste_mots,#GET{concatenation}|cs_mots_glossaire{id_mot}}
<div>
<B_m1>
<b>Thématiques de l'article :</b>
<BOUCLE_m1(MOTS){id_mot IN #GET{liste_mots}}{' | '}> <a href="#URL_MOT" title="#TITRE - #TYPE" 
style="font-variant:small-caps">#TITRE</a>
</BOUCLE_m1>
</div>
 
<!-- Afficher les articles similaires -->
<BOUCLE_m(MOTS){id_mot IN #GET{liste_mots}}>
 
<!-- Dont le TITRE contient un mot -->
<BOUCLE_a(ARTICLES){titre==#TITRE}{pagination 1}{doublons}> <div style="float:left;width:100%;margin-top:10px">
<h2 class="#EDIT{titre} entry-title"><a href="#URL_ARTICLE" 
title="[(#TITRE)]">[(#TITRE)]</a></h2>
<p><small><abbr class="published" 
title="[(#DATE|date_iso)]">[(#DATE|nom_jour) ][(#DATE|affdate)]</abbr>[, <:par_auteur:> (#LESAUTEURS)][ (<:texte_date_publication_anterieure:>
(#DATE_REDAC|affdate)).]</small></p>
</div>
</BOUCLE_a>
 
<!-- Dont le TEXTE contient un mot -->
<BOUCLE_a2(ARTICLES){texte==#TITRE}{pagination 1}{doublons}> <div style="float:left;width:100%;margin-top:10px">
<h2 class="#EDIT{titre} entry-title"><a href="#URL_ARTICLE" 
title="[(#TITRE)]">[(#TITRE)]</a></h2>
<p><small><abbr class="published" 
title="[(#DATE|date_iso)]">[(#DATE|nom_jour) ][(#DATE|affdate)]</abbr>[, <:par_auteur:> (#LESAUTEURS)][ (<:texte_date_publication_anterieure:>
(#DATE_REDAC|affdate)).]</small></p>
</div>
</BOUCLE_a2>
 
</BOUCLE_m>

Bonus : comment afficher ce glossaire à l’aide d’une barre de navigation alphabétique ?

Attention : ce bonus ne concerne que les site programmés en UTF-8, afin de mieux gérer les accents. Il a été testé avec succès sous SPIP 2.0 et ne fonctionne qu’à partir de SPIP 1.92 (utilisation de la balise #ARRAY).

L’idée, pour les glossaires importants, est d’utiliser une barre de navigation alphabétique du genre : A|B|C|D|E|F... Pour plus d’élégance, la contrainte est d’optimiser la barre de navigation en fonction des premières lettres utilisées par tous les mots du glossaire, en évitant que la lettre du contexte soit cliquable. L’affaire n’est pas aisée car notre outil du Couteau Suisse permet d’utiliser les balises <mutli> pour les sites multilingues et surtout, les différentes formes de mot (ex : “Mot1/Mot2/Mot3”).

Pour arriver à nos fins, il faut :

  1. créer quelques filtres et les placer dans mes_fontions.php,
  2. créer une nouvelle page glossaire.html et la placer à la racine du squelette,
  3. éventuellement améliorer l’aspect grâce à quelques lignes CSS.

Voici les filtres :

// fonction pour array_walk : renvoie la premiere lettre majuscule translitteree du mot 
// (ex. : &eacute; => E, &oelig; => O, etc.)
function premiere_lettre_tab(&$item) {
        $item = translitteration_complexe($item);
        $item = strtoupper($item{0});
}
// fonction pour array_walk : renvoie un lien, sauf si le contexte est la lettre en question
function lien_1ere_lettre_tab(&$item, $key, $arg) {
        $item = $arg[0]==$item
                ?"<span class='lettre_contexte'>$item</span>"
                :'<a href="'.parametre_url($arg[1],"lettre",$item).'">'.$item.'</a>'; 
}
// renvoie la premiere lettre majuscule translitteree du mot 
// (ex. : &eacute; => E, &oelig; => O, etc.)
function premiere_lettre($titre) {
        premiere_lettre_tab($titre);
        return $titre;
}
// renvoie les premieres lettres majuscules translitterees de tous les mots du titre
// formes du titre du glossaire : "Mot" ou "Mot1/Mot2/Mot3" ou "<multi>[fr]Mots1[en]Mots2</multi>"
function premieres_lettres($titre) {
        $arr = explode(_GLOSSAIRE_TITRE_BASE_SEP, extraire_multi($titre));
        array_walk($arr, 'premiere_lettre_tab');
        return join('', $arr);
}
// renvoie une barre de navigation alphabetique a partir d'une chaine (ex : "AABBBFGG")
function alphabet_cliquable($texte, $lettre, $nomboucle='') {
        $arr =  array_unique(preg_split('//', " $texte", -1, PREG_SPLIT_NO_EMPTY));
        sort($arr);
        unset($arr[0]);
        // retrait de la pagination
        $self = parametre_url(self(),'debut_'.$nomboucle,'');
        array_walk($arr, 'lien_1ere_lettre_tab', array($lettre, $self));
        return join('|',$arr);
}
// renvoie true si le mot peut etre affiche (sa premiere lettre correspond au contexte)
function mot_affichable($titre, $lettre) {
        $arr = explode(_GLOSSAIRE_TITRE_BASE_SEP, extraire_multi($titre));
        array_walk($arr, 'premiere_lettre_tab');
        return in_array($lettre, $arr);
}

Voici ensuite le corps du fichier glossaire.html (prenez le temps de l’insérer dans une page html construite conformément aux autres pages de votre squelette) :

[(#REM) Construction d'une chaine comportant toutes les premieres lettres de tous les mots du glossaire  (ex : "AABBBFGG") et stockage en tableau des mots valides]
#SET{arr,#ARRAY}
<BOUCLE_listalpha(MOTS){type=Glossaire}>
  [(#SET{lettres,[(#GET{lettres}|concat{[(#TITRE|premieres_lettres)]})]})]
  [(#TITRE|mot_affichable{#ENV{lettre,A}}|oui)#SET{arr,#GET{arr}|push{#ID_MOT}}]
</BOUCLE_listalpha> 
 
[(#REM) Affichage de la barre de navigation ]
<div class="barre_alphabetique">
  Index alphab&eacute;tique : [(#GET{lettres}|alphabet_cliquable{#ENV{lettre,A},Glossaire2})]
</div><hr/>
 
[(#REM) Affichage de la liste des mots retenus dans le tableau "arr" ]
<div class="liste_glossaire">
  <B_Glossaire2>
  <dl>
  <BOUCLE_Glossaire2(MOTS){type=Glossaire}{id_mot IN #GET{arr}}{par titre}{pagination}>
    <dt class="#EDIT{titre}">[(#TITRE|replace{\s*/\s*,' / '})][ ((#DESCRIPTIF))]</dt>
    <dd class="#EDIT{texte}">#TEXTE</dd>
  </BOUCLE_Glossaire2>
  </dl>
  #PAGINATION
  </B_Glossaire2>
</div>

Le groupe de mots-clés utilisé ici est “Glossaire”.

La première boucle ci-dessus permet de récupérer la liste de toutes les premières lettres de tous les mots du glossaire et repère (en les plaçant dans un tableau) les mots du contexte : ceux trouvés dont la première lettre correspond au contexte, le paramètre d’url lettre.

La deuxième boucle nommée “Glossaire2” se borne à afficher les mots repérés par la première boucle. L’avantage est bien de lister toutes les formes de mot, dont la première lettre est celle du contexte. Notez l’utilisation ici d’une pagination standard sur 10 mots.

Quelques lignes CSS pour enjoliver le tout ?

.liste_glossaire dt {
	color:darkGreen;
	font-size:110%;
	font-weight:bold;
	margin:0px;
}
.liste_glossaire dd {
	font-size:95%;
	margin:0px 0px 20px 25px;
}
.barre_alphabetique a {
	font-weight:bold;
}
.lettre_contexte {
	text-decoration:none;
	background-color:#FFCC00; 
}

Un petit exemple pour éclairer tout ceci : http://www.ch-bailleul.fr/?page=glo.... Vous avez vu pourquoi la définition de “Oncologie” apparaît dans la liste des mots commençant par “C” ? ... CQFD.

Footnotes

[1Ce séparateur est modifiable. Voir le paragraphe traitant des surcharges

[2config/mes_options.php sous SPIP>=2.0

[2config/mes_options.php sous SPIP>=2.0

[2config/mes_options.php sous SPIP>=2.0

Cette contrib est issue d’une compilations d’idées trouvées sur SPIP-Contrib. Lisez par exemple : Un glossaire interne, Plugin glossaire ou Un raccourci <motxx>, pour des mots-clés dans le texte.

Des travaux plus anciens (non adaptés au glossaire du Couteau Suisse) ont été faits sur la navigation alphabétique : Tri alphabétique tout en SPIP, http://forum.spip.org/fr_179701.html, VarianteContribCreer-un-index-classement

Discussion

69 discussions

  • Bonjour,

    Tout d’abord, bravo et merci pour ce merveilleux outil de partage de savoir que vous mettez à notre disposition.

    J’aurai une suggestion à faire : quand un mot se trouve en bas d’écran, la définition qui s’affiche se met dessous, donc, on se retrouve avec le texte de la définition sous l’écran, hors de vue. Serait il possible de tester la position du mot pour que la définition s’affiche au dessus du mot à ces moments là ?

    Je suis en spip1.9.2c squelette Epona et je teste avec Firefox 2

    Merci

    Reply to this message

  • 8

    Bonjour à tous, j’ai un soucis lors de l’activations de certains outils qui me sont indispensable pour le site sur lequel je travaille. J’utilise la version 1.9.2b de spip, serveur en interne (easy php) avec un squelette fait maison.

    Mon probleme viens de l’outils glossaire associé au sommaire et à la coupe des page. Le premier activé tout seul fonctionne parfaitement, mais lorsque je j’active, dans l’ordre que ce soit, l’outil sommaire ou la découpe de l’article en plusieur page, glossaire ne fonctionne plus (et n’apparait plus dans le code source a part l’appel du css dans le head).

    Quelqu’un a t-il eu ce genre de problème, savez vous d’ou cela pourrait venir ? Sachant qu’il se passe la même chose avec le squelette de base de spip.

    Autre soucis, le glossaire ne semble pas prendre en compte la succession de même lettre à la fin d’un mot. Exemple: STRESS.

    Y a t-il un moyen de contourner le problème?

    Merci de votre aide

      • Le glossaire : effectivement, un petit oubli dans les traitements de la balise #TEXTE sur les articles créait ce pb. Merci, je viens de le réparer.
      • Le mot STRESS : je ne reproduis pas ce bug... Quelle est la phrase exacte ?
    • Il n’y a pas de phrase précise puisque je l’ai testé sans tenir compte du sens du texte mais je te le met:

      “Selon vos besoins et vos possibilités environnementales, les consultations auront lieu sans stress et institution” (autre mot testé)

      ou encore “celui qui psychologise sans stress”

      Stres fonctionne par contre :-/

      Merci de ta réponse, j’actualise l’outil (cela va me soulager grandement ) :)

    • Je crois que tu as tout arrangé d’un coup en fait. Je viens d’actualiser le plug in et cela fonctionne farpaitement ainsi que le mot stess aussi.

      Donc parfait, a voir pourquoi donc il ne voulait pas fonctionner. J’ai une liste de 300 mots a y metre donc je noterai les problèmes s’il y en a.

      Merci de nouveau!

    • Avec une mise à jour du plugin, il est désormais possible d’utiliser les caractères accentués et surtout de définir les différentes formes du mot. Par exemple : «architrave/architraves»

      Merci du retour.

    • Bonjour,

      ...de définir les différentes formes du mot. Par exemple : « architrave/architraves »

      Je comprends que l’on peut définir deux mots clés différents dont l’un se trouve être le pluriel de l’autre, mais a contrario cela veut-il dire qu’en ayant défini architrave comme seul mot clé dans le texte si j’ai la chaîne architraves, le glossaire n’apparaîtra pas, bref que les pluriels ne sont pas pris en compte...

    • C’est exact. Cela empêche que le soulignement ait lieu dans un mot comme “néfaste” alors que le mot-clé “faste” a été défini...

      Le Glossaire recherche une fin de mot avant et après le mot en question.

    • Bonjour,

      je rencontre un problème similaire à celui-ci. J’ai défini le mot pH dans le glossaire.Dans mon texte ph est souligné dans le mot phénomène. je voudrais éviter cela en indiquant de vérifier la fin et le début du mot défini.

      Merci de vos conseils

    • Vous avez un lien public à montrer? dans quel charset est votre site? En principe tout cela est vérifié, mais sans doute trop lâchement. Les accents sont un vrai problème.

    Reply to this message

  • 2

    Merci pour ce fantastique plugin et son évolutivité permanente.

    Je soumet une curiosité avec la bien utile fonction ’glossaire’. Celle-ci fonctionne sans problème sur un de mes sites mais pas sur l’autre (tous deux 192c). La seule différence apparente est l’un en php 4.10 mysql 4.1.11 (celui qui marche) et l’autre en php 4.4.7 et mysql 3.23.58 (marche pas). Est-il possible que la base sql trop vieille soit responsable d’un tel problème ou y a t-il d’autres pistes ?
    Merci.

    • La fonction de consultation SQL est assez basique... Il faudrait étudier le résultat du sql_fetch en mettant par exemple “echo $mot,'<br/>';” après la ligne “while($mot = $fetch($r)) etc.”.

      Les mots-clés sont-ils bien configurés, les groupes également?

    • A ma grande honte, j’ai trouvé le bug (de mon coté). Ca n’a rien à voir avec SQL. J’avis simplement un span display: none; dans la feuille de style et rien ne s’affichait ...
      Désolé pour le spam

    Reply to this message

  • 3

    Bonjour à tous,

    j’ai intégré le glossaire dans un site, ca me convient tout a fait, cependant j’aimerai pouvoir enlever le liens vers le mot, je souhaite seulement que s’affiche la description du mot au survol. comment puis je faire, j’ai éssayé de modifier le fichier glossaire_fonctions.php mais ca n’a rien donné.

    merci de votre aide

    • bonjour a tous,

      problème réglé, il y avait un fichier dans tmp/couteau-suisse/mes_fonctions.php, ce fichier est le meme que glossaire_functions.php, cependant je pense que c’est celui la qui est pris en compte.
      a la place de : $table1[$id] = “”;

      j’ai mis : $table1[$id] = “”;

      voila, si jamais ca peut servir à quelqu’un

    • href=\“$lien\” —>href=\“#\”

    • ton message n’est pas lisible. Il faut placer ton code entre les balises <code> et </code>

      Attention : il ne faut pas modifier ce qui se trouve dans tmp/, puisque tout est recalculé régulièrement. Toutes tes podifs auront bientôt disparu. glossaire_functions.php est pris en compte lorsqu’un article est recalculé à la main (var_mode=calcul) ou lorsqu’on va sur la page config du couteau suisse.

    Reply to this message

  • 6
    Licioula

    Félicitations, mais pourquoi Sous IE6 et sarka spip, l’espace après le mot choisis, disparaît?
    ici, par exemple, pour le mot “genre”....
    http://www.courges.org/spip.php?article11

    Merci pour tout

    André

    • Ah oui, la source pourtant contient bien l’espace. Une piste vers les css du squelette sarka? avec la dist de SPIP, aucun espace n’est mangé comme ça...

    • Juste une petite remarque

      Je pense qu’il faut plutôt chercher du côté de la compatibilité navigateur car sur ton site “courges” j’ai bien l’espace qui disparaît avec IE6 (et d’ailleurs aucune fenêtre ne s’ouvre) par contre avec firefox 2.0 l’espace est bien là et la fenêtre explcative s’ouvre bien que très à gauche de la page alors que le mot se trouve à droite.

    • Licioula

      Merci pour vos remarques, mais je me sens bien incapable d’intervenir sur quoique ce soit... ;=[[

      André

    • Pour tenter de trouver la source du pb, il faut désactiver tous les autres plugins dans un premier temps, vérifier de nouveau si l’espace est toujours manquant malgré un recalcul de la page, puis en cas d’échec, revenir au squelette d’origine de SPIP en renommant temporairement par exemple le dossier «squelette» en «squelette.bak». Cette petite procédure devrait localiser le responsable...

    • Je viens d’installer le système suivant :
      SPIP 1.9.2a SVN [9221] + Sarka-SPIP 1.9.2 [175] + Couteau Suisse 1.7.3.4

      Et aucune erreur en apparence sous IE 6! A toi de voir si la mise à jour des divers éléments règle le problème...

      Je précise qu’IE6 buggue dans la gestion des css et que la définition ne s’affiche pas au survol de la souris. Donc, soit il faut passer sous FF2 ou IE7, soit fabriquer une solution Javascript/jQuery.

    • Bon, ben ça marche !

      http://www.courges.org/spip.php?article11

      j’ai fait ce que vous m’avez dit, j’ai mis la dernière svn de spip, la dernière version du couteau suisse, (j’ai essuyé un peu les lames quand même, le tire-bouchon est pas terrible, mais bon...)j’ai mis la dist, remis le squelette , et “miracle” ça marche!

      Bien sûr, il n’y a pas la bulle sous IE6, mais ça je le savais, je ne vais pas me plaindre...

      Merci pour tout

      André

    Reply to this message

  • 2

    Hello la zone

    Est il possible d’avoir une option afin que d’afficher les 3 premières lignes par exemple d’une définition? Cela serait utile pour les définitions à ralonge.

    salutations

    • Une mise à jour du plugin te permettra de remplir également le descriptif du mot-clé, au cas où la définition réelle du mot est trop longue.

      Le plugin retiendra donc de préférence le descriptif rapide. S’il est vide, alors rien de changé, la définition retenue sera le texte explicatif entier.

    • ça c´est du support efficace ou jme trompe ;)
      je teste ça aujourd´hui
      Merci bcp

    Reply to this message

  • 5

    Lut ( d’après mon expé perso avec Couteau Suissse )

    Comme l’explique le titre de ce post, il peut être interessant (surtout dans le cas d’un site déjà bien rempli, avec des groupes de mots-clés bien établis ) d’autoriser le glossaire à “piocher” dans plusieurs groupes de mots , ..; autre que “Glossaire” , forcément ;O)) .. par exemple aussi “Définitions” ou que sais-je si le thème du site l’exige, bien sür .

    $r = spip_query("SELECT id_mot, titre, texte FROM spip_mots WHERE type='Glossaire'"); à passer en WHERE type .. IN ('Glossaire', 'Definitions'; ...) ? ... à l’aide de case à cocher dans la cfg privé ?

    [PS : Peut-être aussi proposer qqchose pour les mots composés ou des expressions ? ... mais là c’est peut-être également un peu superflu]

    En tout cas bravo ça fonctionne ! @+ de jiocef(site)

    • Merci pour cette proposition intéressante et détaillée. La version 1.7.6.8 du Couteau Suisse intègre donc la possibilité de choisir le ou les groupes de mots-clés pour le glossaire interne.

    • Et aaahque ça marche tip top ( peut-être quand mêm qq pb sous IE7, mais je crois que j’ai trop serré ma sécurité, sous FF c’est nickel)

      PS : Mais j’ai évité de définir les groupes de mots avec des accentuées et les mots composés ;O)

      Merci ++

    • Avec une mise à jour du plugin, il est désormais possible d’utiliser des accents ou des mots composés.

      Merci du retour.

    • Merci pour tes nuits blanches ;O))

      Autre question ... les CACHE{0} sont-ils vraiment utiles ?? ... ahhhquepassque ça peut ralentir les sites déjà un peu lents (notamment pour les chatons où il semble que le CS reliste à chaque fois les fichiers images dispo dans le répertoire haddoque ;O)) ... choix difficile entre réactivité et attractivité

      @+

    • De rien ;) parfois des nuits blanches, ca arrive !

      Où vois-tu des #CACHE0 ? Je ne crois pas que les chatons sont relus à chaque fois que le cache est calculé...

      La liste des chatons dispos se fait quand le paramètre “var_mode” existe, ou qd on affiche la page de config du plugin. C’est là-dessus que j’ai mis les tests.

    Reply to this message

  • 3
    Marc VALLETEAU de MOULLIAC

    Bonjour, j’ai installé le Couteau suisse sur un site (en local pour le moment) afin d’utiliser une fonctinnalité indispensable pour moi, le Glossaire : en effet, il s’agit d’un site sur la protection sociale française !!

    Je développe ce site sur mac (Safari) mais fais en sorte qu’il fonctionne aussi bien sur IE, mais ... surprise (mauvaise !), le glossaire ne marche pas sous IE. Je m’explique.

    Le mot du glossaire est bien surligné, mais le passage de la souris n’ouvre pas la petite fenêtre qui apparaît sur Safari Mac ...

    Est-ce normal ? Ce serait vraiment dommage qu’un si bel outil soit aussi limité en utilisation, car la majorité des lecteurs sont encore sous IE (hélas !).

    Merci d’avance pour des précisions sur ce point ...

    Marc

    • ... surprise (mauvaise !), le glossaire ne marche pas sous IE

      Oui, le problème est déjà pointé dans l’article ci-dessus et semble concerner IE6, mais pas IE7. IE7 pour Windows est listé dans les mises à jours prioritaires et il est fort à parier que les utilisateurs IE6 seront à l’avenir bien moins nombreux.

      En ce qui concerne le Mac, as-tu essayé diverses versions de IE ? Je n’ai pas les moyens de tester.

      Je prépare un glossaire en Javascript, ce qui résoudra en principe tous les problèmes, sauf pour ceux ...

      ... ben qui n’ont pa Javascript activé ! Le choix sera donc laissé au webmestre.

    • Marc VALLETEAU de MOULLIAC

      En ce qui concerne le Mac, as-tu essayé diverses versions de IE ? Je n’ai pas les moyens de tester.

      Même remarque pour IE Mac, qui est une version 5.2.3(5812.1) for Mac, et qui n’affiche que le mot surligné, avec le lien vers la page mot ...

      Il n’y a pas, à ma connaissance, de version plus récente pour Mac, car le dév a été arrêté par Microsoft à la sortie de Safari.

      Voilà. Je reste à disposition pour continuer des tests sur Mac si nécessaire.

    • ... surprise (mauvaise !), le glossaire ne marche pas sous IE

      Effectivement, IE6 n’aime pas le CSS. Une mise à jour du plugin permet désormais de choisir la technique utilisée pour créer le glossaire : JS ou CSS. Par défaut, il vaut mieux choisir le JS.

      Merci du retour.

    Reply to this message

  • 2

    J’ai un cas curieux : j’ai une entrée de mon glossaire pour le mot “fastes” et curieusement le glossaire est activé dans un article sur le mot néfastes. Si j’écris nefaste dans l’article, je n’ai plus le problème.

    A priori c’est donc lié à la présence d’un caractère accentué. C’est le seul mot pour lequel j’ai observé le désagrément.

    J’ai bien téléchargé la dernière version de couteau suisse...

    • Eh oui, parce que dans ton cas, le “é” est probablement codé “&eacute;” dans la source de ton article. Du coup, le point virgule indique une fin (ou un début !) de mot... La solution serait peut-être de laisser les accents tels quels ?

    • Avec une mise à jour du plugin, il est désormais possible d’utiliser les caractères accentués et surtout de définir les différentes formes du mot. Par exemple : «faste/fastes»

      Merci du retour.

    Reply to this message

  • 1

    Je souligne deux problèmes rencontrés avec cette contribution :

    -  Ce message d’erreur “Warning: preg_match() [function.preg-match]: Unknown modifier ’T’ in...”
    Après plusieurs vérifications, il apparaît que les mots clés ne peuvent contenir de virgule, car elles génèrent cette erreur.

    -  Dans certains cas, et de façon aléatoire, des syllabes sont reconnues comme des mots (bit dans débit). Cette reconnaissance disparait parfois au recalcul de la page.

    Sinon, cet outil est très utile et rend de grands services. Merci

    • Avec une mise à jour du plugin, ces deux soucis devraient disparaitre. Pour le mot-clé «bit», le mot «débit» n’était pas souligné, mais «d&eacute;bit», oui...

      Merci du retour.

    Reply to this message

Add a comment

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 / PostgreSQL
  • 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 apparait.

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.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom