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.

Notes

[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

71 discussions

  • 1

    Bonjour, ce petit bijou du Couteau Suisse est l’outil que je recherchai pour un glossaire de zoologie dans mon site. Apparemment le glossaire interne fonctionne bien mais la petite fenêtre n’apparait pas quand ont survole le mot avec la souris. Comment résoudre ce problème ?

    • Rebonjour, petite correction. L’infobule apparait seulement si on survole un petit espace crée automatiquement à la fin du mot, comme si c’était une note de bas de page.

    Répondre à ce message

  • Bonjour,
    dans un spip3.2 avec le thème Html5up Massively ,
    une inclusion d’un modèle alias

    <article95|texte>

    dans le texte de la rubrique
    ne fonctionne pas lorsque glossaire interne est activé.
    Une idée ? Merci

    Répondre à ce message

  • 2

    Bonjour,

    Serai-t-il possible d’utiliser ce plugin avec le plugin « Groupes arborescents de mots clés » ?

    Merci d’avance,

    Cordialement,

    Hervé

    • Bonjour. Il me semble que ça devrait bien cohabiter, non ? Quel est le besoin précis ?

    • Les 2 plugins cohabitent dans problème, mais si j’ai le groupe de mots Glossaire et un sous groupe à l’intérieur et que je place l’un des mots du glossaire dans ce sous groupe, le mot n’est plus détecté dans les textes et donc le plugin glossaire est inopérant pour ce mot.

    Répondre à ce message

  • Bonjour j’ai activé Rang dans mon site.
    Depuis j’ai un problème avec le glossaire interne. Les contenus des mots clés issus de raccourcis <article98|descriptif> ne s’affiche plus. Voir mot Grace Kelly dans la page.
    J’ai désactivé le plugin. Les numéros de titres des objets sont toujours là. Avez-vous une idée ? Merci

    Répondre à ce message

  • Bonjour, dans les champs descriptif et texte d’un mot clé du glossaire interne, j’ai mis les liens vers des champs alias : exemple <article98|descriptif> <article98|texte>.
    Cela ne fonctionne plus. Peut être depuis qu’en activant un plugin, le site a entrepris de mettre un numéro à chaque objet ? Merci de votre aide.

    Répondre à ce message

  • 10

    bonjour comment rédiger une seule entrée
    (avec expression régulière ?) pour
    107e Régiment d’Infanterie
    107e Régiment d’Infanterie
    107e RI
    107e R.I.
    merci !

    • Bonjour. Les deux premières lignes sont identiques ?

    • oui pardon et merci.
      Je rectifie et je complexifie :

      107e Régiment d’Infanterie
      107e Régiment d’ Infanterie
      107e régiment d’ infanterie
      107e RI
      107e R.I.

      merci

    • Le souci viendrait peut-être de la mise en exposant, tu confirmes en avoir un sur ton site ?

      Je mettrais bien un truc genre :
      107<sup>e</sup> R.I./,107(<sup[^>]*>)?e(</sup>)? *(R[.]*I[.]*|Régiment d’ ?Infanterie),i

      avant le slash, tu as le titre de la fenêtre de définition, et après le slash, tu as la super regexpr qui comprend tous tes exemples...

    • bonjour merci j’ai testé le « truc genre » ci-dessus.
      Résultat beaucoup de warning... et ça ne fonctionne pas.
      Je confirme l’exposant. Pour l’instant j’ai mis
      107e/,\b107\b,/=44
      qui a l’avantage de fonctionner mais qui ne répond que peu au besoin.

    • Pour le test, t’as bien fait un copier-coller complet ? chez moi ce truc genre marche bien pourtant...

      Je ne comprends pas ce que t’as mis, spip réclame un balise code ou cadre...

      Et quel genre de warnings ?

    • Warning : preg_replace() [function.preg-replace] : Unknown modifier ’<’ in /home/amidesk/www/trace/tmp/couteau-suisse/mes_fonctions.php on line 856

    • je viens de corriger la balise code/cadre dans le forum, mais à l’avenir il faudrait le mettre

    • Merci bcp Maïeul.

      Pour ton problème Ivandps, j’ai refais les tests de mon côté, mon expression régulière ne me cause pas d’erreur et fonctionne parfaitement. Tu as peut-être pas bien recopié, ou il existe peut-être une interaction inattendue dans les plugins. Je te propose de me convier en administrateur privé sur ton site si le problème persiste.

      Sinon, je confirme que ton titre proposé le 22/10 à 20:45 n’est pas correct et ne doit pas être utilisé en l’état.

    • Bon, c’est sans doute un problème d’accents dans la regexpr, tout dépend du codage utilisé par ton site...
      Voici une expression qui fonctionne :
      107<sup>e</sup> R.I./,107(<sup[^>]*>)?e(</sup>)? *(R[.]*I[.]*|R\S+giment d\S+ ?Infanterie),i

    • merci Patrice !!!

    Répondre à ce message

  • 8

    Bonjour,
    Je peux créer des mots dans mon glossaire interne mais si je modifie un mot clef existant voilà le message que j’obtiens, cela ne semble pas gêner le fonctionnement du glossaire :

    Fatal error : Call to undefined function debut_cadre_relief() in /home/nattar/public_html/tmp/couteau-suisse/mes_fonctions.php on line 481

    Merci pour votre aide

    • Bonjour, je ne reproduis pas cette erreur, tu as quelle version de SPIP ? Le Couteau Suisse est-il bien compilé ?

    • Bonjour et merci :
      SPIP 3.0.14
      Pour le couteau suisse je ne sais pas répondre à la question : je lis « version locale 1.9 » et « révision 82941 » et « votre version est à jour ».
      Est-ce que cela répond à la question ?
      Merci pour votre aide. Je ne suis pas un expert mais j’essaie de comprendre et de progresser.
      Bonne journée.

    • Bonjour, je me retrouve aussi avec cette erreur de temps en temps.

    • Bonjour, le problème persiste chez moi. Il se présente lors d’une modification d’un mot existant dans le glossaire, mais jamais lors de la création d’un nouveau mot...

    • Pat, tu as une idée du problème ?

    • Pardon pour le délai de réponse.

      Il devait manquer un include, je viens de poster une correction du plugin, vous me direz si le problème est bien réglé ;-)

    • Merci Pat, pour moi cela semble ok

    • chez moi ça fonctionne bien maitenant, plus de message d’erreur en modification comme j’avais jusque là.
      Merci beaucoup.

    Répondre à ce message

  • 1

    Bonjour,

    Je souhaite pouvoir dans un mot clef ou j’ai un lien et qu’il servent dans le glossaire qu’il soit cliquable. Or pour le moment la pop-in se cache quand on va la survoler, comment modifier cela ?

    Répondre à ce message

  • 3
    Christian Julia

    Bonjour,
    J’ai depuis quelque temps un étrange problème sur un site que je gère. Il utilise le glossaire interne, qui est un outil très utile pour ce site qui concerne des établissements médico-sociaux aux nombreuses abréviations obscures. Mais désormais quand un article contient les mots clés du glossaire, s’affiche au-dessus du bandeau de l’interface privée le texte de l’article, en grande largeur, répété autant de fois qu’il y a de mots de glossaire dans les champs (voir capture). Et parfois les mots clés sont remplacés dans ce texte en haut par @@M0#3@@ ! J’ai fait le test avec un article d’essai, selon que j’ajoute ou retire un mot-clé figurant dans le glossaire, le phénomène se produit ou pas.
    Je suis en version SPIP 2.1.25 et le couteau suisse est à jour. Version 1.8.148. Version 79943.
    Voyez-vous une explication ?
    D’avance, merci pour votre réponse.
    Christian.

    • Oh pardon, c’est un reste de débogage ! Je corrige ça de suite, le zip sera dispo vers 13h.

    • Christian Julia

      Merci beaucoup pour votre réponse et votre intervention.
      Christian.

    • Christian Julia

      Bonjour,
      Merci pour la nouvelle version. Tout fonctionne de nouveau normalement. Et encore bravo pour ce couteau suisse vraiment indispensable !
      Christian.

    Répondre à ce message

  • Bonjour à tous,

    Etant en spip 3 et en derniere version du couteausuisse, je tente désépéremment d’afficher la barre de lettres alphabétiques et les mots clés dans ma page de squelette de glossaire.

    En reprenant le code squelettes au dessus et en déclarant les fonctions dans mon squelettes/mes_fonctions.php, la barre apparait correctement, par contre les mots clés n’apparaissent pas .

    Les exemples renseignés ci-dessus sont-ils toujorus d’actualité ?

    Merci.
    CloudG

    Répondre à ce message

  • 6

    bonjour

    glossaire interne fait un lien vers le mot clé.
    J’aimerais spécifier un autre lien (lien vers un article interne ou externe).
    Est-il possible d’assigner une redirection virtuel au mot clé (à l’exemple de celle qui existe pour les articles ) ?

    merci

    • Bonsoir, as-tu essayé la fonction glossaire_generer_url() comme indiqué dans la doc ?

    • oui j’ai vu cette fonction.
      je voyais plus ceci :

      glossaire interne fait un lien vers le mot clé.
      J’aimerais spécifier un autre lien (lien vers un article interne ou externe).
      Est-il possible d’assigner une redirection virtuel au mot clé (à l’exemple de celle qui existe pour les articles ) ?

    • T’as pas besoin de me répéter la question cher ivandps, tu sais, je sais lire....

      Dans cette fonction, je pense que tu peux programmer de quoi y répondre, non ? Comment envisages-tu faire le lien entre l’article virtuel et le mot clé ? Il va falloir également surcharger la fenêtre de définition...

    • Pour cette redirection du lien, le code du plugin doit être un peu modifié.

      2 pistes :
      -  soit un mécanisme de redirection reconnu dans le titre comme le faisait SPIP2, par exemple : « architrave/=architrave.com »
      -  soit l’exploitation du descriptif ou du texte (plus lourd sans doute)

    • Bonjour, je viens de mettre à jour le Couteau Suisse et la doc pour permettre cette redirection dans le titre : http://zone.spip.org/trac/spip-zone/changeset/76478

      Tu me diras si tout est OK...

    • ouahh formidable ça marche !
      je peux paramétrer la page d’arrivée des mots du glossaire, lien interne, externe !
      Top merci infiniment de ton travail et de ton aide. Ivan

    Répondre à ce message

  • 29

    Bonjour,

    Pour des raisons d’accessibilité, j’ai besoin de mettre un attribut title dans la balise <a> d’un mot du glossaire. En effet, si la fenêtre de définition apparaît bien au survol de la souris, cette définition n’est pas accessible aux non-voyants, le lecteur vocal ne restituant que l’intitulé du lien, c’est à dire le titre du mot, mais ce n’est pas assez explicite.

    Je voudrais quelque chose du genre <a href=« URL » title=« TITRE_DU_MOT, définition dans le glossaire »>titre_du_mot</a>. Ainsi la synthèse vocale lira de façon explicite la destination du lien.

    J’ai beau chercher dans glossaire_fonctions.php, je ne vois pas où je peux insérer cet attribut...

    Pourriez-vous m’indiquer où modifier le code ?

    • Bonjour,

      Le title brouille visuellement la fenêtre du glossaire lors du survol de la souris : comment faire pour que le navigateur ne l’affiche pas pour les voyants ?

      Le code se site ligne 925 et pourrait peut-être être changé en :

      $table1[$gloss_id] = 
          "href='$lien' title =\"$les_titres\" name='mot$gloss_id"; 
    • Merci pour votre réponse.
      le fichier glossaire_fonctions.php ne contient que 283 lignes (/plugins/couteau_suisse/outils, c’est bien là ?). Pour moi, ceci se trouve ligne 214, mais j’ai déjà essayé cette modif sans succès (y compris en vidant le cache) : l’attribut title n’apparaît pas dans le code de la page. Une autre idée ?

      En ce qui concerne le masquage de l’attribut title à l’affichage, cela ne paraît pas possible de le faire, je n’ai pas trouvé malgré mes recherches. Cependant, l’info-bulle sur Firefox ne semble masquer que le titre de la fenêtre, la définition reste visible (si on ne bouge pas la souris dans la définition).

    • Ah oui c’est exact, c’est bien ligne 214. Pour que les modifs soient prises en compte, il faut recompiler le Couteau Suisse en réaffichant sa page d’admin, puis vider les caches de SPIP.

    • OK, maintenant ça fonctionne (désolé pour la mauvaise mise en forme du code à l’affichage, apparemment le raccourci [code][/code] ne fonctionne pas dans le formulaire de saisie) :
      J’ai mis $table1[$gloss_id] = « href=’$lien’ title=\ »$titre, définition dans le glossaire\« name=’mot$gloss_id » ;

      Le seul problème résiduel est pour les mots du glossaire dans une autre langue (en) que celle du site (fr) : dans ce cas, la variable $titre contient les balises span. Ce qui a pour conséquence fâcheuse la lecture des balises span par une synthèse vocale...

      J’ai une fonction perso (dans mes_fonctions.php dans mon dossier squelettes) qui extrait le contenu de balises span, ce qui donnerai le code :
      $table1[$gloss_id] = « href=’$lien’ title=\ »« .contenu_balises_acronym_abbr_span($titre). », définition dans le glossaire\« name=’mot$gloss_id » ;

      La fonction est contenu_balises_acronym_abbr_span($chaine) : je ne détaille pas son code ici pour ne pas alourdir mon propos, il faut juste savoir qu’elle renvoie la chaîne contenu entre une balise (span, acronym, abbr)ouvrante et une fermante.

      J’ai tenté de la copier au début du fichier glossaire_fonctions.php, après le define() de la liste des accents (ligne 11). Après recompilation du couteau suisse, je ne peux plus accéder à mon site. J’ai réussi à y accéder à nouveau en sauvegardant puis en vidant le répertoire tmp.

      Ma question est : comment appeler cette fonction depuis glossaire_fonctions.php, si on ne peut pas y copier son code ?

    • La balise <code> fonctionne bien ici pourtant ...

      Est-ce que par hasard le lecteur tiens compte du jQuery ? Parce qu’il serait possible d’ajouter le title en jQuery plus facilement qu’en codant en dur... Tu te prives là de toute mise à jour future du plugin...

    • Tu as raison pour la balise <code>... Suis-je bête, je mettais des crochets à la place des chevrons...

      En ce qui concerne le jQuery, si on code l’apparition de l’attribut title associé à l’événement survol du mot du glossaire, alors nan, le lecteur vocal n’y aura pas accès (les mal ou non-voyants n’utilisant pas de souris). D’ailleurs, il est aussi possible que le javascript soit désactivé sur le navigateur... C’est pour ça que j’utilise le mode CSS pour la lame glossaire.

      Donc, il vaut bien mieux que le code avec l’attribut title soit déjà dans la page au chargement de celle-ci.

      Maintenant, pour ce qui est de la future mise à jour du plugin, effectivement c’est un problème...(à moins, à chaque mise à jour, de penser à remodifier le code...) Y aurait pas un moyen de surcharger la fonction cs_rempl_glossaire() ?

    • Finalement, j’ai réussi à copier ma fonction dans glossaire_fonctions.php et à recompiler le couteau suisse sans le problème décrit précédemment et j’obtiens bien ce que je cherchais.

      L’inconvénient effectivement, c’est en cas de mise à jour du plugin. J’effectuerai une sauvegarde préalable de mes modifs et s’il faut à nouveau les remettre, je le remettrai...

      Le seul problème qui subsiste, comme j’utilise aussi le plugin acronymes, qui repère mes acronymes et y applique une balise <abbr> est que mes balises <a> avec mon attribut title comme je le souhaite se trouvent encapsulées dans une balise <abbr>, ce qui fait que le lien n’est pas reconnu en tant que tel par la synthèse vocale (et à mon avis le code ne doit pas être valide avec le validateur W3C).
      Par exemple, pour un mot du glossaire comme « W3C », défini également en tant qu’acronyme (dans une table sigles_acronymes, fournie par le plugin acronymes), j’obtiens le code suivant :

      <abbr lang="en" title="World Wide Web consortium">
      <a class="cs_glossaire" name="mot16_4" title="W3C, définition dans le glossaire" href="./?+-W3C-+">
      <span class="gl_mot">W3C</span>
      <span class="gl_dl">
      <span class="gl_dt">W3C</span>
      <span class="gl_dd">
      </span>
      </a>
      </abbr>

      Il semble clair qu’il y a un ordre à respecter dans l’application des fonctions du plugin glossaire et de celles de l’acronyme, mais je ne sais pas lequel ni où je pourrais modifier l’ordre de traitement du texte des articles par ces plugins.

      Le code souhaité est :

      <a class="cs_glossaire" name="mot16_4" title="W3C, définition dans le glossaire" href="./?+-W3C-+">
      <span class="gl_mot"><abbr lang="en" title="World Wide Web consortium">W3C</abbr></span>
      <span class="gl_dl">
      <span class="gl_dt">W3C</span>
      <span class="gl_dd">
      </span>
      </a>

      Mais je ne sais pas où se trouve le code qui fait que spip applique automatiquement ces filtres (ceux du plugin glossaire + ceux du plugin acronymes), il faudrait changer l’ordre d’application. Si quelqu’un peut me donner une piste...

    • Le Glossaire pourrait totalement ignorer les abbr  : je ne vois pas l’intérêt d’avoir le même mot dans 2 tables différentes : http://zone.spip.org/trac/spip-zone...

      Pour jQuery, je ne pensais pas au survol de la souris, mais à la fin du chargement de la page.

      Une solution était aussi de créer une lame perso branchée sur le pipeline post_propre et qui reprendrait les syntaxes en les modifiant comme tu le souhaites en php.

      Bref, j’ai publié une correction sur le CS pour permettre un branchement sur le calcul des attributs : http://zone.spip.org/trac/spip-zone...

      Fonction fournie :

      function glossaire_attributs_lien_dist($id_mot, $lien, $titre, $les_titres) {
      	return "href='$lien'";
      }

      Exemple de fonction surchargée à placer dans config/mes_options.php par exemple :

      function glossaire_attributs_lien($id_mot, $lien, $titre, $les_titres) {
      	return "href='$lien' title=\"" . attribut_html($les_titres[0]). '"';
      }

      Travailler sur le code fourni par le plugin est toujours une très mauvaise idée à cause des mises à jour régulières...

    • Super pour la fonction fournie ! ça fonctionne à merveille, ma surcharge est OK (dans mes_fonctions.php). J’y ai mis :

      function glossaire_attributs_lien($id_mot, $lien, $titre, $les_titres) {
              return "href='$lien' title=\"" . contenu_balises_acronym_abbr_span($les_titres[0]) . ', définition dans le glossaire"';
      }

      Merci pour la réactivité sur le dev... Ceci me permet d’éviter de toucher au code du plugin !!

      Sauf que, dans mon cas particulier, comme la balise abbr est maintenant échappée, mes abréviations (reconnues et balisées correctement par le plugin acronymes), ne sont plus reconnues par la lame glossaire...
      Il a fallu donc que j’enlève la balise abbr des balises html échappées (et du coup modifier à nouveau glossaire_fonctions.php :-( ). A noter que je n’emploie pas la balise acronym car elle est obsolète en html5, donc mes abréviations/sigles/acronymes sont codées systématiquement avec la balise abbr

      « je ne vois pas l’intérêt d’avoir le même mot dans 2 tables différentes... »

      L’intérêt d’avoir les 2 est que la première (table des acronymes) permet de clarifier l’abréviation en donnant sa signification (ce n’est pas forcément sa définition : ex W3C = « World Wide Web Consortium »), et que la 2e (définition du glossaire) permet de donner une définition plus ou moins complète (Ex : W3C = « Abréviation de World Wide Web Consortium. C’est un organisme de normalisation chargé de promouvoir la compatibilité des technologies web. Il émet des recommandations qui ont valeur de standards internationaux et décrit les spécifications des différentes technologies utilisées sur le web. »). On comprend bien que ce texte est trop long pour figurer dans un attribut title. D’ailleurs sémantiquement, ce serait moins correct à mon sens.
      Ensuite, l’intérêt est que pour les synthèses vocales, la clarification de l’abréviation est disponible immédiatement, et la définition complète reste accessible par l’activation du lien. Malheureusement, comme je le précisait dans mon post précédent, l’encapsulation de <a> dans <abbr>, fait que la synthèse vocale ne « voit » pas la balise <a>, donc n’annonce pas la présence du lien, privant ainsi l’utilisateur de l’accès à la définition complète du glossaire.

      Je me suis documenté un peu sur la façon de créer un plugin, les pipelines... et j’ai ainsi pu constater que le plugin acronymes (dans son fichier plugin.xml) se branche sur le pipepline post_typo.
      Pour la lame glossaire il semble que le dossier /tmp/couteau_suisse, contient un fichier mes_options avec le code $GLOBALS['table_des_traitements']['TEXTE'][]='cs_nettoie(cs_glossaire(propre(%s,$connect)))'; ce qui laisse supposer que le traitement par le glossaire intervient après « propre ».

      Je ne connais malheureusement pas encore assez spip du point de vue des traitement automatiques et des plugins pour comprendre ce qu’il faut faire pour faire en sorte que l’encapsulation qui pose problème soit inversée, mais je crois savoir qu’il faut changer l’ordre de traitement du plugin acronyme par rapport à la lame du glossaire, simplement je ne sais pas où agir : post_propre, post_typo, pipelines, tables_des_traitements, je dois encore me documenter là-dessus...

    • Mais pourquoi vx-tu absolument que 2 fenêtres (abbr et glossaire) se superposent pour dire la même chose !?

    • Tout d’abord, abbr et glossaire ne disent pas exactement la même chose dans la mesure où la définition du glossaire est complète comme je l’ai indiqué dans mon précédent post avec l’exemple « W3C ». J’ai plein d’autres exemples comme ceux-là (voir les copies d’écran jointes pour un autre exemple)

      Je souhaitais simplement permettre l’accès à la définition complète à travers le lien, ce qui n’est pas possible si la balise <a> est à l’intérieur d’une balise <abbr> : dans ce cas, la synthèse vocale ignore le lien et lit l’attribut title de la balise <abbr>, l’utilisateur (non voyant) n’étant pas informé qu’il existe un lien vers la définition complète du glossaire, mais au moins il connaît la signification de chaque lettre de l’abréviation.

      Je pensais donc qu’il suffisait d’inverser l’encapsulation (mettre<a> dans <abbr>), ce que je viens de tester sur une copie du code de la page. Mais là, le résultat est exactement inverse, c’est-à-dire que la synthèse vocale « voit » le lien puisqu’elle indique « lien W3C, définition dans le glossaire », par contre elle ne lit pas l’attribut title de la balise <abbr> qui suit, ce qui fait que l’utilisateur non-voyant ne peut pas savoir la signification de chaque lettre de l’abréviation sans activer le lien par la touche entrée, donc en changeant de page...

      J’aurai voulu que la synthèse vocale lise les 2 (l’un après l’autre) : à savoir le lien s’il souhaite une définition complète et pendant la lecture de l’intitulé du lien, sa clarification, ce qui donnerait ici « lien Word Wide Web Consortium, définition dans le glossaire » au lieu de "lien W3C, définition dans le glossaire. Mais d’après mes derniers tests, je ne peux pas arriver à avoir ce comportement.

      Si on se pose la question du pourquoi j’utilise le plugin acronymes à côté de la lame glossaire, c’est pour satisfaire autant le côté sémantique et le côté pratique :
      -  le côté sémantique car une abréviation, un sigle, un acronyme se doit d’être encadré au moins une fois par une balise <abbr title="clarification de l'abréviation">
      -  le côté pratique (pas seulement pour les voyants !), si la clarification directe n’est pas suffisante pour la compréhension, un lien vers une définition plus complète est proposé

      Il me reste donc 2 choix possibles :

      1) Soit je ne touche pas à la lame du glossaire et dans ce cas, l’échappement des balises <abbr> dans les fonctions du glossaire font que toutes mes abréviations sont clarifiées (accessibles aux voyants comme aux non-voyants), mais il n’ y a pas de lien vers une définition plus complète (cette dernière est inaccessible pour tout le monde) : voir la capture d’écran test_acronymes+glossaire(abbr-echappees).png

      Dans ce cas, le seul moyen d’accéder à la définition complète du mot dans le glossaire se fait par le squelette glossaire.html en passant par le moteur de recherche du site et en cliquant sur le lien du mot-clé dans la page des résultats.

      2) Soit j’empêche la lame du glossaire d’échapper les balises <abbr>, dans ce cas, les non-voyants ont accès à la clarification de l’abréviation, mais pas au lien vers la définition complète, tandis que les voyants ont accès direct visuellement à la définition complète (donc à la clarification de l’abréviation) sans changer de page... _ Voir la capture d’écran test_acronymes+glossaire(abbr-non-echappees).png

      La solution n°2 est plus proche de ce que je recherche, mais voilà, il faut toucher au plugin...

      Ceci ne concerne que les mots du glossaire qui sont également des abréviations, ce qui n’est pas le cas de tous les mots du glossaire : par exemple les landmarks roles sont définis dans le glossaire, mais pas dans le plugin acronymes. Dans ce cas, il n’y a pas d’encapsulation de balises <a> dans balises <abbr>, et donc le lien vers le glossaire est accessible à tous (directement sur la même page au survol de la souris pour les voyants, indirectement par l’appui de la touche entrée dès que la synthèse vocale prononce « Lien landadmarks roles, définition dans le glossaire », mais en changeant de page.)

    • Au final, je vais retenir la solution n°1, car elle me permet de ne pas modifier le code de glossaire_fonctions.php, ce qui me protège des futures mises à jour du plugin, sachant que dans ma page d’aide sur l’accessibilité du site, j’explique comment les utilisateurs peuvent avoir accès (même si c’est indirectement) à la définition plus complète du terme en abréviation dans le glossaire.

      Ceci est le meilleur compromis, je pense.

      Merci pour les conseils prodigués et la modif sur la lame glossaire pour l’attribut title.

      Quand tout sera en place et que j’aurais un peu de temps, je rédigerai un article expliquant l’utilisation conjointe des plugins acronymes et glossaire afin de respecter les exigences des principaux référentiels d’accessibilité avec un site sous spip...

    • Merci pour toutes ces explications précises, le sujet est intéressant. Je continue de penser qu’un terme ne doit faire partie que d’une seule table, histoire d’éviter une confusion des genres : au webmestre de choisir s’il veut une simple abréviation ou un vraie définition...

      Il reste une 3e solution : pouvoir surharger la balise utilisée par la lame du CS, et donc abandonner la balise <a/> du glossaire interne au profit de <abbr/> par exemple. On perd dans ce cas le lien pointant vers le squelette glossaire.html, mais est-il indispensable finalement ? Que fera la synthèse vocale dans un pareil cas ? Serait-ce une piste exploitable ?

      Exemple du genre :

      <abbr title="Architrave" name="mot1_0" class="cs_glossaire"><span class="gl_mot">architrave</span><span class="gl_dl">
      	<span class="gl_dt">Architrave</span>
      	<span class="gl_dd">Le texte explicatif complet du mot !</span>
      </span></abbr>

      N’hésite pas à nous tenir au courant de tes travaux.

    • Le problème est ici au niveau de la sémantique : une balise abbr ne doit contenir qu’un terme abrégé, avec comme attribut title l’expansion de l’abréviation et rien d’autre.
      Selon la spécification du W3C (http://www.w3.org/TR/html5/the-abbr-element.html#the-abbr-element) :

      The abbr element represents an abbreviation or acronym, optionally with its expansion. The title attribute may be used to provide an expansion of the abbreviation. The attribute, if specified, must contain an expansion of the abbreviation, and nothing else.

      Il ne faut donc pas confondre expansion du terme abrégé et définition du terme : la première désigne la signification de chaque lettre composant un acronyme (ex : HTML pour « Hyper Text Makrkup Language ») ou la signification de l’abréviation (ex : etc. pour « et caetera ») et la 2e donne une explication par une définition du terme.

      Ensuite, toutes les abréviations ne sont pas forcément à associer à une définition au sens du glossaire si l’expansion de l’abréviation suffit à la compréhension du terme. C’est ensuite au rédacteur de décider s’il doit apporter des informations complémentaires à l’expansion pour faciliter la compréhension du terme : par exemple, pour HTML, l’expansion « Hyper Text Makrkup Language » n’est pas suffisante pour expliquer ce qu’est et à quoi sert HTML. Dans ce cas il faudrait y associer une définition comme celle-ci : « Abréviation de HyperText Markup Language. C’est un langage de balisage utilisé pour écrire les pages Web : il définit la structure et le contenu de la page. »

      D’après la spécification W3C, l’attribut title de la balise <abbr> ne doit pas contenir autre chose que l’expansion « HyperText Markup Language » : pour ma part, c’est pour cela que ce terme fait partie de 2 tables (acronymes : pour expliciter l’expansion, glossaire : pour expliciter la définition plus complète).

      Avec la lame glossaire du CS actuelle, à condition d’utiliser conjointement le plugin acronymes, ce qui est mon cas, on ne voit que l’expansion (elle est prononcée par la synthèse vocale pour les non-voyants), pour accéder à la définition, il faut se rendre dans le glossaire (il faut un lien vers ce glossaire en haut de chaque page pour y faciliter l’accès). En effet la balise abbr étant échappée par la lame glossaire du CS, « l’effet glossaire » ne s’applique pas, c’est « l’effet plugin acronymes » qui l’emporte.

      Par contre, il existe beaucoup de termes à définir qui ne sont pas des abréviations (architrave, référentiel d’accessibilité,...). Dans ce cas, « l’effet glossaire » l’emporte (puisqu’il n’y a pas d’entrée correspondante dans la table des acronymes) : La lame glossaire du CS actuelle insère un lien vers la définition du glossaire (accessible à tous) et affiche la définition (accessible aux voyants seuls) dans une petite fenêtre au survol souris, ce qui reste un bon compromis puisque la définition est accessible à tous d’une manière ou d’une autre.

      Ce serait une erreur de sémantique d’encadrer le terme « architrave » par une balise abbr alors que ce terme n’est pas une abréviation.

      Il est vrai que le glossaire peut gérer toutes les définitions (des terme abrégés, comme des termes normaux), mais ne peut pas actuellement faire la distinction sémantique entre une abréviation et un terme « normal ». Pour gérer les acronymes, il faudrait peut-être créer un sous-groupe de mots « abréviations » au sein du groupe de mots « Glossaire ». Ensuite il y a du code à retoucher pour faire en sorte de savoir si un terme appartient au sous-groupe « abréviations » : si c’est le cas, alors on indiquerait le code suivant (par exemple avec le terme W3C) :

      <a class="cs_glossaire" name="mot16_4" title="W3C, définition dans le glossaire" href="./?+-W3C-+">
      <span class="gl_mot"><abbr lang="en" title="World Wide Web consortium">W3C</abbr></span>
      <span class="gl_dl">
      <span class="gl_dt">W3C</span>
      <span class="gl_dd">
      Abréviation de World Wide Web Consortium. C’est un organisme de normalisation chargé de promouvoir la compatibilité des technologies web. Il émet des recommandations qui ont valeur de standards internationaux et décrit les spécifications des différentes technologies utilisées sur le web.
      </span>
      </a>

      A noter que dans ce cas, selon le paramétrage du lecteur d’écran (JAWS 10) pour la lecture des liens, on obtient la lecture suivante :
      -  Paramétrage lecture du titre de lien (attribut title) :

      « Lien W3C, définition dans le glossaire »


      -  Paramétrage lecture de l’intitulé du lien (texte entre les balises <a> et </a>) :

      « Lien World Wide Web consortium »

      (ce qui est après le mot « Lien » est prononcé en anglais à cause de l’attribut lang de la balise <abbr>) si le lecteur d’écran est paramétré pour développer les abréviations, ou sinon

      « W3C »

      (prononcé en anglais, ce qui peut être un problème pour sa compréhension par les non-anglophones, voir post scriptum en fin de commentaire).

      Donc ce code foncionne super bien, c’est pourquoi je voulais arriver à cela ! (voir le commentaire #comment456001 sur cette page). Ce serait l’idéal.

      Si le terme n’appartient pas au sous-groupe « abréviations », ce serait le code suivant (par exemple avec le terme référentiel d’accessibilité) :

      <a class="cs_glossaire" name="mot16_4" title="référentiel d'accessibilité, définition dans le glossaire" href="./?+-Referentiel-d-accessibilite-+">
      <span class="gl_mot">référentiel d'accessibilité</span>
      <span class="gl_dl">
      <span class="gl_dt">référentiel d'accessibilité</span>
      <span class="gl_dd">La définition...
      </span>
      </a>

      Ceci supposerait que pour un mot du sous-groupe « abréviations » dans le glossaire, dans l’interface privée de spip, le champ de saisie « descriptif rapide » contiennent l’expansion seule, tandis que le champ « Texte explicatif » contiendra en plus de l’expansion, la définition complète.

      En attendant, j’utilise le plugin acronyme en association avec le glossaire, ce qui répond à mes besoins, mais m’oblige effectivement à avoir le terme dans 2 tables différentes, et présente l’inconvénient de la prédominance de l’effet acronyme sur l’effet glossaire (pour les termes abrégés seulement) comme j’ai précisé plus haut.

      D’autre part, en ce qui concerne la lecture vocale du code que tu proposes, à savoir :

      <abbr title="Architrave" name="mot1_0" class="cs_glossaire"><span class="gl_mot">architrave</span><span class="gl_dl">
              <span class="gl_dt">Architrave</span>
              <span class="gl_dd">Le texte explicatif complet du mot !</span>
      </span></abbr>

      je viens de tester avec le lecteur d’écran JAWS 10 :
      -  Si celui-ci est paramétré pour développer les abréviations, alors c’est la valeur de l’attribut title qui sera prononcé seule, soit

      « architrave »

      . Dans ce cas, il n’y a aucun accès possible à la définition.
      -  Si JAWS est paramétré pour ne pas développer les abréviations, alors c’est tout le contenu situé entre les balises <abbr> et </abbr> qui sera lu, soit

      « architrave Architrave Le texte explicatif complet du mot ! »

      . Dans ce cas, les 3 textes entre les balises span sont prononcés l’un après l’autre (d’où la répétition du mot architrave).

      On constate donc qu’outre le problème de sémantique déjà signalé, cette solution n’est pas satisfaisante pour un lecteur vocal.

      Enfin, afin que le respect de la sémantique soit total, le terme à définir devrait être encapsulé dans une balise <dfn> selon les modalités décrites sur la page http://www.w3.org/wiki/HTML/Elements/dfn et plus précisément sur http://www.w3.org/TR/html5/the-dfn-element.html#the-dfn-element, ceci afin d’indiquer que le terme en question est défini quelque part : reste à voir où (il semble que ce soit le noeud parent immédiat de l’élément <dfn>), je n’ai pas encore approfondi cette question, il me faut être sûr que j’ai bien assimilé la spécification du W3C, ce qui est loin d’être sûr, je viens juste de la découvrir...

      Pour l’instant donc, en l’état actuel de mes connaissances, je pense que la solution actuelle (association des plugins acronymes + lame glossaire du CS) me semble le meilleur compromis pour une bonne accessibilité ; sinon, pour éviter les inconvénients signalés (terme abrégé dans 2 tables, échappement de balise <abbr> par la lame), il faudrait retoucher le code de la lame glossaire afin d’obtenir le codage idéal (voir question du sous-groupe « abréviations », abordée plus haut). Si dans l’avenir je trouve mieux, j’en ferai part sur ce forum.

      PS : pour les abréviations d’origine étrangère, il faut tenir compte de ce qui est dit sur http://www.webaccessibilite.fr/abreviations-sigles-et-acronymes-2008-03-26.php#etr ; Pour les mots du sous-groupe « abréviations », la solution préconisée pourrait être mise en place en ajoutant une balise <multi> encadrant la valeur du champ de saisie « descriptif rapide » afin de préciser d’une part la langue de prononciation de l’expansion, et d’autre part une autre balise <multi> dans le champ « titre » du mot si la langue de prononciation de l’abréviation elle-même doit être différente de la langue principale du site.

    • Bon, abandonnons alors la surcharge de la balise <a>.

      Suite à cette très longue discussion, je propose que la lame du CS sont configurable au niveau des balises <abbr> et <acronym>. Par défaut, elle les ignore.

      Si l’utilisateur veut quand même les voir traitées par le glossaire, alors la lame s’occupe de la mise en ordre correct des balises.

      Dernier commit : http://zone.spip.org/trac/spip-zone.... Que donnent tes tests dans ce cas ?

    • Alors là, pas mal !

      En configurant la lame glossaire avec la case ignorer les balises <acronym> et <abbr> décochée, on obtient bien le code que je souhaitais.

      Par exemple pour W3C :

      <a class="cs_glossaire" name="mot16_4" title="W3C, définition dans le glossaire" href="./?+-W3C-+">
      <span class="gl_mot"><abbr lang="en" title="World Wide Web consortium">W3C</abbr></span>
      <span class="gl_dl">
      <span class="gl_dt">W3C</span>
      <span class="gl_dd">
      Abréviation de World Wide Web Consortium. C’est un organisme de normalisation chargé de promouvoir la compatibilité des technologies web. Il émet des recommandations qui ont valeur de standards internationaux et décrit les spécifications des différentes technologies utilisées sur le web.
      </span>
      </a>

      Le seul problème résiduel réside dans la gestion des liens par le lecteur d’écran (je n’ai testé que JAWS 10) ; je rappelle que celui-ci peut être paramétré pour lire le titre de lien (attribut title de la balise <a>), ou bien l’intitulé du lien (contenu entre les balises <a> et </a>), ou encore le plus long des 2 (titre ou intitulé).

      Si le lecteur est paramétré pour lire l’intitulé du lien, comme celui-ci contient une balise <abbr>, alors l’expansion sera prononcée par le lecteur (si le lecteur est paramétré pour développer les abréviations)

      « Lien World Wide Web consortium » (prononciation anglaise)

      , donc la clarification est accessible, tout comme la définition complète si on active le lien.

      Si c’est l’attribut title du lien qui est lu :

      « Lien W3C, définition dans le glossaire » (prononciation française)

      Le problème ici, est que l’expansion n’est plus accessible directement.

      Il faut donc que l’attribut title contienne l’expansion soit
      <a class="cs_glossaire" name="mot16_4" title="World Wide Web consortium, définition dans le glossaire" href="./?+-W3C-+">.....</a>

      Ce qui donnera à la lecture :

      « Lien World Wide Web consortium, définition dans le glossaire » (prononciation française)

      Pour arriver à ce résultat, il suffit de modifier la fonction glossaire_attributs_lien (à placer dans mes_fonctions.php qui surcharge la nouvelle fonction glossaire_attributs_lien_dist committée il y a quelques jours (désolé pour la mise en forme du code, mais je ne sais pas comment faire pour avoir la coloration syntaxique sur ce forum) :

      function glossaire_attributs_lien($id_mot, $lien, $titre, $les_titres) {
      	return "href='$lien' title=\"" . expansion_abbr_acronym_chercher(contenu_balises_acronym_abbr_span($les_titres[0])) . ', définition dans le glossaire"';
      }

      et d’ajouter la fonction expansion_abbr_acronym_chercher() :

      function expansion_abbr_acronym_chercher($expression)
      {
      	$expansion = $expression; 
      	$liste=Forms_liste_tables('acronymes_sigles');
      	if (count($liste))
      	{
      		include_spip('forms_fonctions');
      		$id_form = intval(reset($liste));
      	  	$res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND statut='publie'");
      	  	while ($row = spip_fetch_array($res))
      		{
      	  		$accro=str_replace(".","",forms_calcule_les_valeurs('forms_donnees_champs', $row['id_donnee'], 'ligne_1', $id_form,' ', true));
      			if (strlen($accro) && $accro == $expression)
      			{
      				$expansion = forms_calcule_les_valeurs('forms_donnees_champs', $row['id_donnee'], 'texte_1', $id_form,' ', true);
      			}
      	  	}
      	}
      	return $expansion;
      }

      Euh, je pourrais peut-être poster un code plus clair, avec les commentaires qui vont avec si on me dit comment faire pour avoir une mise en forme propre, la balise <code> ou <cadre> n’étant pas satisfaisantes en l’état.

    • Alors pour le code coloré, c’est : <code class="php"> ou <cadre class="php">.

      Pour ce qui est de ton accès en BDD, serait-il possible de passer par un fond pour profiter du cache et éviter la connexion systématique, en utilisant la fonction SPIP récuperer_fond() directement dans la fonction glossaire_attributs_lien(). Pourrait-on donc simplifier tout cela avec un fond HTML ?

    • Avec la coloration syntaxique voici un code + lisible :

      /************************************
      surcharge de la fonction glossaire_attributs_lien_dist()
      de la lame glossaire du couteau suisse.
      Ceci permet d'intégrer un attribut title personnalisé
      dans la balise <a> d'un mot du glossaire
      ************************************/
      function glossaire_attributs_lien($id_mot, $lien, $titre, $les_titres) {
      return "href='$lien' title=\"" . expansion_abbr_acronym_chercher( contenu_balises_acronym_abbr_span($les_titres[0]) ) . ', définition dans le glossaire"'; // le glossaire n'échappe pas les balises span (si le titre du mot est en langue étrangère, les balises <multi>[en] sont transformées en <span lang="en">) => Ces balises ne doivent pas se retrouver dans la valeur de l'attribut title
      
      /* Le problème qui subsiste (pas de solution trouvée) est que "définition dans le glossaire" étant prononcé dans la langue du site (ici fr),
      	alors l'expansion également, ce qui pour une expansion de signification étrangère qui serait donc mal prononcée peut rendre difficile sa compréhension.
      	Mais il reste néanmoins la possibilité de cliquer sur le lien pour avoir accès à la définition complète du mot dans le glossaire (l'expansion sera là prononcée dans la bonne langue) */
      }

      et pour chercher l’expansion de l’abréviation :

      /***************************
      La fonction suivante permet, depuis la table "acronymes_sigles" installée avec le plugin "acronymes", de récupérer l'expansion d'une abréviation, afin de l'afficher comme valeur de l'attribut title dans la fonction glossaire_attributs_lien() qui surcharge la fonction glossaire_attributs_lien_dist() de la lame glossaire du couteau suisse. Ceci permet de donner un accès direct à l'expansion d'une abréviation quelle que soit la configuration du lecteur d'écran (lecture du titre de lien ou de l'intitulé du lien)
      ************************/
      $expansion = $expression; // initialisation au cas où l'expression n'est pas une abréviation, c'est l'expression elle-même qui sera renvoyée
      $liste=Forms_liste_tables('acronymes_sigles');
      if (count($liste))
      {
        include_spip('forms_fonctions');
        $id_form = intval(reset($liste));
        $res = spip_query("SELECT id_donnee FROM spip_forms_donnees WHERE id_form="._q($id_form)." AND statut='publie'");
        while ($row = spip_fetch_array($res))
        {
          $accro = str_replace( ".","",forms_calcule_les_valeurs( 'forms_donnees_champs', $row['id_donnee'], 'ligne_1', $id_form,' ', true ) );
          if (strlen($accro) && $accro == $expression)
          {
            $expansion = forms_calcule_les_valeurs('forms_donnees_champs', $row['id_donnee'], 'texte_1', $id_form,' ', true);
          }
        }
      }

      pour cette dernière fonction, j’ai repris une partie du code de la fonction acronymes_ajouter() dans le fichier acronymes_filtre.php du plugin acronymes.

      Par contre, pour répondre à ta question sur la mise en cache, je ne connais pas suffisamment spip à ce jour pour savoir comment je peux utiliser la fonction recuperer_fonc().
      Cependant, dans les fichiers du plugin acronymes, j’ai trouvé dans le dossier modeles un fichier sigles.html qui contient des boucles pour récupérer les données voulues (et dont on pourrait s’inspirer) :

      <BOUCLE_acronymes_sigles(FORMS){type_form=acronymes_sigles}>
      <B_Sigles>
      <dl>
      <BOUCLE_Sigles(FORMS_DONNEES){id_form}{tri_donnee ligne_1}>
      <dt>#LESVALEURS{ligne_1,' '}</dt>
      <dd>#LESVALEURS{texte_1,' '}</dd>
      </BOUCLE_Sigles>
      </dl>
      </B_Sigles>
      <p><:acronymessigles:aucune_reponse:></p>
      <//B_Sigles>
      </BOUCLE_acronymes_sigles>
      <p><:acronymessigles:aucune_reponse:></p>
      <//B_acronymes_sigles>

      Je sais que le champ texte_1 contient l’expansion à récupérer, mais je ne vois pas comment utiliser recuperer_fond() dans ma fonction glossaire_attributs_lien(), comme je t’ai dit je ne connais pas encore assez bien spip...

    • Sans PHP supplémentaire, peut-être un truc du genre :

      function glossaire_attributs_lien($id_mot, $lien, $titre, $les_titres) {
      	return recuperer_fond('fonds/attribut_abbr', array(
      		'mot'=>$les_titres[0],
      		'lien'=>$lien,
      	));
      }

      avec fonds/attribut_abbr.html :

      [(#SET{mot,[(#ENV**{mot}|textebrut)]})]
      [href="(#ENV**{lien})"]<BOUCLE_acronymes_sigles(FORMS){type_form=acronymes_sigles}><B_Sigles> title="<BOUCLE_Sigles(FORMS_DONNEES){id_form}{tri_donnee ligne_1}{recherche_donnee #GET{mot}}{0,1}>[(#LESVALEURS**{ligne_1, ' '}|attribut_html)[ : (#LESVALEURS**{texte_1, ' '}|attribut_html)]]</BOUCLE_Sigles>"</B_Sigles>
      </BOUCLE_acronymes_sigles>

      Mais le critère recherche_donnee exécute un LIKE... C’est peut-être pas la meilleure chose...

    • ça dépend si c’est un LIKE ’titre_mot’ ou avec un joker ’titre_mot%’ ou ’%titre_mot%’.
      Dans le premier cas, on est sûr de renvoyer la donnée correspondant au mot exact. C’est ce qu’il faudrait pour être sûr de ne pas avoir de problème

      Sinon, ta proposition de code marche parfaitement, je l’ai testée avec succès. Je retirerai juste (#LESVALEURS**{ligne_1, ' '}|attribut_html) : afin que l’attribut title ne contienne que l’expansion seule (car cet attribut ne doit rien contenir d’autre selon la spécification w3C).

      Ce qui donnerai :

      [(#SET{mot,[(#ENV**{mot}|textebrut)]})]
      [href="(#ENV**{lien})"]
      <BOUCLE_acronymes_sigles(FORMS){type_form=acronymes_sigles}>
      <B_Sigles> 
      title="<BOUCLE_Sigles(FORMS_DONNEES){id_form}{tri_donnee ligne_1}{recherche_donnee #GET{mot}}{0,1}>[(#LESVALEURS**{texte_1, ' '}|attribut_html), Définition dans le glossaire]</BOUCLE_Sigles>"
      </B_Sigles>
      </BOUCLE_acronymes_sigles>

      Ici, le class=« php » sur la balise <cadre> ne me donne pas la même coloration syntaxique que toi... Une autre class à indiquer ??

      D’autre part, je viens seulement maintenant de le remarquer, mais cela n’a rien à voir avec le code que tu as proposé dans ton dernier post, l’effet glossaire ne s’applique pas sur les abréviations dont le titre dans le glossaire est encadré par <multi>[en]. Dans ce cas l’effet acronymes l’emporte. Aurais-tu une explication ?

    • Oups...
      Je n’étais pas bien réveillé : selon la spécification W3C c’est l’attribut title de la balise abbr qui doit contenir seulement l’expansion et pas celui de la balise a.
      Donc on peut mettre autre chose que l’expansion elle-même dans la valeur de l’attribut title de la balise a : le bon usage (accessibilité) de cet attribut est de reprendre l’intitulé du lien en y ajoutant des infos complémentaires, comme par exemple la destination + explicite du lien (ici « Définition dans le glossaire »). On peut donc y mettre aussi (#LESVALEURS**{ligne_1, ' '}|attribut_html) : devant si on veut.

      Le problème qui restera à solutionner aussi (si on peut trouver un moyen) c’est le problème de prononciation de la valeur de l’attribut s’il contient à la fois une expansion anglaise, et la destination du lien en français : par exemple « World Wide Web Consortium, Définition dans le glossaire » sera prononcé entièrement en français (ou alors entièrement en anglais si on a un attribut lang="en" défini sur la balise <a>), mais ça j’en reparlerai peut-être plus tard... C’est un détail, on a déjà super avancé.

    • Pour le code coloré, c’est : <code class="lelangagequejeveux"> ou <cadre class="lelangagequejeveux">.

      Voici la liste des langages disponibles : http://zone.spip.org/trac/spip-zone...

    • OK.

      En ce qui concerne le fait que les mots du glossaire dont le titre est encadré par des balises <multi>[en] ne sont pas traités par la lame du glossaire (pas de lien vers la définition dans le glossaire), tu sais pourquoi ?

    • Aucune idée a priori.

      Je viens de faire quelques tests du genre <multi>[en]architrave</multi> et tout semble fonctionner correctement. Peux-tu préciser le problème ?

    • Petite précision : ce problème ne semble se poser que pour les abréviations étrangères :

      Exemple JAWS (abréviation de Job Access With Speech)

      - une entrée dans la table sigles/acronymes :
      
      SIGLE = JAWS
      Descriptif = Job Access With Speech
      Langue = en
       une entrée dans le glossaire :
      
      Titre = <multi>[en]JAWS</multi>
      Descriptif = Abréviation de {<code><multi>[en]Job Access With Speech</multi></code>}. C'est un logiciel pour déficient visuel qui a pour fonction essentielle d'être un lecteur d'écran : il transforme un texte affiché sur un écran en un texte oral (par un système de synthèse vocale) ou un texte en braille.

      Dans ce cas, on obtient seulement l’effet « acronyme », pas l’effet « glossaire » (pas de lien vers la définition du glossaire).

      Si on supprime la balise <multi> du titre du mot dans le glossaire, alors les 2 effets « acronyme » et « glossaire » fonctionnent. Le problème est alors dans que dans la page de glossaire alphabétique (glossaire.html), le titre du mot JAWS dans sa balise <dl> n’est plus prononcée en anglais, mais en français...

      Il faudrait trouver le moyen de faire fonctionner les 2 effets, comme nous y sommes arrivés jusqu’ici, y compris lorsque l’abréviation est également un mot du glossaire avec un titre contenant la balise <multi>, mais j’ai beau chercher depuis quelques heures, je ne vois pas où il faut agir...

    • Eh effet, le multi du glossaire sera recherché seulement si le mot trouvé est aussi en multi...

      Pour préciser :
      -  Sur une page française, le titre du mot-clé devient : <span lang="en">JAWS</span> et le mot JAWS seul dans ce texte français n’est donc pas trouvé. En revanche, un <multi>[en]JAWS</multi> dans le texte sera correctement interprété par le glossaire.

    • Ce que tu dis est exact pour un mot du glossaire qui n’est pas une abréviation.

      Par exemple « landmarks roles » est un terme défini uniquement dans le glossaire (puisque ce n’est pas une abréviation), titré en <multi>. Si l’on saisit <multi>[en]landmarks roles</multi> dans le texte d’un article, alors c’est correctement interprété par le glossaire. Si l’on n’a pas la balise multi dans le texte, ce n’est pas reconnu, ce qui logique et adéquat.

      En revanche, si c’est une abréviation (c’est-à-dire en plus du glossaire, une entrée de la table sigles/acronymes), cela ne fonctionne pas : on a beau indiquer un <multi>[en]JAWS</multi> dans le texte d’un article, ce n’est pas correctement interprété par le glossaire, seul l’effet « acronymes » se produit (pourtant dans la config de la lame, la case « Ignorer les balises <abbr> et <acronym> » est bien décochée, ce qui permet à l’effet glossaire de fonctionner si le mot n’est pas titré en multi dans le glossaire). As-tu essayé avec le plugin « acronymes » et de renseigner le mot JAWS dans la table sigles/acronymes comme indiqué dans mon commentaire #456315 ? C’est la seule façon pour constater ce problème.

      C’est le même soucis qu’il y a quelques jours où l’effet « acronymes » l’emportait toujours sur l’effet « glossaire », mais avec le dernier commit que tu avais fait, en décochant la case « Ignorer les balises <abbr> et <acronym> » dans la config de la lame « glossaire interne », on peut avoir les 2 effets (si on laisse cochée la case « Ignorer les balises <abbr> et <acronym> » alors il n’y a pas d’effet « glossaire »).

      Dans ma config, cette case est bien décochée.
      Le problème semble donc se situer dans la prise en compte par le glossaire de la balise <abbr> lorsqu’elle encapsule un multi contenu dans le titre du mot (ou si un multi venant du titre du mot est encapsulé dans une abbr, je ne sais pas dans quel sens ça fonctionne...). La balise multi saisie dans le texte d’un article ne pose elle pas de problème.

      J’ai essayé de chercher dans la fonction glossaire_parse() et cs_rempl_glossaire(), mais je rame...

    • Eh oui, c’est qu’à mon avis, il faut un mot dans le glossaire du style :

          <multi>[en]JAWS</multi>/<abbr title='Job Access With Speech'>JAWS</abbr>

      que l’on peut coder en clair, ou bien sous une forme RegEx simplifiée :

          <multi>[en]JAWS</multi>/,<abbr[^>]*>JAWS</abbr>,

       

       

      Il ne faut jamais oublier que le glossaire intervient en fin de traitement sur les balises (en post_propre), et que par conséquent, le titre du mot recherché doit correspondre exactement dans le code à ce que peuvent produire SPIP ou d’autres plugins comme les acronymes, donc parfois, des expressions complexes. Un simple coup d’oeil dans le code source de la page HTML produite pourra te renseigner sur le titre de glossaire à donner à ton mot multilingue...

    • Nan, ce que tu proposes ne fonctionne pas, et tant mieux parce que pour le rédacteur, ce ne serait pas simple à gérer...

      J’ai finalement réussi à faire ce que je voulais :

      1) Modifier le plugin « acronymes », pour faire en sorte de respecter les recommandations sur http://www.webaccessibilite.fr/abreviations-sigles-et-acronymes-2008-03-26.php#etr . J’ai contacté à ce sujet l’auteur du plugin « acronymes » Cédric Morin à qui j’ai proposé de commiter mes modifs. Malheureusement, il m’a dit que ce plugin était figé et qu’il ne maintenait plus le plugin Forms&Tables (dont il dépend) pour la version 2 de spip. Donc, le fait d’avoir modifié le plugin acronymes n’aura pas de conséquence car a priori il ne sera plus mis à jour (dernière version la 0.13.0). Et surtout, mes modifs me permettent de préciser la langue de prononciation de l’abréviation elle-même (si elle est différente de la langue principale du site) et de prendre en compte la langue de prononciation de l’expansion d’autre part (qui malheureusement n’était pas prise en compte de façon effective par le filtre du plugin malgré le renseignement du champ « Langue » correspondant du formulaire de saisie).

      Grâce à cela, j’obtiens par exemple pour « W3C » :

      - Une entrée dans la table sigles/acronymes :
      
      SIGLE = W3C
      Descriptif = World Wide Web Consortium
      Langue = en

      Sans mes modifs sur le plugin acronymes, j’obtenais le code suivant :

      <abbr title="World Wide Web Consortium">W3C</abbr>

      Ce qui montre que le filtre acronymes ne prend pas en compte la langue renseignée dans la saisie. Une modification de ce filtre était donc nécessaire.

      Avec mes modifs, j’obtiens ce que je veux (qui est préconisé sur webaccessibilite.fr) :

      <abbr lang="en" title="World Wide Web Consortium"><span lang="fr">W3C</span></abbr>

      Donc si le lecteur d’écran est paramétré pour développer les abréviations, on entendra l’expansion « World Wide Web Consortium », prononcée en anglais, et sinon, on entendra « W3C » prononcé en français.
      Un utilisateur voyant voit les 2 d’un coup (« W3C » dans le texte, et « World Wide Web Consortium » dans l’info-bulle)

      Si je veux que tout soit en anglais, alors il faut mettre une balise <multi> dans le titre du sigle :

      - Une entrée dans la table sigles/acronymes :
      
      SIGLE = <multi>[en]W3C</multi>
      Descriptif = World Wide Web Consortium
      Langue = en

      et j’obtiens le code :

      <abbr lang="en" title="World Wide Web Consortium">W3C</abbr>

      Là, quelle que soit la config du lecteur d’écran, la prononciation sera anglaise. Cela ne change absolument rien visuellement par rapport au comportement précédent pour les voyants.

      2) Pour que l’effet glossaire fonctionne en plus de l’effet acronymes, avec les balises <a> et <abbr> dans le bon ordre, il a fallu ajouter 2 lignes de codes dans glossaire_fonctions.php (juste après la ligne 256, avant le return $texte) :

      if(strpos($texte, '</span></a></span></a')!==false) // si une balise span se trouve dans une balise abbr ou acronym
      		$texte = preg_replace(',(<a(bbr|cronym) [^>]+>)(<span [^>]+>)(<a [^>]+class=\'cs_glossaire\'><span class=\'gl_mot\'>)(.*?)</span>(<span class="gl_.*?</span>)</a></span></a\\2>,smS', '$4$1$3$5</span></a$2></span>$6</a>', $texte);

      Ceci permet de prendre en compte (si besoin) la balise <span> si elle se trouve dans une balise <abbr> pour remettre tout dans l’ordre.

      Peux-tu commiter cette modif sur la lame glossaire ?

      3) D’autre part, pour résoudre le problème évoqué précédemment sur le filtre recherche_donnee (effectivement, c’est un LIKE%%, ce qui pose de gros problèmes que je ne détaillerai pas ici) et afin d’être sûr que l’attribut title de la balise a soit le bon, voici le nouveau attribut_abbr.html :

      (Attention : afin que ça s’affiche correctement dans le forum, j’ai dû mettre des retours chariots et des espaces entre les pipes, ce qu’il ne faut pas faire en prod pour obtenir un code XHTML correct)

      [(#REM) génère les attributs title et lang de la balise <a> pour un mot du glossaire
      	
      - si la langue n'est pas définie dans le titre du mot (français par défaut), alors title contiendra la chaîne "MOT, Définition dans le glossaire" et lang contiendra "fr" (car un attribut lang vide ne serait pas valide)
      - si c'est une langue définie par un <multi>, alors title contiendra la chaîne "MOT" (même si cela n'apporte rien de plus que l'intitulé, un attribut vide ne serait pas valide) et lang contiendra la langue définie pour le mot pour une prononciation correcte
      
      Le mot est recherché par une expression régulière, ce qui permet de trouver le mot qu'il soit titré avec un <multi> ou pas
      ]
      [(#SET{mot,[(#ENV**{mot}|textebrut)]})]
      [(#SET{motif_mot,^#GET{mot}$|\]#GET{mot}<})]
      [href="(#ENV**{lien})"] 
      title="
      <B_Glossaire_title>
      	<BOUCLE_Glossaire_title(MOTS){titre == #GET{motif_mot}}{0,1}>
      		[(#TITRE* | trouve_attribut_lang | =={#LANG} | ?{[(#TITRE | contenu_balises_acronym_abbr_span) , <:def_glossaire:>], [(#TITRE | contenu_balises_acronym_abbr_span)]})]
      	</BOUCLE_Glossaire_title>
      </B_Glossaire_title>
      	#GET{mot}
      <//B_Glossaire_title>" 
      lang="
      <B_Glossaire_lang>
      	<BOUCLE_Glossaire_lang(MOTS){titre == #GET{motif_mot}}{0,1}>
      		[(#TITRE | extraire_balise{abbr} | ?{[(#TITRE | extraire_balise{abbr} | extraire_balise{span} | extraire_attribut{lang} | sinon{#LANG})], [(#TITRE | extraire_attribut{lang} | sinon{#LANG})]})]
      	</BOUCLE_Glossaire_lang>
      </B_Glossaire_lang>
      	#LANG
      <//B_Glossaire_lang>"

      Le raccourci <:def_glossaire:> correspond en français à « Définition dans le glossaire ».

      Donc, on ne recherche plus dans la table des sigles/acronymes : l’attribut title de la balise <a> est construit à partir du titre du mot dans le glossaire avant les traitements automatiques (#TITRE*), et l’attribut lang de la balise <a> est recherché après les traitements automatiques du filtre acronymes et du filtre glossaire (donc sur #TITRE).

      Ainsi, on est assuré de la correspondance parfaite (title et lang) avec ce qui est saisi dans le glossaire (ce qui paraît plus cohérent pour une balise <a> dont le href pointe sur la définition correspondante du glossaire, que ce soit une abréviation ou non).

      Je ne mets pas ici les filtres trouve_attribut_lang et contenu_balises_acronym_abbr_span (dans mes_fonctions.php) qu’il utilise pour ne pas être trop long, je ferai une description détaillée de tout cela avec le site que je prépare actuellement en local, avec des conseils pour les rédacteurs et les modifs à faire dans le plugin « acronymes ».

      Au niveau accessibilité, je ne peux pas faire mieux, mais c’est déjà très complet ainsi, l’association des 2 plugins acronymes + glossaire fonctionne à merveille...

      Je te demande à nouveau si tu peux commiter dans glossaire_fonctions.php la modif indiquée plus haut entre la ligne 256 et 257 dans la zone ? Ceci afin que ceux qui tiennent compte des recommandations au niveau accessibilité puissent en profiter (qu’ils utilisent ou pas le plugin « acronymes »)...

    Répondre à ce message

  • 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

    Répondre à ce 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

    Répondre à ce 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

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce 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>
    • [(#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
      [(#TITRE|replace{\s*/\s*,' / '})][ ((#DESCRIPTIF))]
      #TEXTE
      #PAGINATION
    • 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
      ok#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

    Répondre à ce 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.

    Répondre à ce 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

    Répondre à ce message

  • 1

    Bonsoir,

    C’est la 1re 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

    Répondre à ce message

  • 1

    Quelle incidence l’activation du plugin « glossaire » a sur la vitesse d’affichage des pages ?.
    Peut-on créer un glossaire spécifique pour une rubrique ?

    • 1. Plus le glossaire est important, plus le calcul de la page sera lent : le processus de recherche de mots dans le texte dépend du nombre de mots recherché

      2. On peut réserver un glossaire à certaines rubriques moyennant une réécriture du squelette puisque le glossaire agit actuellement comme un traitement des balises #TEXTE, #TITRE et #CHAPO. Ceci est une astuce qui n’est pas encore documentée je crois... Le but est d’ajouter [!glossaire] dans le texte avant qu’il soit examiné par le glossaire afin d’empêcher (dans certaines condition...) l’insertion des définitions.

      Pour un article, il faut remplacer : #TEXTE par :

      #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 BDD, 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’.

      A toi ensuite de mettre ta condition (SPIP>=2.0) sur la rubrique autour du code précédent : [(#ID_RUBRIQUE|match{'^(3|4|5)$'}|oui) blablabla]

      Bon, je t’avoue que tout ça c’est un peu lourd, mais c’est vraiment simplifiable si tu crées ton propre filtre_qui_fait_tout : #TEXTE*|ajouter_ou_non_le_glossaire_et_lancer_les_traitements{#ID_RUBRIQUE,TEXTE,articles}

      Cette fonction, je te laisse l’écire ;-)

    Répondre à ce message

  • Bonjour, j’ai un comportement étrange avec le glossaire :

    Sur toutes mes pages, le premier mot trouvé par le glossaire affiche bien la description, mais pas le titre.

    Les mots qui suivent marchent impec : #TITRE puis en dessous #TEXTE de mon mot clef....

    ex : http://www.trenditude.fr/Heidi-Klum-a-vos-pieds-Une-collection-de-chaussures-en-preparation.html

    Une idée ?

    Répondre à ce message

  • Ça y est ça marche en mettant « mes-options.php » dans le dossier « config ». Merci

    Répondre à ce message

  • 1

    Bon ça marche mais j’ai de serieux bugs dans l’admin de spip, quand j’enregistre un article j’ai une alerte :

    <script type='text/javascript'>if (parent.window){parent.window.document.location.replace("http://www. trucmachin.fr/bdc/site/ecrire/?exec=articles&id_article=2");} else {document.location.replace("http://www.trucmachin.fr/bdc/site/ecrire/?exec=articles&id_article=2");}</script>
    • Tu es sûr d’avoir tout mis à jour ? vidé les caches ? En désactivant le CS l’erreur disparait-elle ?

    Répondre à ce message

  • 1

    Bonjour et bravo pour cette super fonction bien utile, je n’arrive a supprimer les liens, je voudrais seulement qu’apparaisse la définition mais pas avoir de lien sur « spip.php ?mot1 ».

    J’ai mis

    <?php 
     function glossaire_generer_url($id_mot, $titre) { 
     return 'javascript:;'; 
    }       
    ?>

    dans mes_options.php dans mon dossier squelette
    j’ai spip 2.0.7

    Merci

    Répondre à ce message

  • 5

    Bonjour,

    j’ai installé le plugin couteau suisse sur l’un des sites que je développe, mais je rencontre un problème avec le glossaire.

    Toute l’installation est bien faite, le plugin marche, mais les mots contenus dans le glossaire disparaissent dans le texte d’un article.
    ex : texte original : un acoustique moelleux
    texte affiché : un moelleux.

    Dans l’espace privé, le mot « acoustique » s’affiche bien, mais impossible de trouver pourquoi en front, il ne s’affiche pas.

    Si quelqu’un a une solution, merci de la partagée.

    • As-tu résolu ton pb ? sinon un lien public est le bienvenu...

    • Bonjour,
      Je rencontre le même problème que vous évoquez (spip 2.7). Dans mon Glossaire, j’ai une liste de mots clés avec les pluriels. Avez-vous résolu ce problème ?
      Un grand merci

    • Je ne reproduis pas cette erreur.. Quel est le mot clé stocké en base ? Quelle est la phrase en question ? Un lien public disponible ?

    • Corinne Paumier

      Bonjour,
      le groupe de mots clés : Glossaire

      les mots clés :
      cheval/,chevaux ?,i
      acaricide/,acaricides ?,i
      Jeanne Augier
      SPA

      Les mots clés son également associés à un champ extra « dico » de liste :
      nom propre
      dico animalier
      sigle

      Exemple de phrase :
      Le cheval de Jeanne Augier venait de la SPA

      Ce qui s’affiche :
      Le de Jeanne Augier venait de la SPA

      Seul, le terme SPA affiche le descriptif et pas de réaction pour Jeanne Augier

      Je peux vous indiquer une url du site en développement en privé.

      Merci de votre réaction,
      Cordialement

    • Le problème est résolu. Une des personnes chargées de saisir les données avait fait des modifications sur le groupe de mots clés. Du coup, toutes les saisies antérieures au précédent réglage étaient tout bonnement ignorées. Les mots clés à nouveau saisis, tout fonctionne (pluriel, etc.)

      Donc, attention en cas de modification (ajout de champ extra lié au groupe Glossaire, par exemple). Les mots-clés du glossaire saisis antérieurement à toute modification peut entraîner le problème rencontré ici.

      En tout cas, merci à Patrice Vanneufville pour sa réactivité.

    Répondre à ce message

  • 8
    Garry Olivier

    Bonjour,

    je souhaitais savoir si le développement de ce plugin avait l’objet de validation accessibilité w3c, ou sinon si qq’un s’était penché sur la question.

    Car quand on désactive les css ou le javascript (selon le mode retenu), c’est assez illisible car le titre du mot et sa définition s’insère juste derrière le mot impacté et ce uniquement avec des balises span.

    merci

    • En principe les balises span en mode js sont toujours vides...

    • Bonjour,

      Le fait que les balises span soit vides en mode js génèrent des avertissements avec le module Tidy de la W3C dans firefox en XHTML 1.0 Stric. Dans glossaire_fonctions.php j’ai bien vu deux fonctions cs_retire_glossaire() et cs_rempl_glossaire() qui font un traitement sur les span, mais je n’arrive pas à trouver comment insérer un qql chose pour remplir ces deux span :

      • span class=« gl_js » title=« Titre du mot »> /span
      • span class=« gl_jst » title=« Texte du mot »> /span

      sans modifier le mécanisme du plugin et sans rien afficher dans les pages. C’est du fignolage, je le sais ! .

      Excellente la dernière mise à jour du glossaire avec la surcharge pour le caractère séparateur de mots.

    • Un espace entre <span> et </span> suffirait-il ? Facile ensuite de rajouter un style display:none...

    • Bonjour,
      Vu le message que retourne le module Tidy un espace ne serai peu être pas pris en compte :

      Aide de tidy - Tidy [23] : Élimination des <...> vides
      Cause :
      Une balise est vide ou bien elle contient juste des espaces. Les espaces sont ignorés, c'est pourquoi ils sont éliminés du HTML. Cette balise est probablement vide ou bien l'apparition du message est due à une erreur précédente. Tidy essaye de corriger les balises de cette page. Cela peut également être dû à une balise implicitement fermée par une autre qui la suit immédiatement. 
      Solution :
      Corrigez les erreurs survenues plus haut dans le code. Supprimez la balise vide si cela est nécessaire ou bien ajoutez du texte dedans. 

      Dans mon cas j’ai 0 erreur mais 2 avertissements par mot du glossaire détecté. Si je désactive la lame tout rentre dans l’ordre 0 erreur 0 avertissement.

      Peu être en codant l’espace en HTML &nbsp; ou autre.

      J’avais imaginé d’autres solutions mais je ne pense pas que cela soit bon, insertion d’une image transparente de 1px x 1px, mais dans un copier coller vers un logiciel comme Write ou word l’image va être visible, insérer un caractère de la même couleur que le fond de page, compliqué à mettre en œuvre et certainement le même résultat qu’avec une image. Utiliser une autre balise que <span> qui ne nécessite pas de contenu peu être.

      Cordialement

    • Je viens de faire un essai en local avec ceci :

      <span>&nbsp;</span>

      CA MARCHE ! pas d’avertissement de la part de Tidy.
      Reste a inclure ça dans glossaire_fonctions.php ou dans mes_options.php, là je sais pas faire, désolé.

      Cordialement.

    • C’est idiot ! À l’intérieurs d’un <a>, on ne peut pas mettre grand chose... Je peste contre cette règle anti-CSS ;-)

    • Cet espace insécable est à ajouter dans le fichier surchargeable fonds/glossaire_js.html. Dans outils/glossaire.css, il faut ajouter le style display:none.

      Je viens de modifier le CS : http://zone.spip.org/trac/spip-zone.... Le paquet zip sera disponible vers 19h. Si tu as SVN, tu peux mettre à jours dès maintenant.

    • Merci, le problème est résolu :

      Excellent, plus d’avertissement de la part de Tidy et aucune incidence dans l’affichage des textes.

      Cordialement.

    Répondre à ce message

  • 1

    Oui... Mais non. :) Ce n’est pas <html> ... </html> mais <xml>...</xml> en fait, désolé.

    Le plugin SyntaxHighlighter l’utilise différemment : http://www.touv.fr/spip.php?article141

    Répondre à ce message

  • 1

    Bonjour à tous,

    J’ai un soucis avec le plugin glossaire interne et le plugin syntaxhighlighter. En effet, certains mots-clé du glossaire sont présents dans mes codes sources, traités par syntaxhighlighter.

    Pour lancer ce plugin, il faut utiliser les balises <sql>Du code SQL coloré</sql>, <html>Du code HTML coloré</html>, etc...
    Le problème est que le code du glossaire, s’ajoute à mon code pour donner le resultat suivant :

    su - root
    export ORACLE_HOME=/u01/app/<a href="+-ORACLE-+" name="mot197_1" class="cs_glossaire"><span class="gl_mot">oracle</span><span class="gl_dl">
    	<span class="gl_dt">ORACLE</span>
    	<span class="gl_dd">Oracle Corporation est une entreprise commerciale créée en 1977 par Lawrence Ellison connue pour son système de gestion de base de données nommé Oracle. Oracle Database est un système de gestion de base de données (SGBD) relationnelle couramment utilisé dans les applications sur différentes plate-formes.</span>
    </span></a>/product/10.2.0/db_1
    . $ORACLE_HOME/bin/localconfig <a href="+-DELETE-+" name="mot182_2" class="cs_glossaire"><span class="gl_mot">delete</span><span class="gl_dl">
    	<span class="gl_dt">DELETE</span>
    	<span class="gl_dd">DELETE est un ordre DML permettant la suppression de données d’une table. Cette transaction peut être annulée par un ROLLBACK tant qu’elle n’est pas commitée.</span>
    </span></a>
    [...]
    rm -f /etc/inittab.cssd
    rm -f /usr/local/bin/coraenv /usr/local/bin/dbhome /usr/local/bin/oraenv

    Existe-t-il un filtre contre le glossaire qu’on pourrait directement insérer dans le contenu d’un article pour éviter celà ?

    En vous remerciant.

    • <html> est déjà une balise utilisée par SPIP, non ? Elle permet justement de protéger des parties de texte contre les traitements divers, et notamment du glossaire...

    Répondre à ce message

  • Au passage, j’ai bien vu la balise [!glossaire]. Sauf qu’elle agit, sauf erreur de ma part, sur l’intégralité de l’article et non une seule partie. Ce n’est donc pas une solution pour moi actuellement.

    Répondre à ce message

  • 2

    Bonjour,
    Et d’abord un grand merci pour ce plugin qui fonctionne très bien et pour le suivi du forum. Quelque chose de plus compliqué m’est demandé et je sèche. En fonction du contenu d’un article je voudrais que la définition liée à un mot-clé ne soit pas la même. J’ai rusé en créant le même mot-clé et en le faisant suivre par un * mais la il s’agit d’années (1789 et 1789*) et ça ne marche pas... Sur le fond il s’agirait de pouvoir associer un mot-clé du glossaire à un article particulier, mais là...
    Si quelqu’un a une idée pour m’aider.. d’avance merci.

    • Il faut d’abord que tu mettes à jour la version du Couteau Suisse (pour la fonction cs_traitements).

      Une solution possible (alambiquée, mais bon...) est dans ton squelette : placer la balise [(#TEXTE*|mon_filtre_glossaire{#ID_RUBRIQUE}|cs_traitements{TEXTE,articles})] à la place du champ #TEXTE de tes articles.

      Dans mes_options.php (ou mes_fonctions.php de ton squelette), il te faudra par exemple créer une fonction du genre :

      function mon_filtre_glossaire($texte, $id_rubrique) {
      	// blablabla, mes operations sur $texte
      	return "$id_rubrique. $texte";
      }

      Le glossaire pourra ensuite s’appliquer en fonction de tes opérations sur $texte. Le truc, c’est que je ne vois pas comment tu différencies tes articles... Des rubriques (exemple ici) ? Des mots-clés ?

      Pkoi ne mets-tu pas toutes les définitions sur le même mot ? Aux lecteurs de choisir en fonction du contexte, non ?

    • Pas facile... Tu pourrais mettre des <span> classés (les <div> et les <p> sont déconseillés) dans la définition de ton mot, puis, dans une boucle de ton squelette, créer ou non un style CSS « display » agissant sur ces span...

      Exemple de définition :

      <span class="def_une">ma 1ère déf</span><span class="def_deux">ma 2ème déf</span>

      Exemples de boucle dans le head de article.html :

      <BOUCLE_article_display1(ARTICLES){id_article}{titre_mot=Def_Une_Uniquement}>
      <style type="text/css">
       span.def_deux{display:none;}
      </style>
      </BOUCLE_article_display1>
      <BOUCLE_article_display2(ARTICLES){id_article}{titre_mot=Def_Deux_Uniquement}>
      <style type="text/css">
       span.def_une{display:none;}
      </style>
      </BOUCLE_article_display2>

      Tout ceci n’est pas testé, il s’agit d’une piste.

    Répondre à ce message

  • 5

    Hello !

    Comment, à partir d’un squelette, interdire l’application du glossaire à tel ou tel endroit ?

    Merci d’avance.

    • Peut-être qqchose comme #TEXTE|cs_retire_glossaire ?

    • Oui, ce serait bien ! :-)

    • bah fo tester lol la fonction existe déjà ;)

    • En voyant la réponse, c’est ce que je croyais. mais ça ne marche pas. (Ou, plutôt, ça continue à marcher...)

      [<div class="texte">(#TEXTE|cs_retire_glossaire)</div>]

      SPIP 2.0.5 [13790]
      CS 1.8.06.09 [27515]

    • Je viens de corriger la fonction cs_retire_glossaire(), ça devrait fonctionner à présent.

      Afin d’économiser des ressources serveur, il y a aussi : #TEXTE*|concat{#EVAL{_CS_SANS_GLOSSAIRE}}|cs_traitements{TEXTE,articles}

      Mais un bug sommeillait dans la fonction cs_traitements(). Dans tous les cas, il faut mettre à jour le Couteau Suisse et réafficher sa page d’admin.

    Répondre à ce message

  • 4

    Bonjour à tous,
    plug in que j´utilise depuis bien longtmps je me confronte à une petite idée que j´aimerai appliquer par l´intermédiaire de ce plugin.

    Existe t- il un petit hack ne modifiant pas la fonction principale de glossaire mais qui pourrait fonctionner aussi lorsque le logo du mot clef apparait dans un article (le mot clef étant lui même associé à cet article).

    Pour vous mettre dans la situation, ces mot clefs sont des definitions de symboles qui seront présent dans des articles. Hors dans certains article je veux seulement afficher ce symbole ( en l´occurrence le logo du mot clef), et donc avoir la definition et passant dessus cette icône.

    voili voilou
    salutations à tous
    rano

    • C’est faisable en l’état...
      -  Une surcharge du fond html utilisé où tu ajoutes un span « .gl_logo » contenant le logo, mais stylé invisible.
      -  Une fonction jQuery qui déplace le logo pour le mettre à la place du mot dans le span « .gl_mot » associé.

      Un peu tordingue, mais bon...

      Sinon, ya la piste du modèle personnalisé et fabriqué de toute pièce, avec le logo et le glossaire tout prêt, dans le style des fonds livrés avec le plugin... Mais dans ce cas, il faut insérer le modèle dans le texte, et non le mot lui-même. Ex : Je vais à la <glossaire|titre=plage> demain !

      Un peu lourdingue, mais bon...

    • Salut,
      je l´ai fait manuellement dans le squelette en inserant justement les class là oú il faut autour de #LOGO_MOT...
      Une solution temporaire, j´aurai voulu pouvoir rajouter une fonction dans l´outil mais pas programmeur natif :)

      Mais si personne ne l’a suggéré, est ce vraiment utile l´implémenter dans le code ?

    • Dans la version 1.8.06.06 du plugin (disponible en zip vers 19h je crois), on peut désormais surcharger deux fonctions. Extrait du code :

      // surcharge possible de cette fonction glossaire_generer_url_dist par : glossaire_generer_url($id_mot, $titre) 
      // si elle existe, elle sera utilisee pour generer l'url cliquable des mots trouves
      //   exemple pour annuler le clic : function glossaire_generer_url($id_mot, $titre) { return 'javascript:;'; }
      function glossaire_generer_url_dist($id_mot, $titre) {
      	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
      }
      
      // surcharge possible de cette fonction glossaire_generer_mot_dist par : glossaire_generer_mot($id_mot, $mot) 
      // si elle existe, elle sera utilisee pour remplacer le mot detecte dans la phrase
      /* exemple pour utiliser un fond personnalise, inserer un logo par exemple :
      	function glossaire_generer_mot($id_mot, $mot) { 
      		return recuperer_fond('/fonds/mon_glossaire', array('id_mot'=>$id_mot, 'mot'=>$mot));
      	}*/
      function glossaire_generer_mot_dist($id_mot, $mot) {
      	return $mot;
      }
    • Pour éviter ces classes dans les squelettes il est aussi possible d’utiliser directement le filtre |cs_glossaire

    Répondre à ce message

  • 7

    Bonjour,

    je n’en ai pas la compétence technique, mais serait-ce possible d’ajouter à cette lame du couteau suisse la possibilité de prendre en compte un

     !glossaire

    inséré dans un champ dans lequel on désire que le glossaire ne se mette pas en fonction ?

    Du même genre que !sommaire.

    Ce serait vraiment d’un bel apport pour un gros site associatif que je gère dont un certain nombre de pages servent de recueil de modèle à copier/coller où les définitions du glossaire viennent mettre un sacré pataquès ;-)

    Merci d’avance

    • Oui, ceci vient d’être intégré. A tester, merci.

    • Arf alors ça, ça s’appelle une idée dans l’air...

      Je viens de tester, ça fonctionne parfaitement sur 1.9.2.

      Merci à toute l’équipe !
      Tina

    • Pour rebondir sur cette demande, j’ai un problème un peu plus précis.
      J’aurais besoin de désactiver les liens vers le glossaire sur certains mots dans mes articles.
      Ex. :

      Un titre avec une balise h3.spip (qui contient un mot du glossaire mais qui ne doit pas être pris en compte)
      Le reste de l'article texte blah blah (qui contient aussi des mots du glossaire et ceux-ci doivent être actifs)

      Genre [PasGlossaire]le mot de l’article dans le glossaire à désactiver[/PasGlossaire]

      Est-ce possible ? Ai-je loupé un truc ?

      Oui je pourrais construire ma page autrement mais j’ai ai besoin d’une certaine découpe hiérarchique dans mes articles et que par endroits (dans les titrages dans l’article) les liens actifs vers le glossaire soient désactivés.

      Merci d’avance pour les réponses :)

    • Et si tu utilisais plutôt <html></html>, qui est une balise de SPIP ? Le glossaire ne touche pas à certaines balises...

    • Merci pour la réponse mais étrangement c’est la seule balise parmi toutes les exceptions (cite, code, acronym etc...) qui laisse encore les liens du glossaire actifs :/

    • Ah oui c’est exact ! Les traitements de balises n’ont plus du tout accès à la protection <html></html>, contrairement aux pipelines de typo... Je viens de poster la correction, tu me diras si après mise à jour c’est ok.

    • Après mise à jour et test, ca marche.
      Merci ;)

    Répondre à ce message

  • 2

    Lorsqu’il y a un «  ? » ou un «  ! » à la fin du mot-clé du glossaire, celui-ci n’est pas pris en compte. Obligé d’enlever «  ? » et «  ! » pour que ça marche...

    Normal ?

    Merci

    Répondre à ce message

  • Bonjour,

    Je suis un utilisateur enthousiaste du plugin depuis ces débuts. Je fais un test de migration SPIP 2.0 et dernière version de Couteau suisse compatible V2. J’ai un souci avec les mots du glossaire qui ont un équivalent comme mot courant : par exemple le mot « pas » qui est un mot de mon glossaire, du coup il me souligne l’occurrence « pas » dans la locution « ne (...) pas » ce qu’il ne me faisait pas avec 1.9.2b et ancienne version Couteau suisse. Je n’avais jamais eu le pb avant avec les mots courants.
    Une idée ? Merci d’avance.

    Répondre à ce message

  • 4

    Bonjour ! J’ai encore un problème avec les caractères accentués...
    Dans la définition des mots, les accents (à), les apostrophes (l’) sont écrits ainsi :

    « L&@@GLOSS#@@#8217 ;honneur » (pour l’honneur, par exemple !)

    Est ce que ca vient d’un charset, des fichiers du couteau suisse ou bien de a façon dont j’ai paramétré le site SPIP ?

    Par contre, dans la fenetre « popup » en CSS, ca s’écrit correctement. C’est seulement dans la définition des mots....

    Merci par avance de votre aide....

    • Bonjour, ce avec la dernière version du CS recompilé, cache vidé ?

    • J’ai installé la dernière version, et maintenant ca marche correctement en effet !
      J avais du insérer une erreur en personnalisant les fichiers...

      Merci !

    • Toute personnalisation doit être collective... Plutôt que de faire un truc dans son coin, il est préférable d’en faire part et éventuellement de faire évoluer le plugin. Mais à chacun de voir !

    • J’aimerais bien etre capable de faire « évoluer » un plugin spip mais en fait je me suis mal exprimée, tout ce que je cherchais c etait a changer l’apparence des fenetres... J essaie de mettre des bords arrondis...

    Répondre à ce message

  • 3

    Bonjour et merci pour ce superbe outil.

    Est-il possible (et comment) d’interroger un groupe de mots clés sur d’une bdd spip distante ?
    Dans le cadre d’un spip multi-base où mes paramètres de connexions sont dans /config/ma_base.php.
    merci,

    • Bonjour, je n’ai personnellement jamais essayé, mais il n’y a aucune raison que ce ne soit pas possible. En dehors de la migration pour SPIP2.0, à voir si des modifs sont nécessaires, et lesquelles.

    • Bonjour,
      aïe, c’est justement pour un spip 2.0 (mais je suis encore en 1.9.3dev 11802) en effet sur les pages qui contiennent un mot du glossaire (local) j’ai une erreur :
      Fatal error : Call to undefined function generer_url_entite() in .../tmp/couteau-suisse/mes_fonctions.php on line 393
      Mais peut-être que ce glossaire sera prochainement porté sous spip 2 ?
      Si c’est le cas, l’interrogation d’un glossaire commun à plusieurs sites multi-base m’intéresse (et je veux bien le tester ;). En attendant merci et bon courage.

    • Attention, aux yeux du Couteau Suisse (et du reste de la communauté), la version 1.93dev n’existe pas !

      Le plugin est compatible avec les versions 1.92e et 2.0 de SPIP (et même 1.91 je pense). En ce qui concerne les nouvelles fonctionnalités de SPIP 2.0, notamment au sujet des bases de données, des tests et des améliorations sont encore possibles, nous comptons sur tous les utilisateurs ;-)

      En résumé, mets donc ton SPIP à jour, et si tu as un code qui permet de mettre en place ce glossaire commun, n’hésite pas !

    Répondre à ce message

  • 2

    Bonjour !
    Je voudrai savoir si le plugin prend actuellement en charge les expressions avec une apostrophe :

    exemple : « salon d’art »

    car sur mon installation, ca ne fonctionne pas !!

    et si ca ne marche, est ce qu il y a des bidouilles possibles ?

    merci pour votre reponse !

    • Oui les apostrophes sont prises en compte, mais SPIP remplace le guillemet simple par : &#8217;

      Essaye donc de mettre le mot-clé : salon d&#8217;art ou salon d’art, mais pas salon d'art.

    • Oui ca marche en remplaçant l’apostrophe par le code & #8217 ;

      Merci beaucoup pour cette réponse ultra rapide !

    Répondre à ce message

  • 1

    Bonjour,

    Super plugin. Sur la démo, le plugin prend bien en compte les mots composés avec espace tels que « Chirurgie esthétique », mais sur mon site, il ne reconnaît pas ce type d’expression.
    Ca ne marche que si je mets un tiret...

    Faut il faire une installation particulière pour que ça marche ?

    Merci d’avance !

    Lorie

    • Je me réponds à moi même... En fait j’ai installé la toute dernière version du Plugin Couteau Suisse et ça marche...
      Alors merci encore pour le plugin.

    Répondre à ce message

  • 9

    Bonjour,

    Mon site dispose déjà d’un lexique, et je me vois mal le dupliquer dans une nouvelle table de spip, alors ma question certains l’auront peut être déjà deviné est : comment modifier le plugin pour le brancher sur une autre table ?
    Quelqu’un a t’il déjà essayé ?

    Merci d’avance pour les réponses !

    • Un jour j’ai dû faire la même chose sur 300 termes. Je suis passé par un tableur avec les commandes SQL adéquates pour phpmyadmin, et hop, le tour a été joué en moins de temps qu’il en faut pour réfléchir à comment changer le code pour brancher le plugin sur une autre table !

      Bon, c’est vrai, le glossaire permet déjà de choisir le nom du groupe de mots...

    • Je suis passé par un tableur avec les commandes SQL adéquates pour phpmyadmin, et hop, le tour a été joué en moins de temps qu’il en faut pour réfléchir à comment changer le code pour brancher le plugin sur une autre table !

      J’y ai pensé à cette solution avec mes 95 termes dans mon lexique perso ! Mais faire ça, c’est une solution de facilité et qui n’est jamais bonne dans le temps. Si un membre de mon équipe rajoute une définition dans mon lexique actuel, celle ci ne sera pas dans spip, en plus si une définition est modifié, je ne m’apperçevrai même pas que le glossaire de spip n’est plus à jour !

      Je vais essayer de me brancher sur ma table en modifiant le plugin, mais si quelqu’un l’avait déjà fait avant ça pouvait servir à la communauté :)

    • Ton problème est bien spécifique... Et puis, évidemment si tu passes ton lexique en groupe de mots clés, il ne faut plus utiliser l’autre table... Ton code en tout cas est le bienvenu.

    • Ton code en tout cas est le bienvenu

      Le branchement n’est pas trop dur tant qu’on a des tables à peu prés identiques...

      Dans le fichier glossaire_fonctions.php du dossier « plugins/couteau-suisse/outils/ », il faut modifier la fonction : cs_rempl_glossaire($texte) au niveau de la requête MySQL.
      A l’origine c’est ceci :
      -  $r = spip_query(« SELECT id_mot, titre, texte, descriptif FROM spip_mots WHERE « . $GLOBALS[’glossaire_groupes_type’] . » ORDER BY id_mot ASC ») ;
      et pour l’adapter à ma table « lexique » existante (comme exemple) :
      -  $r = spip_query(« SELECT id as id_mot, mot as titre, def as texte, def as descriptif FROM lexique WHERE spip=true ORDER BY id ASC ») ;
      Pour éviter de modifier les noms de mes colonnes exitantes, on mets des alias pour le moteur de spip, quitte à répéter 2 fois la même colonne « def » de ma table. Au passage dans ma table perso. j’ai rajouté une colonne qui est un booléen (true/false ou 0 ou 1) pour préciser, mais c’est pas obligatoire, si cette définition apparaitra ou pas dans un article.
      Après avoir fait cette modif. et bien supprimé les fichiers de cache du plugin dans tmp ! (très important) une partie du boulot est fait. Reste que pour moi spip est en UTF-8 et ma table lexique en LATIN-1 évidemment :) donc les accents ça bug et que je dois changer le lien cliquable « spip.php ?mot23 » en « lexique-LETTRE.html » donc extraire la première lettre du titre.
      Mais comme tu la préciser, pour les dernières modifications, c’est du spécifique à mon contenu déjà existant et que changer la requette de base peut déjà dépanner certaines personnes !

    • Bon, trifouiller le code du Glossaire n’est pas très profitable et va géner les mises à jours... Pour te permettre qd même d’y arriver, je passe les SELECT de spip_query en define. Dans config/mes_options.php tu n’auras donc qu’à mettre :

        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');

      De même pour la fonction de génération des liens :

         @define('_GLOSSAIRE_URL', 'my_generer_url_entite');
         function my_generer_url_entite($id, $foo='') { return 'javascript:;';}

      Dès que tu as mis à jour (v1.7.19.03) et testé, je veux bien les retours...

    • Merci pour cette réponse rapide.

      J’ai donc remplacé dans la fonction de base cs_rempl_glossaire :

      $r = defined(’_GLOSSAIRE_QUERY’) ?spip_query(_GLOSSAIRE_QUERY):spip_query(« SELECT id_mot, titre, texte, descriptif FROM spip_mots WHERE « . $GLOBALS[’glossaire_groupes_type’] . » ORDER BY id_mot ASC ») ;

      Mais par contre pour les liens, toujours dans cette même fonction, je dois désactiver la fonction generer_url_mot et ajouter

      $lien = ’../lexique-’.strtoupper(substr($titre, 0,1)).’.html’ ;

      et pour mon soucis de charset j’ai rajouter la fonction charset2unicode

      ...
      ’descriptif’ => glossaire_safe(charset2unicode($mot[’descriptif’],’iso-8859-1’)))) ;

      Mais je vois pas comment intégrer ta fonction my_generer_url_entite ?

      Au passage, j’ai un bug qui est apparus avec jquery et seulement dans IE7 et IE6, avec une page 404 sur des articles qui était découpés en pages avec une alerte javascript ? Est ce qu’il y a un retour connus ?

    • Enfin je précise c’est pas une vraie 404 du serveur, mais IE présente le même affichage. Et puis le bug chez moi, viens de cette ligne, pourtant après verification, le chemin est bon :(

      <script src="http://www.monsite.com/reportage/spip.php?page=jquery.js" type="text/javascript"></script>
    • Aucune ligne de code du plugin ne devrait être modifiée. L’article de cette page a été mis à jour pour expliquer les surcharges et les deux nouvelles constantes qui te permettront de court-circuiter generer_url_mot et la requête SQL.

      Là les liens du glossaire peuvent être fabriqués avec l’id du mot, non avec son titre ou sa première lettre... Tu pourrais peut-être prévoir un squelette pour les mots de ton lexique et interroger ta table avec une boucle SPIP...

      Quant au descriptif, tu peux aussi surcharger le fichier couteau_suisse/fonds/glossaire_js.html en le recopiant dans ton squelette (mon_squelette/fonds/glossaire_js.html) et en y ajoutant ton filtre, peut être comme ceci (non testé) :
      #SET{def,#ENV*{descriptif}|charset2unicode{’iso-8859-1’}}

    • A propos des liens, je viens de modifier le plugin pour qu’il accepte une surcharge de fonction. La précédente constante disparait. Lire l’article ci-dessus à ce sujet.

    Répondre à ce message

  • 3
    Patrick

    Bonjour,

    Est il possible de ne conserver que la première apparition de la définition dans sa petite fenêtre et de supprimer le lien qui envoie à la page « mot » ?

    Cela m’ennuie de rendre publics tous les mots clefs, même s’il n’y a rien à cacher,
    surtout, cette page est assez disgracieuse, ou peut être faut il l’habiller comme le reste du site ?

    • Question plus directe : comment « habiller » cette page de mot clef qui apparait lors du clic sur le lien du mot repéré (pas la petite fenêtre qui contient la défintion courte, l’autre...) ?

      Se trouve t elle dans la dist ?

      Pour toute réponse, merci.

    • Cette page correspond tout simplement au squelette mot.html de la dist.

    • Merci,

      Je suis parvenu à mes fins en effet en chargeant cette page dans mon squelette, et en liant les différentes caractéristiques de mes articles :
      entête, cadre de page, pied de page.

      Ceci grâce à Pierre du site Histoire Passion qui a eu l’amabilité de me renseigner.

      Merci tout de même pour la réponse.

    Répondre à ce message

  • Olivier Garry

    Bonjour,

    A partir d’un terme du glossaire que j’affiche sur une page de définition, je souhaiterai pourvoir afficher la liste des articles utilisant ce terme.

    Je n’ai pas trouvé les boucles qui me permettraient de faire remonter les articles où le terme est activé comme glossaire.

    Est-ce que quelqu’un aurait ces boucles spécifiques pour en sorte effectuer le chemin inverse du mot vers les articles.

    merci

    Répondre à ce message

  • Piercol

    Bonjour,

    Un super-outil, qui mérite bien son nom, et un grand bravo à ses créateurs et développeurs.

    Je l’ai mis en place sur le site Histoire Passion, et j’utilise en particulier la fonction « glossaire », tout à fait adaptée à un site qui publie un très grand nombre de textes anciens, et où les glossaires constituent un outil indispensable à la compréhension des documents et jouent un rôle pédagogique évident.

    L’outil glossaire fonctionne bien, et après quelques tâtonnements, il rend le service attendu.

    Un script supplémentaire dans le squelette serait le bonheur presque absolu, il consisterait à afficher en bas de page la liste des mots du glossaire trouvés dans la page, avec leur définition .

    Le besoin ne se fait pas ressentir vraiment en consultation de la page à l’écran, puisque le survol des mots donne la définition, mais en cas d’impression de la page : elle serait ainsi complétée par le glossaire qui la concerne (élément pédagogique important).

    Je suis tout à fait incompétent pour écrire un tel script. Parmi les développeurs, quelqu’un peut-être trouvera intérêt à ma question. Je l’en remercie par avance.

    Répondre à ce message

  • Bonjour,

    J’ai un souci de coexistence entre le glossaire interne et les formulaires &tables.

    J’ai décrit un formulaire destiné à recevoir des infos de classification de groupes. Une seule réponse par auteur identifié. Le formulaire recharge donc les données entrées par le responsable.

    Dans un ’textarea’, les valeurs du glossaire sont remplacées par leur lien, et cela boucle sur chaque validation. Un span > span > span etc...

    Comment désactiver le remplacement des zones de texte dans les formulaires ?

    Merci

    Répondre à ce message

  • 3
    Olivier Garry

    Bonjour

    un autre problème que je viens d’identifier :

    j’ai trois expressions :

    Conseil des ministres
    Conseil constitutionnel
    Conseil consultatif

    A l’affichage d’un article j’ai bien l’encart avec le terme qui apparait mais pas la définition et ce même si je l’ai mise en descriptif et en texte explicatif ; et que j’utilise css ou javascript c’est pareil.

    Qq’un a rencontré ce problème ?

    • Je ne reproduis pas cette erreur... tu as un lien public ? est-ce la meme chose avec tous les navigateurs ?

    • Olivier Garry

      Non pas de liens publics car justement je suis en période de test.

      je viens de tester, c’est le même probleme sous Firefox et IE. Bien entendu je développe en testant sous Firefox :)

    • Olivier Garry

      je viens de charger la nouvelle version qui corrige les accents et le bug d’ordre entre noms composés et termes simples.

      de fait ca a du résoudre le probleme des noms composés ayant la même racine, car je n’ai plus le bug.

      merci donc car ce plugin est super utile !!!!!

    Répondre à ce message

  • 6

    Bonjour

    j’essaie le pugin et je rencontre un prb de non reconnaissance de mon mot-clé dans mes textes quand il est composé d’un « d’ ». Exemple Conseil d’Etat. Par contre pas de problème pour Conseil constitutionnel.

    le problème vient-il de la présence du d (mot vide) ou de l’apostrophe et donc du charset.

    sachant que mon modèle de page est en iso alors que ma base de production est en utf-8 (je sais c’est pas bien).

    Est-ce que l’alignement des charset résoudrait le prb ? ou y-a-t’il un prb de fond du plugin ?

    merci

    • Olivier Garry

      Pour ceux qui lieraient ce post plus tard. Le problème vient de la différence du codage des accents et vraisemblablement de différences liées à des copier-coller depuis des docs de type word.

      Du coup, les différences entre accents ont une incidence

    • Tu as peut-être un exemple public ? C’est vrai qu’il faut distinguer ce qui est copié/collé, de ce qui est tapé directement, soit en partie privée, soit à l’aide de Crayon en partie publique, éventuellement aussi les codes HTML... Il faudrait faire qq essais.

      Le traitement des mots du glossaire, je pense, peut-être amélioré pour régler ces pb d’accents. Un problème à prendre à bras-le-corps !

    • Olivier Garry

      Pas d’exemple public encore car nous sommes en développement.

      Effectivement si ce problème peut-être intégré ce serait super.

    • Le glossaire contient déjà un traitement particulier des accents. Si tu trouves ce qui cloche chez toi en local, n’hésite pas à en faire part.

    • Olivier Garry

      Je vais essayer de l’analyser précisément mais en remplaçant un accent dans le texte initial par le même accent saisi dans le titre du mot clé le problème a été résolu, il doit donc y avoir des différences non prises en compte.

      mais je vais essayer de les identifiées clairement

    • Je viens de revoir le traitement des accents. Tu me diras si des expériences de ce genre créent tjrs des pbs.

    Répondre à ce message

  • 12

    Hello la zone
    j’ ai repéré un petit bug, enfin ce serait plus un conflit entre un mot seul et un autre composé.

    Exemple : Mission et Chef de mission

    il apparait alors dans « Chef de mission » ceci : chef de @@GLOSSmission#216@@

    Il a t-il une solution à ce problème ?

    je travaille avec la version 1.9.2b

    salutations

    • Mais quel est ton mot-clé ? « Mission » ou « Chef de mission » ? As-tu bien installé la toute dernière version du plugin ? As-tu un exemple en ligne ?

    • « chef de mission » et « Mission » sont 2 mots clefs différents.

      Je vais tester avec votre dernières révision :)

    • OUI avec la dernière rev.. l’erreur subsiste.

      Bouh

    • Il faudrait peut-être intervertir l’ordre des 2 mots-clés... Je jeterai un oeil dans une dizaine de jours à mon retour de voyage, à moins que qq’un trouve la soluce avant moi !

      Bon courage.

    • Nop,
      lorsque l´on inverse les mots clefs... en l´occurrence en passant « mission » avant « chef de mission », le second se désactive.

      Bon voyage :)

    • Bonjour,

      j’ai le même problème que Rano car j’ai les deux mots clés : floraison et préfloraison.

      D’autre part, je souhaiterai limiter l’application de ce glossaire automatique à un secteur de mon site (ex : le secteur 1 par exemple qui propose des contenus + encyclopédiques que le reste). Je n’ai pas encore trouvé de solution sur les forums. .. Quelqu’un l’a-t-il déjà fait ?

      Je ne peux pas utiliser #TEXTE* par exemple, car j’ai d’autres filtres ailleurs (notamment des liens vers des articles virtuelles)

      Merci d’avance,

    • Ayant rencontré le même problème, je l’ai résolu en intervertissant l’ordre de définition des mots dans le glossaire.

      J’avais défini cyclo (n°112) puis école cyclo (n°114). J’obtenais toujours le lien sur le mot cyclo seul même lorsque j’utilisais l’expression école cyclo.

      J’ai donc permuté les deux définitions : cyclo (n°114) et école cyclo (n°112). Et maintenant si j’ai école cyclo dans le texte j’obtiens bien lé définition 112 alors que si le mot cyclo ne suit pas école, j’obtiens la définition 114.

      Il faut donc bien préparer l’ordre de définition de ses mots lorsqu’on utilise des expressions contenant des mots eux aussi définis : d’abord les expressions, ensuite les mots.

      Nota : pas facile à expliquer !

    • Olivier Garry

      si c’est très clair, par contre c’est un peu compliqué en gestion quand le glossaire est évolutif (ce qui est le cas par définition avec de nouvelles publications).

      Est-ce quelqu’un a essayé en utilisant la numérotation spip (01. aaaa) qui permettrait peut-être d’anticiper des nouvelles définitions en les mettant dans un ordre logique choisi ?

    • A ce jour, les numéros ne sont pas pris en compte...

    • Olivier Garry

      je viens de retester le cas de chef de mission et mission en créant d’abord le mot-cle chef de mission et ensuite mission et je retrouve le meme probleme évoqué plus haut.

      Pas sur donc que l’ordre de déclaration résolve le problème

    • Ce pb vient d’être résolu...

      Attention donc à bien créer (ou placer) le mot clé composé (contenant) AVANT le mot clé simple (contenu).

    • Ce pb vient d’être résolu...

      Attention donc à bien créer (ou placer) le mot clé composé (contenant) AVANT le mot clé simple (contenu).

    Répondre à ce message

  • 4

    Bonjour,

    j’ai essayé le glossaire avec le couteau suisse 1.7.16.11 et spip 1.9.2 et je n’arrive pas à le faire marcher. C.a.d que les liens glossaire ne se créent pas dans le texte.

    Une idée

    Merci Rainer

    • je me réponds à moi même. J’utilisais des balises mutlilingues dans les titres de mots clés. Quand je met un mot clé par langue et j’enlève les balises multilingues, le glossaire fonctionne. Y aurait-il un possibilité de faire marcher le glossaire avec les balises mutlilingues ?

      Merci Rainer

    • J’ai fait une petite modif du code. Les balises multi sont-elles désormais prises en compte ?

    • Merci Patrice, je viens de le tester et ça marche, les liens sont crées, il y a juste encore un petit problème.

      Dans le titre de la fenêtre explicatif figurent les titres de toutes les traductions du style : [en]Key word[fr]mot clé...
      par contre dans le descriptif, ça marche nickel, uniquement le descriptif de la langue du contexte s’affiche.

      Merci
      Rainer

    • Ah oui, ça devrait aller mieux avec la version 1.7.16.12 du plugin.

    Répondre à ce message

  • 3

    Bonjour, je trouve ce plugin particulièrement utile et j’ai voulu aller un peu plus loin en l’utilisant pour lier de façon permanente un article ou une breve aux mots clés trouvés. Ca ouvre de nouveaux horizons car cela permet de construire automatiquement une nouvelle arborescence du site basée sur les mots clés, sans avoir à les saisir pour chaque article/breve. Un gain de temps considérable.

    Pour ce faire, il suffit de demander à Spip d’enregistrer l’id du mot-clé et l’id de l’article dans la table spip_mots_articles (ou l’id de la brève dans la table spip_mots_breves) et de s’assurer que l’opération est renouvelée à chaque modification de l’article ou de la brêve.

    Dans le fichier glossaire_fonctions.php, j’ai donc ajouté les lignes suivantes dans la fonction cs_rempl_glossaire($texte) :

    ligne 46 (pour reconnaître l’article ou la brêve et effacer les mots clés à chaque modif) :

    $id_article = intval(_request(’id_article’)) ;
    $id_breve = intval(_request(’id_breve’)) ;
    sql_delete(« spip_mots_articles », « id_article=$id_article ») ;
    sql_delete(« spip_mots_breves », « id_breve=$id_breve ») ;

    ligne (97 devenue 101) (pour enregistrer dans la table concernée) :

    spip_query(« INSERT INTO spip_mots_articles (id_mot,id_article) VALUES ($id,$id_article) ») ;
    spip_query(« INSERT INTO spip_mots_breves (id_mot,id_breve) VALUES ($id,$id_breve) ») ;

    Dès lors, à chaque création ou modification d’un article ou d’une brêve, les mots clés reconnus par le glossaire sont automatiquement liés à l’article ou la brêve. En cas de modification de l’article ou de la breve, les mots clés devenus sans objet sont automatiqument supprimés. Le rêve...

    • C’est une idée très intéressante. Les exemples de code que tu donnes doivent être entourés des balises <code></code> ou <cadre></cadre> pour être plus lisibles.

      Jusqu’à présent, aucun outil du Couteau Suisse ne modifiait la base de donnée directement. Ta proposition agit sur la base de donnée à chaque calcul de page : il s’agit là d’une opération particulière à signaler....

    • pierrick

      Je continue de travailler là dessus d’autant que le glossaire interne me plait beaucoup... Mais j’ai l’impression qu’il ralentit de manière importante l’affichage des pages, surtout à partir du moment où on a plus d’un millier de mots clés (c’est mon cas) à analyser.

      Je verrais bien une solution qui calculerait les élements de glossaire dans l’espace privé en les conservant lors de l’édition d’un article, mai qui n’aurait pas besoin de les recalculer dans l’espace public à chaque affichage.

    • oui, le glossaire n’est pas encore optimisé. Le Couteau Suisse possède une fonction de préinstallation de tous les outils qui en ont besoin, faite lors de l’affichage de la page de config ou si le parametre d’url cs=calcul. Les smileys ou les chatons utilisent cette procédure de façon simple en précalculant les images dont il ont besoin et en les stockant dans les métas de SPIP.

      L’effet sablier est dû au fait qu’une optimisation sur 1000 mots prends de la place en mémoire et accélère les traitements. Pas d’optimisation du tout ralenti le traitement, mais prends moins de place en mémoire... A voir donc !

      Il ne faut pas oublier que le glossaire sur une page n’est calculé qu’une fois par jour en principe, grâce au cache de SPIP...

    Répondre à ce message

  • 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

    Répondre à ce 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.

    Répondre à ce 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

    Répondre à ce 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.

    Répondre à ce 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é

    Répondre à ce 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

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce message

  • 1

    bonjour,

    j’ai installe le couteau suisse, active le plugin. A coté du mot clé le plugin me recrit le mot cle et la definition :
    mot clé = signe et ça donne signesigneblabla.

    J’ai reinstalé, vide le cache rien n’y fait. La balise TEXTE n’a pas d’*.

    je l’ai installe sur un autre site et ca marche. Comprend plus !

    une idée ? merci.

    • Probablement une question de balise #INSERT_HEAD ? Elle doit apparaître en clair dans ton squelette. Tu as aussi la possibilité d’activer l’outil ’balise #INSERT_HEAD’ du Couteau Suisse.

    Répondre à ce message

  • 1

    bonjour,

    petit soucis avec le plugin : lorsque je génére la version imprimable des articles, la définition du mot apparait dans le texte. N’y a t-il pas moyen de supprimer cette fonction ?

    Merci d’avance

    Répondre à ce message

  • 6
    Michel

    N’y a-t-il pas un risque d’ambiguïté avec les homonymes ou la polysémie ?

    • Là, le type de définition sur un mot donné compte beaucoup... Un glossaire est utile pour les mots compliqués ou rares.

    • L’idée est excellente mais à l’usage j’ai modéré mes ardeurs car il faut aussi que le mot du glossaire ne soit pas susceptible d’apparaitre ni dans un descriptif d’illustration (cela explose la mise en page), ni dans un titre d’article ou de manière redondante dans un article (effet de saturation).

    • Alors pour ça, je cite l’article ci-dessus, il existe des balises HTML protégées :

      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é.

      A toi de choisir celle qui pourra protéger ton descriptif d’image.

      Ensuite, concernant les titres, je recite l’article :

      Techniquement parlant, cet outil agit sur toutes les balises #TEXTE 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 mise à jour prochaine permettra sans doute d’insérer aussi des liens de glossaire dans les balises #CHAPO.

      Enfin, concernant le redondance, tu peux limiter le nombre de remplacements sur la page d’administration du Couteau Suisse en cliquant sur l’outil « Glosssaire interne ».

      Vues tes remarques, tu dois sûrement avoir une version ancienne du plugin qu’il conviendrait de mettre à jour !

    • Exact ma version datait un peu (fin mai 2007...). La dernière est parfaite.

       :-)

    • salut a tous...

      j’ai suivi les indications :
      installation du plugin et activation du glossaire
      creation du groupe Glossaire et des mots dans le groupe

      mais je ne vois aucune mot souligné dans mes pages....

      avez-vous une explication de ça ?

      Merci

    • Il y a beaucoup de raisons pour que le glossaire ne soit pas pris en compte... Il faut des caches vidés, la balise #INSERT_HEAD en clair dans ton squelette ou l’outil ’balise #INSERT_HEAD’ activé dans le Couteau Suisse. Le squelette doit également éviter d’utiliser les balises étoilées. L’étoile annule en effet tous les traitements et renvoie le texte initial brut. Etc.

      A tous : en cas de soucis, n’oubliez jamais de préciser les versions de SPIP/Couteau/squelette utilisés. Parfois, un lien public évite bien des explications confuses et un problème concernant le Couteau Suisse sera plus facilement identifié lorsque le squelette d’origine de SPIP (dist) est utilisé, lorsqu’aucun autre plugin n’est activé et lorsque l’outil défaillant est utilisé seul.

    Répondre à ce message

  • 2

    Merci d’avance pour ce magnifique travail.

    je suis sur spip 1.9.2

    en installant correctement les plugins, cela fonctionne bien dans la page article.
    Mais dès que je charge la page d’accueil, la mise en page est destructurée. Cela vient du fait que certain articles diffusées sont en fait des redirections (option de spip dans les articles). De ce fait, le #texte retourne l’url en dur (=http://www.cred.fr) au lieu de rien du tout.

    avez vous déja indentifié ce cas ?

    Merci

    • Là j’ai besoin de plus de renseignements... Quel est le code exact du squelette ?

      Le problème ne vient-il pas de là ? Les liens de redirection, je crois, sont stockés dans le chapo... Le texte est en effet normalement complètement vide.

    • Je pense avoir ajouté une précaution au plugin pour éviter que le chapo soit modifié dans le cas d’un article virtuel. Est-ce qu’une mise à jour du plugin corrige le pb de mise en page ?

    Répondre à ce message

  • 1

    Je viens en remettre une couche ici :-) (c’est mon cheval de bataille)

    Le texte du mot-clé collé en travers du texte de l’article c’est pas l’idéal question respect des recommandations accessibilité WCAG (cf. directive 1.3), et plus largement pour tout navigateur n’interprétant pas les css (il y en a plus qu’on ne croit).

    Ce serait sans doute mieux de charger les définitions du glossaire à part, puis de gérer leur affichage au survol de la souris au dessus du mot-clé en js par exemple, chose que je serais incapable de faire personnellement.

    Y a un exemple je crois sur omacronides.com, expliqué ici ou (mais ça marche pas du tout sur firefox/mac en tout cas). Le site de futura-sciences avait testé un affichage de glossaire de ce genre un moment mais l’a apparemment abandonné — comme quoi ça doit pas être si simple.

    Voilà, le cas typique du yakafokon agaçant :-)

    • Eh non, c’est un débat intéressant qui n’a pas de solution idéale, je crois... Merci pour les liens.

      En fin de compte, soit on code en css, et forcément, ya toujours des navigateurs capricieux, soit on code en js et là, ya toujours des utilisateurs frileux ou des systèmes sans Javascript !

      Je compte laisser ce choix au webmestre dans une version future...

    Répondre à ce message

  • 7

    bonjour ce plugins semble intéressant mais après activation, il ne fonctionne pas sur mon site (1.9.3 dev) il y a t-il un problème connu avec cette version ou un conflit éventuele avec d’autres plugins ou suis-je le seul ?

    • As-tu une url à proposer ? cet outil ne fonctionne qu’en partie publique sur la balise #TEXTE, après un recalcul de la page. Un pb d’accents encore non résolu à ce jour a été soulevé ci-dessous. Merci de tester avec Firefox qui comprend parfaitement les commandes css en ayant préalablement désactivé les autres plugins, voire même le squelette. Si un bug est identifié, il sera résolu au plus vite.

    • bonjour,

      merci de cette réponse. Voici par exemple une page : http://www.allsecurite.com/fr/spip.php?article106 où plusieurs sigles sont présents.
      J’utilise effectivement firefox

    • oups j’ai oublié si un identifiant est demandé tu peux essayer ’visiteur’ et en pass ’visiteur’

    • qq pbs ont été réglés depuis ton message. Est-ce qu’une mise à jour du pluigin permet un meilleur fonctionnement du glossaire ?

    • je viens de le mettre a jour et cela ne fonctionne toujours pas, il faut que je recherches une autre piste

    • Tu utilises le squelette ALTERNATIVES, je pense que dans article.html, la balise TEXTE doit être étoilée : #TEXTE*. Cela empêche les traitements de fonctionner... Donc, pas de glossaire dans les articles !! Tu as dû remarquer que le glossaire fonctione bien sur mots.html.

      Solution : soit tu retires l’étoile de la balise, soit tu ajoutes à la main le filtre cs_glossaire. Par exemple : [(#TEXTE*|propre|cs_glossaire)] qui serait un équivalent de [(#TEXTE)]

    • ahrg j’suis trop c... j’avais vérifié pourtant ben c’était bien une petite * qui trainait ......

      En tout cas merci pour le coup de main et le plugin

    Répondre à ce message

  • 2
    Philippe

    Bonjour à tous et merci pour ce plugin pratique ! Toutefois il semble ne pas prendre en compte les mots accentués. Je viens de le tester sur l’article situé sur ce lien http://thymele.net/junior/spip.php?article3 et pour lequel j’ai créé, dans le groupe de mots-clé Glossaire, le mot-clé Thymélé sans succès. L’occurence du terme sur l’article n’est jamais relevée (que j’écrive indifféremment le mot-clé en majscule ou non, avec ou sans accents) alors q’un peu plus bas (pour l’exemple) le nom Flane est, lui, correctement géré... est-ce une limitation du système ou serait-ce que je m’y prends comme un pied ? ;-)

    • Merci pour le retour de bug. Dans la fonction de recherche, les limites de mot \b excluaient en effet certains accents. La dernière mise à jour du plugin règle-t-elle le problème ?

    • Philippe

      Je suis désolé de n’avoir pu répondre plus vite ! En vérité, je viens juste de voir votre réponse et de vérifier la question de la détection des mots possédant des caractères accentués... ça marche ! A présent SPIP indexe parfaitement les mots enrichissant le glossaire comme vous pourrez le constater en visitant ce lien : http://thymele.net/La-Compagnie-Thymele.html. Le mot “Thymélé” situé dans le texte est enfin associé à sa définition ! Merci beaucoup pour cet utilitaire très pratique et bravo encore !!!

    Répondre à ce message

  • 2

    Bonjour,

    J’ai eu la géniale idée de définir le mot-clé SPIP ...

    J’avoue qu’il m’a fallu un certain temps pour comprendre que

    [code]<p class=« spip » .... [code]

    était tout simplement interprété par le glossaire.

    Le résultat est étonnant !

    Peut-être est-il possible de ne pas interpréter les attributs des balises HTML ?

    • Oups, j’ai validé trop vite :

      Le mot-clé SPIP est interprété dans :

      <p class="spip" ....

    • Eh oui, le résultat est presque humoristique ;-)

      Merci du retour de bug, ya pas de raison que SPIP lui-même soit exclu du glossaire ! J’espère que les devs ne passeront pas par ici pour voir ça ;-)

      L’intérieur des balises HTML contenant le mot recherché ( entre < et >) est maintenant protégé.

    Répondre à ce message

  • François Daniel Giezendanner

    Bravo et merci pour cette excellente fonctionnalité ajoutée au plugin « Couteau Suisse ».

    FDG

    Répondre à ce message

Ajouter un commentaire

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

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

Merci d’avance pour les personnes qui vous aideront !

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

Qui êtes-vous ?
[Se connecter]

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

Ajoutez votre commentaire ici

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

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom