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

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

updated on 2 October 2019

Discussion

69 discussions

  • 2
    Garry Olivier

    Bonjour,

    nous venons de voir sur un texte récent publié que le glossaire était activé sur le terme “mandatée” alors que le terme saisi est “mandat”

    En revanche sur un autre texte “mandats”, terme saisi, ne déclenche pas l’activation du glossaire sur “mandat”

    Quelle est la règle retenue pour les déclinaisons et quelle alternative utilisée pour soit désactiver dans un cas, soit activer dans l’autre sauf à saisir explicitement tous les termes séparés par des /

    merci

    • Un pb d’accent sans doute...
      -  Quel est le jeu de caractères du site du site (configuration/Gestion des langues) ?
      -  Quel est le terme exact utilisé pour le mot ?

    • Garry Olivier

      Le terme utilisée est “mandatée” en utf-8

    Reply to this message

  • 5
    Pierre-Jean

    Bonjour,

    Comment faire pour afficher les mots du glossaire trouvé dans le texte ailleurs que dans le texte lui-même ?
    Plus clairement : j’aimerais pouvoir boucler ou afficher les mots trouvés par le glossaire à un endroit bien défini dans ma page, par exemple : faire un nuage de tags avec les mots trouvés.

    Pierre-Jean

    Reply to this message

  • 2

    Bonjour,
    Dans le squelettes article.html, j’ai un petit texte écrit pour le Portfolio.
    J’aimerais que le mot “téléchargeable” soit pris en compte dans le glossaire ( bien entendu, le mot est créé dans le glossaire .. ). J’ai vu qu’il était possible de forcer une balise
    [(#MA_BALISE|cs_glossaire)].
    Mais dans mon cas il s’agit de surcharger un petit texte qui se trouve dans le squelette.
    Le mot “téléchargeable” est donc noté “t&eacute;l&eacute;chargeable” comme ceci dans le squelette.
    Est-ce possible de le faire fonctionner avec le glossaire ?
    Si oui comment .. et de quelle manière ?
    Merci

    Pour exemple, voici une des adresses :
    http://g.colin.free.fr/spip/spip.ph...

    • Peut-être : [(#VAL{t&eacute;l&eacute;chargeable}|cs_glossaire)] ?

      Ou : <:telechargeable|cs_glossaire:> si tu as défini une chaine de langue ’telechargeable’ dans local_fr.php (http://www.spip.net/fr_article2128.html) ?

      Etait-ce le sens de ta question ?

    • Oui, merci ...
      Cela fonctionne avec la première solution, puisque pour le moment je n’envisage pas de faire mon site en multi-langue.
      C’était bien le sens de ma question, soit “activer un mot du Glossaire du Couteau Suise” dans un texte écrit directement dans un squelettes " : [(#VAL{Mot_du_Glossaire_Choisi}|cs_glossaire)].

      Bonne journée

    Reply to this message

  • 2

    Bonjour,

    Je suis en train de tester le glossaire en ce moment et tout fonctionne très bien à une chose prêt... Dans mon cas le fait que l’outil soit insensible à la casse pose problème car je ne m’en sert que pour la traduction des sigles/acronymes...

    En clair si les prochaines versions pouvait permettre de paramétrer la sensibilité à la casse ça serait vraiment top :)

    • La sensibilité à la casse peut déjà être activée grâce aux expressions régulières.

      Je reproduis ici un extrait de l’article ci-dessus :

      Ces expressions régulières sont utiles pour la recherche d’un mot sensible à la casse. Exemple : « ,CES, » (abbréviation de Collège d’Enseignement Secondaire à ne pas confondre avec le pronom ces).

      Il faut donc mettre des virgules autour des mots-clés majuscules...

    • Autant pour moi, merci pour cette précision.

      J’essaye tout de suite.

    Reply to this message

  • 4
    Reynajo

    Bonjour. notre site a été commencé par une personne pro connaissant SPIP mais qui n’est plus là. Nous continuons entre débutants de SPIP, parce qu’il est trop génial.
    Nous avons un message d’erreur qui apparait tant sur le site privé que public, après avoir vidé les caches :

    Warning: preg_replace_callback() [function.preg-replace-callback]: No ending delimiter ’,’ found in /homez.38/solidari/www/tmp/couteau-suisse/mes_fonctions.php on line 556

    Nous avons regardé et si on ne se trompe pas, cela viendrait du code suivant :

    // a chaque mot reconnu, on pose une balise temporaire cryptee
    return trim(preg_replace_callback(",(?<=\W)(?:$mots)(?=\W),i", " glossaire_echappe_mot_callback ", " $texte ", $limit));

    Notre version de SPIP installée est : 2.0.7 .
    Il est possible que la personne "pro" ait"touché" aux codes, nous n’en savons rien.
    Pourriez vous nous aider ? Ce serait vraiment super sympa, car notre site devrait bientôt être mis en ligne ( on espère!), mais pas tant que ce message apparaît et des fois 15 fois en haut de page.

    Merci +++++

    PJ : copie intégrale du code du fichier mes_ fonctions.php qui se trouve dans /www/tmp/couteau-suisse, -> codes

    • Pour insérer du code (pas trop long...) ici, il faut utiliser les balises <cadre> et </cadre>. L’erreur est provoquée par un mot particulier du glossaire... Y en a-t-il beaucoup? quels sont ces mots?

    • Reynajo

      Merci beaucoup de nous aider.
      Je ne voulais pas copier le code sur le site, car dans le fichier,je ne savais pas quelle partie vous serait utile ou pas et cela aurait été trop long. Bon j’insère un bout du fichier, surligné en jaune la ligne 556 .

      // parcours de tous les mots, sauf celui qui peut faire partie du contexte (par ex : /spip.php?mot5) 
      	$mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot'); 
      	foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) { 
      		// parser le mot-cle du glossaire 
      		// contexte de langue a prendre en compte ici 
      		list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre'])); 
      		$mot_present = false; 
      		if(count($les_regexp)) { 
      			// a chaque expression reconnue, on pose une balise temporaire cryptee 
      			// ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i 
      			$texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit); 
      			// TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu 
      			// et s'il faut construire la fenetre de glossaire. 
      			// TODO 2 : decrementer le parametre $limit pour $les_mots, si &$count est renseigne. 
      			// en attendant, constuisons qd meme la fenetre... 
      			$mot_present = true; 
      		} 
      		if($les_mots) { 
      			if(preg_match(",\W(?:$les_mots)\W,i", " $texte ")) { 
      				$texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode); 
      				$mot_present = true; 
      			} 
      		} 
      		// si un mot est trouve, on construit la fenetre de glossaire 
      		if($mot_present) { 
      			$lien = $glossaire_generer_url($gloss_id, $titre); 
      			// $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte']; 
      			$table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons 
      			$table2[$gloss_id] = recuperer_fond( 
      				defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css',  
      				array('id_mot' => $gloss_id, 'titre' => $les_titres,  
      					'texte' => glossaire_safe($mot['texte']),  
      					'descriptif' => glossaire_safe($mot['descriptif']))); 
      		} 
      	}

      Notre glossaire comprend 400 termes, mais va grossir considérablement dans le temps.
      Il y a 4 types de mots et il nous a été créé un champ supplémentaire dans le cadre de saisie des mots du glossaire qui permet d’indiquer la catégorie ( soit Dico Sigles, dico animalier, dico noms propres, termes non animalier)
      Sinon on remplit le contenu des explications sur le terme du glossaire dans Descriptif rapide ( on met jamais rien en Texte explicatif). D’autre part, certains mots du glossaire ont des articles qui leur sont liés.

      -  des sigles : par exemple : 3A-FIM, ou AACDA ( jamais de . entre les lettres, mais qq uns ont un tiret au milieu. Pour les sigles, dans Descriptif rapide je mets les lettres correspondantes au sigle en gras comme ceci A

      -  Noms propres : Prénom Nom, exemple : Albert t’Serstevens, Alexis Carrel, Truc de Machin de Bidule
      ( je vous ai mis Albert, car il a la particularité d’avoir une apostrophe au milieu)

      -  termes animalier : peut être constitué d’un seul mot ou de plusieurs (exmple : Groupe 1, ou Perruche à bandeau rouge) et pour que le pluriel soit aussi reconnu, on nous a demandé de saisir comme suit :
      Perruche à bandeau rouge/,perruche à bandeau rouge?,i
      (sans espace entre les 2)

      -  Termes non animaliers : mot ou groupe de mot, singulier/,pluriel?,i

      Vraiment merci de votre aide, car nous souhaitons vraiment sortir notre site avec SPIP, même si nous ne le connaissons trés peu, on veut s’accrocher !!
      Si vous souhaitez m’appeler, n’hésitez pas, je vous donnerai mon tel.

    • Reynajo

      Surligné ne passe pas, donc la ligne 556 est :

      $texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit);
    • Reynajo

      Youpi et surtout MERCI

      Je viens de vérifier tous les mots clé du Glossaire et j’ai corrigé deux types d’erreur :
      -  l’apostrophe qui n’est pas acceptée (je ne le savais pas)
      -  et singulier/,pluriel?,i il manquait qq fois l’un des codes

      Après correction, nous n’avons plus de messages d’erreur, c’est génial

      MERCI à vous, le diagnostic était juste.

    Reply to this message

  • Bonjour,
    J’utilise ce plugin qui me rend bien des services et notamment l’affichage des mots-clés avec la liste alphabétique ! Un grand merci !
    J’aurais voulu savoir s’il était possible d’afficher l’ensemble des mots-clés par ordre alphabétique (et avec pagination) lorsqu’on arrive sur la page glossaire.html puis seulement les mots-clés qui commence par la lettre concernée lorsqu’on clique sur une lettre de la liste.
    J’ai un peu cherché mais je débute et là je sèche ...
    Merci.

    Reply to this message

  • 26

    Bonjour

    J’utilise votre pluging glossaire interne ...

    Ma question est : “est ce que l’on peut pour chaque groupe de mots, sélectionner une couleur qui correspondra à la couleur du lien des mots clés de ce groupe”

    Si oui, où doit on faire ce changement ?

    Merci d’avance de votre aide

    Désolé je ne m’étais pas connecté

    • Il faut modifier le fichier glossaire_css.html (ou glossaire_js.html).

      Pour récupérer l’id du groupe, il faut d’abord faire une boucle genre :

      <BOUCLE_mots(MOTS){id_mot}>#SET{groupe,#ID_GROUPE}</BOUCLE_mots>

      Et ensuite ajouter une classe au mot trouvé, par exemple :

      <span class="gl_dt groupe#GET{groupe}">[(#ENV*{titre})]</span>

      au lieu de : <span class="gl_dt">[(#ENV*{titre})]</span>

      Par CSS tu pourras donc choisir les couleurs que tu veux sur .groupe1, .groupe2, .groupe3, etc.

    • En fait il te faut créer un fond personnalisé. Le plugin te permet de surcharger la fonction glossaire_generer_mot_dist($id_mot, $mot) qui est utilisée pour traiter le mot trouvé.

      Dans le fichier mes_fonctions.php de ton squelette (ou au pire, dans config/mes_options.php), tu placeras par exemple la fonction suivante. Elle permet d’appeler un fond qui va boucler sur l’id_mot en cours et utiliser le champ id_groupe pour créer une classe par groupe :

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

      Dans ton squelette, tu crées ensuite le fichier fonds/couleurs_glossaire.html et tu y mets la fameuse boucle. Grâce à #ID_GROUPE, il t’es facile de créer une classe que tu pourras styler :

      [(#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>

      Par CSS tu pourras enfin choisir les couleurs que tu veux sur .groupe1, .groupe2, .groupe3, etc.

      Ce sujet étant intéressant, j’ai ajouté un paragraphe à l’article ci-dessus.

    • Au sujet du code que tu m’as donné, j’ai créée un article qui contient 4 mots-clés de 4 groupes différents.

      Chaque groupe a une couleur spécifique ....

      le pb est que seul les mots clés des groupes 1 et 2 apparaissent ... 3 et 4 ne marchent pas ?

      Pourquoi ?

    • Tous les groupes devraient fonctionner... Tu as rafraichi la page d’admin du Couteau Suisse pour tenir compte de tes nouveaux groupes ?

    • Salut

      Je voudrais savoir une petite chose ....

      J’ai installée la dernière version de Spip avec le couteau suisse et ton glossaire interne avec en plus la partie des groupes de couleur.

      Mon problème est que sous le serveur qui se trouve être une debian et avec la version php 5.2.11, j’ai comme pb que je ne peux pas accéder à mon site (taille allouée) et que si j’enlève ceci, cela fonctionne.

      Avez vous une idée

      Merci d’avance

    • Bonjour

      Suite à ma question sur le glossaire interne, je voulais savoir s’il était possible ou pas de pouvoir couper le résultat comme cela est fait dans l’affichage des articles ?

      Merci d’avance

    • Oui, il faut pour cela surcharger le fond du glossaire (glossaire_css.html ou glossaire_js.html) en le recopiant dans dossier_de_mon_squelette/fonds/ et changer #ENV*{descriptif}|sinon{#ENV*{texte} en #ENV*{descriptif}|sinon{#ENV*{texte}|couper{300}

      Voila, je n’ai pas testé cette modif, tu nous dira si c’est ce que tu cherches à faire...

    • c’est ça ... cela marche merci

    • Bonjour

      est ce qu’il est possible de faire apparaître la liste des mots en fonction d’un groupe par ordre alphabétique et surtout par pagination à 10 ?

    • Bien sûr. Les boucles de SPIP permettent une foule de choses, en fonction des critères choisis ;-)

    • Merci de votre réponse mais étant novice sous spip je me permets de vous demander si vous avez un exemple.

      Autre question, est ce que ce pluging accepte pas certains caractères dans la base de données “spip_mots” ?

      Merci

    • Pour un affichage comme celui-là il faut une double boucle. Un peu comme :

      <BOUCLE_groupes(GROUPES_MOTS){par titre}{"<br></BOUCLE_groupes>"}>
      - #TITRE : <BOUCLE_mots(MOTS){id_groupe}{par titre}{" - "}>#TITRE</BOUCLE_mots>
      </BOUCLE_groupes>
    • J’ai commencé à essayer de faire une pagination mais cette dernière foctionne sur l’ensemble de tous les mots alors que mois je voudrais quelle fonction en fonction de la lettre.

      Voici mon code :

      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

      inc-bandeau}{lang}{id_mot}>
      [(#REM) Construction d'une chaine comportant toutes les premieres lettres de tous les mots du glossaire (ex : "AABBBFGG") ] [(#SET{lettres,[(#GET{lettres}|concat{[(#TITRE|premieres_lettres)]})]})] [(#SET{ok#ID_MOT,[(#TITRE|mot_affichable{#ENV{lettre,A}})]})] [(#REM) Affichage de la barre de navigation ]

      #ENV{Glossaire}


      Index alphabétique : [(#GET{lettres}|alphabet_cliquable{#ENV{lettre,A}})]

      #ANCRE_PAGINATION
      [(#GET{ok#ID_MOT}|?{' ',''})
      [(#TITRE|replace{\s*/\s*,' / '})][ ((#DESCRIPTIF))]
      #TEXTE
      ]
      #PAGINATION

      <:autres_listes_indexation:>

      inc-menu-glossaire}{lang}{id_mot}> inc-bas}{lang}{id_mot}>
    • Les caractères où cela pose pb sont les balises

      , les virgules, les guillemets versions françaises ...
    • Je réécris le code :

      partie liste alphabétique :

      [(#REM) Construction d’une chaine comportant toutes les premieres lettres de tous les mots du glossaire (ex : “AABBBFGG”) ]


      [(#SETlettres,[(#GETlettres|concat(#TITRE)])]
      [(#SETok#ID_MOT,[(#TITRE|mot_affichable#ENVlettre,A)])]

      [(#REM) Affichage de la barre de navigation ]

      #ENVGlossaire


      Index alphabétique : [(#GETlettres|alphabet_cliquable#ENVlettre,A)]

    • partie liste des mots

      <B_Glossaire2> #ANCRE_PAGINATION
      [(#GETok#ID_MOT|?’ ’,’’)
      [(#TITRE|replace\s*/\s*,’ / ’)][ ((#DESCRIPTIF))]
      #TEXTE

      ]

      #PAGINATION

    • On ne comprend pas du tout ton message... Il faut mettre tes exemples entre les balises <cadre> et </cadre>.

    • Voici mon code :

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      
      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
      <head>
      	<title>[[(#NOM_SITE_SPIP|textebrut)]] : [(#TITRE|supprimer_numero|textebrut)]</title>
      	<INCLURE{fond=page}{fond=styles}{lang}{id_mot}>
      </head>
      <body dir="#LANG_DIR" class="#LANG mot groupe#ID_GROUPE mot#ID_MOT">
      <div id="page">
      
      <!-- *****************************************************************
      	Bandeau, titre du site et menu langue
      	Header and main menu (top and right)
          ************************************************************* -->
      
      <INCLURE{fond=inc/inc-bandeau}{lang}{id_mot}>
      
      <!-- *****************************************************************
      	Contenu principal (centre)
      	Main content (center)
          ************************************************************* -->
      	<div id="bloc-contenu">
      
                [(#REM) Construction d'une chaine comportant toutes les premieres lettres de tous les mots du glossaire  (ex : "AABBBFGG") ]
      
      <BOUCLE_listalpha(MOTS){type=#ENV{Glossaire}}>
      [(#SET{lettres,[(#GET{lettres}|concat{[(#TITRE|premieres_lettres)]})]})]
      [(#SET{ok#ID_MOT,[(#TITRE|mot_affichable{#ENV{lettre,A}})]})]
      </BOUCLE_listalpha>
      
      [(#REM) Affichage de la barre de navigation ]
      <center>
      <h1>#ENV{Glossaire}</h1>
      </center>
      <br/>
      <div class="barre_alphabetique">
      	Index alphab&eacute;tique : [(#GET{lettres}|alphabet_cliquable{#ENV{lettre,A}})]
      </div><hr/>
      <div class="liste_glossaire">
      <B_Glossaire2>
      #ANCRE_PAGINATION
      		<dl>
      <BOUCLE_Glossaire2(MOTS){type=#ENV{Glossaire}} {par titre} {pagination}>
      		[(#GET{ok#ID_MOT}|?{' ',''})
      		<dt class="#EDIT{titre}"><a href="#URL_MOT">[(#TITRE|replace{\s*/\s*,' / '})][ ((#DESCRIPTIF))]</a></dt>
      		<dd class="#EDIT{texte}">#TEXTE</dd>
      		]
      	</BOUCLE_Glossaire2>
       </dl>
               
      #PAGINATION
       </B_Glossaire2>
      </div>
      
      	</div><!-- bloc-contenu -->
      <!-- *****************************************************************
      	Menus contextuels (droite)
      	Contextual menus (right)
          ************************************************************* -->
      
      
      	<div id="menu-rubriques">
       <h2 class="structure"><:autres_listes_indexation:></h2>
            <div class="menu">
            <ul>
              <li><b><:autres_listes_indexation:></b>
                <ul>
            <BOUCLE_groupes(GROUPES_MOTS){par titre}>
            <?php
              if(#ID_GROUPE!=#ENV{id}) echo '<li><a href="spip.php?page=glossaire2&Glossaire=#TITRE&id=#ID_GROUPE">#TITRE</a></li>';
            ?>
      </BOUCLE_groupes>
      
      
              </ul>
              </li>
            </ul>
            </div><!-- menu -->
           
            
      
           
      
           
      
      	</div><!-- encart -->
      
      
      
      <INCLURE{fond=inc/inc-menu-glossaire}{lang}{id_mot}>
      <INCLURE{fond=inc/inc-bas}{lang}{id_mot}>
      </div>	<!-- page -->
      
      </body>
      </html>

      si on peut m’aider

    • Il faut éviter de mettre du php dans un squelette, il n’y a aucune garantie contre les erreurs de syntaxe...

      Ta dernière boucle doit être :

      <BOUCLE_groupes(GROUPES_MOTS){par titre}>
      [(#ID_GROUPE|=={#ENV{id}}|non)
      	<li><a href="[(#URL_PAGE{glossaire2}|parametre_url{Glossaire,#TITRE}|parametre_url{id,#ID_GROUPE})]">#TITRE</a></li>
      ]
      </BOUCLE_groupes>
    • Merci et en ce qui concerne la pagination, car mon problème est que cela affiche des n° de pagination mais pour l’ensemble des mots du groupe sans prendre en compte les lettres et le groupe que l’on a choisi.

      Comment à la place de mettre dans un squelette <?php $id=#ID_GROUPE?> je peux écrire ?

      Merci d’avance

    • $id=#ID_GROUPE : utiliser des variables sous SPIP, c’est avec #SET et #GET. Il me semble t’avoir déjà proposé la traduction de ton code php...

      Sinon, pour ton système de pagination, il faut utiliser un tableau et passer le bon critère dans la boucle. Je viens donc de modifier l’exemple ci-dessus (squelette html) en le rendant un peu plus “moderne” et “paginable”. Je te laisse l’adapter à tes besoins.

    • Est ce que ce pluging prend beaucoup de ressources sous spip ? Car je trouve que quand je cherche à lire un article, il rame beaucoup ?

    • Tout dépend du nombre de mots-clés présents dans la base. Il est possible en effet que cet outil (Glossaire interne) prenne certaines ressources serveur au moment du calcul de la page, avant la mise en cache (une fois par jour, selon les réglages par défaut de SPIP).

      As-tu de nombreux outils activés ? Certains ne prennent aucune ressource. Par précaution, il vaut mieux activer juste ce qui est nécessaire...

    • cela se règle où les paramètres par défaut de spip.

      Actuellement j’ai comme pluging, un squelette en ajout suivi de pluguing pour le glossaire interne, cicas, snippets)

      Voila

    • Il y a une lame “SPIP et le cache” qui permet de modifier ces réglages par défaut (lorsqu’il n’y a pas de balise #CACHE dans les squelette).

      Les pages sont lentes car ton serveur est peut-être mutualisé avec d’autres sites... Je crois qu’en ajoutant le paramètre “&var_profile=oui” à ton URL, SPIP affiche la vitesse des boucles et des accès à la BDD. Dans les logs de SPIP (tmp/*.log), il y a aussi je crois le temps de compilation des différents squelettes.

    • Salut

      Est ce que tu sais combien de capacités demande ton pluging et si avec 4 groupes de mots avec pour l’instant actuellement en tout 2000 mots (pour les 4 groupes) je peux utiliser ton pluging car je risque d’avoir au moins des milliers de milliers de mots.

      est ce qu’il faut changer un paramètre sous apache, spip ....

      Merci d’avance

    Reply to this message

  • 4

    Bonjour,

    J’utilise cette lame du CS et son fonctionnement n’est pas celui que j’attends. Et je ne sais pas si c’est parce que j’ai mal compris son fonctionnement ou si parce que je l’utilise mal.

    Je précise que je suis sur la dernière version de SPIP et du CS.

    Exemple en ligne : http://www.ecole-herrin.net/spip.ph....

    Mon groupe de mot clé s’appelle “Cycles” et contient 3 mots clés.
    J’ai paramétré la lame pour utiliser ce groupe.

    Dans la rubrique j’affiche la liste des articles et à côté, les mots clés associés. C’est là que je souhaiterais que le glossaire joue son rôle. Or ... rien.

    Ou plus exactement, le #TEXTE de la rubrique c’est OK (voir en haut de la page). Mais pas à côté du titre des articles.

    J’ai donc ajouté le filtre |cs_glossaire, sans plus de succès.

    Au final, je ne comprends pas d’où vient mon erreur. Tout éclairage est le bienvenue.

    Par avance, merci.

    • Bonjour, tu avais très bien compris. L’utilisation que tu fais du filtre directement sur le titre du mot était trop “sévère” pour le plugin. Je viens de poster une correction qui devrait résoudre ce problème : http://zone.spip.org/trac/spip-zone...

    • Bonjour

      je viens de reporter la modification “à la main” (en attendant le nouveau zip) et ça fonctionne très bien. Merci pour le correctif.

      A+

    • En regardant de plus près ton code, il vaut mieux passer le glossaire après que ta liste de mots clés a été faite.

      En clair, au lieu d’un code qui appelle 10 fois le filtre et ressemblant à :

      <B_mots_art>[<BOUCLE_mots_art(MOTS){" - "}>[(#TITRE|cs_glossaire)]</BOUCLE_mots_art>]</B_mots_art>

      Il vaut mieux créer un fichier inc-glossaire.html dans lequel tu mets simplement ta boucle :

      <B_mots_art>[<BOUCLE_mots_art(MOTS){" - "}>#TITRE</BOUCLE_mots_art>]</B_mots_art>

      Et ensuite utiliser une seule fois le filtre :

      [(#INCLURE{fond=inc-glossaire}|cs_glossaire)]

      Tu as ainsi le bénéfice du cache SPIP...

      P.S. : ne pas oublier de transmettre le paramètre {id_article} dans ton cas ;-)

    • OK, j’ai modifié en ce sens. Et merci pour l’info, je ne savais pas qu’on pouvait appliquer un filtre à la balise INCLURE.

    Reply to this message

  • Bonjour

    J’utilise votre pluging glossaire interne ...

    Ma question est : “est ce que l’on peut pour chaque groupe de mots, sélectionner une couleur qui correspondra à la couleur du lien des mots clés de ce groupe”

    Si oui, où doit on faire ce changement ?

    Merci d’avance de votre aide

    Reply to this message

  • 1

    Bonsoir,

    C’est la 1ère fois que j’utilise le plugin Glossaire (merci Fred !), et je note qu’il fonctionne parfaitement bien sur mes articles et mes rubriques (SPIP 2.0.10), mais pas sur mes sites référencés...

    Puis-je corriger ce problème ?
    Merci par avance de votre aide.

    Fab

    • Bonjour fab,

      Le glossaire agit actuellement comme un traitement des balises #TEXTE, #TITRE et #CHAPO : les autres balises — comme #DESCRIPTIF par exemple — sont ignorées...

      Donc, soit on ajoute cette balise en natif, peut-être le devrait-on... Soit tu lui ajoutes un simple filtre dans ton squelette : |cs_glossaire

    Reply to this message

Ajouter un commentaire

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