Dictionnaires

Présentation

Le plugin Dictionnaires sert à définir des choses, regroupées dans des dictionnaires. Une définition peut avoir plusieurs statuts comme les articles, tandis qu’un dictionnaire peut juste être actif ou inactif. Lorsqu’un dictionnaire est activé, cela signifie que ses définitions seront cherchés dans tous les textes du site.

Par défaut, deux types de définitions sont disponibles : normale ou abréviation (sigle, acronyme ou autre).

Chaque définition peut lister des termes supplémentaires qui seront reconnus aussi (le pluriel par exemple). Pour les abréviations, le système ajoute automatiquement une version avec p.o.i.n.t.s, il n’est dont pas nécessaire de les ajouter vous-mêmes.

Un plugin proche existe : le plugin Glossaire mais SPIP a tendance à mouliner lorsque la liste des définitions (un groupe de mots-clés) est trop importante. Moins proche et entièrement manuel, le raccourci Wikipedia de SPIP : [?Wikipedia].

L’avantage du plugin Dictionnaires est qu’il demande moins de ressources et qu’il présente deux nouveaux objets qui suivent l’analogie Rubriques/Articles et peuvent chacun recevoir des logos et des documents.

Fonctionnement

Lorsqu’un dictionnaire est actif, toutes ses définitions publiées sont recherchées dans les textes qui passent par la fonction propre(). Les termes trouvés sont alors remplacés par une fonction personnalisable (cette fonction est aussi personnalisable suivant le type de définition).

La fonction par défaut ajoute un lien « Définition » en note <sup> après le mot, lien qui pointe vers la page de la définition (pour info, le plugin fournit des squelettes compatibles avec Zpip pour afficher une définition et un dictionnaire).

Ce comportement n’est fait que pour les premières occurrences de chaque texte. Ceci est personnalisable depuis la page de configuration du plugin.

Une option « sensible à la casse » est disponible pour chaque définition. Ceci indique au détecteur de prendre en compte uniquement le terme exact (« ce » ne sera pas reconnu pour « CE »).

Pour chaque dictionnaire, vous pouvez définir le type par défaut des nouvelles définitions qui y seront crées.

Lors de l’installation, le plugin propose une fonction d’importation des acronymes définis à l’aide du plugin Forms&Tables. Les éléments sont importés en tant qu’abréviations (modifiable ensuite).

Installation du plugin

L’installation se fait par la méthode habituelle, Dictionnaires ne demande que le plugin Saisies comme plugin complémentaire pour fonctionner.

Configuration du plugin

Une fois l’installation faite, le menu « Configuration » de SPIP affiche un item « Dictionnaires ».

Par ce lien, vous arrivez à la page « Configurer les dictionnaires » qui propose deux cases déjà cochées :

  • Remplacer uniquement la première occurrence d’une définition
  • Remplacer uniquement la première occurrence d’une abréviation

Cela vous permet d’afficher les définitions sur tous les termes d’un texte ou seulement la premier fois qu’ils sont rencontrés.

La constante define('DICTIONNAIRES_DETECTION_MANUELLE', true); permet de spécifier que l’auteur des squelettes se charge d’appliquer le filtre |definitions sur les balises souhaitées, et non sur tout les textes qui passent par la fonction propre().

Saisie des dictionnaires

Il faut d’abord créer un ou des dictionnaires et, pour chacun, créer des définitions. Le menu « Édition » de SPIP contient aussi une entrée « Dictionnaires ». Il vous suffit de cliquer sur « Ajouter un nouveau dictionnaire ».

Liste des champs pour l’objet Dictionnaire :

  • Titre (champ obligatoire)
  • Descriptif (champ)
  • Abréviation par défaut (case à cocher)

Cet objet a deux statuts possibles : Inactif (par défaut)/Actif. Un dictionnaire actif aura ses termes détectés dans les contenus du site.

Accessoirement, le plugin permet d’utiliser un raccourci supplémentaire : [mon texte->dictionnaireXXX].

Saisie des définitions

Une fois un dictionnaire créé, sa page de "vue" propose d’ajouter des définitions.

Cliquer sur « Ajouter une nouvelle définition » donne une liste de champs pour l’objet Définition :

  • Titre (champ obligatoire)
  • Dictionnaire (menu déroulant, obligatoire)
  • Texte (champ)
  • Termes (champ listant "Des termes supplémentaires qui permettront de détecter la définition, séparés par des virgules.") [1]
  • Abréviation (case à cocher, « Est-ce un sigle, un acronyme ou autre abréviation ? »)
  • Sensibilité à la casse (case à cocher : « La détection de ce terme sera sensible aux minuscules et majuscules. »)

Cet objet a trois statuts possibles : « proposé à l’évaluation » (par défaut)/« publié en ligne »/« à la poubelle ».

La date de création d’une définition ne peut être modifiée que sous le statut « publié en ligne ».

Accessoirement, le plugin permet — ici aussi — d’utiliser un raccourci supplémentaire : [mon texte->definitionXXX].

Utilisation dans vos squelettes

Comme cité plus haut, le plugin fournit des squelettes compatibles avec Zpip pour afficher une définition et un dictionnaire. Vous pouvez consulter ces squelettes dans le répertoire contenu du plugin.

Le plugin met aussi aussi à disposition deux modèles utilisables depuis vos squelettes ou le texte de vos pages :
-  <dictionnaires> affiche la liste des dictionnaires
-  <dictionnaire> affiche la liste des définitions d’un dictionnaire.

Les balises de l’objet « dictionnaire » sont :

  • #ID_DICTIONNAIRE
  • #URL_DICTIONNAIRE
  • #LOGO_DICTIONNAIRE
  • #TITRE
  • #DESCRIPTIF

Les balise de l’objet « definition » sont :

  • #ID_DEFINITION
  • #URL_DEFINITION
  • #LOGO_DEFINITION
  • #TITRE
  • #TEXTE
  • #TERMES
  • #INTRODUCTION

Notes

[1Par exemple, pour la définition « Dioïque », vous pouvez aussi lister les termes : dioïques, dioïcie ; pour la définition « Tomenteux », les termes, tomenteuse, tomenteuses…

Discussion

29 discussions

  • 4

    Bonjour,
    Est-ce qu’il existe #URL_EXTERNE pour utiliser dans les squelettes ?
    Merci !

    Répondre à ce message

  • 2

    Bonjour,
    Je viens d’effectuer la mise à jour du plugin SAISIES de 2.5.18 vers 2.5.20 et je rencontre un bug avec la page définition.

    Quand je souhaite modifier une définition (« exec=definition_edit »), j’obtiens des « 1 » dans tous les champs. Et si j’enregistre, c’est bien-sûr la cata. Tous mes champs sont effacés et remplacés par des « 1 ».

    Par contre, pour l’enregistrement d’une nouvelle définition, tout fonctionne normalement.

    (Avec Dictionnaires V1.1.2).

    Amicalement.

    Répondre à ce message

  • 2
    Aymeric

    Bonjour,

    Ce plugin s’avère très utile mais je n’ai pas trouvé comment l’empêcher de couper les libellés (à 75 caractères je crois).

    Il se trouve que je dois faire face à de très longs acronymes :)

    Merci de votre aide.

    Répondre à ce message

  • 6

    Bonjour,

    J’ai constaté une anomalie sur un de nos sites en utilisant la version 1.0.4, lorsque l’on créé une définition dont le titre possède un accent ça plante le site en front office et affiche cette erreur :

    Warning : preg_replace_callback() [function.preg-replace-callback] : Compilation failed : invalid UTF-8 string at offset 22 in /xxx/plugins/_externals/dictionnaires/dictionnaires_fonctions.php on line 50

    Je suis en SPIP 3.0.19 et j’utilise une surcharge des filtres dictionnaires_remplacer_defaut et dictionnaires_remplacer_abbr de cette manière :

    function dictionnaires_remplacer_defaut($mot, $definition) {
    	if (!isset($definition['url']) OR !$url = $definition['url']) {
    		$url = generer_url_entite($definition['id_definition'],'definition');
    	}
      
      return "<abbr class="popoverLink" rel="popover" data-toggle="popover" data-placement="top" data-html="true" title="".trim(attribut_html(supprimer_tags(typo($definition['titre']))))."" data-container="body" data-content="".htmlspecialchars(propre($definition['texte']), ENT_QUOTES)."">".$mot."</abbr>";
      
    }
    
    function dictionnaires_remplacer_abbr($mot, $definition){
    	return "<abbr class="popoverLink" rel="popover" data-toggle="popover" data-placement="top" data-html="true" title="".trim(attribut_html(supprimer_tags(typo($definition['titre']))))."" data-container="body" data-content="".htmlspecialchars(propre($definition['texte']), ENT_QUOTES)."">".$mot."</abbr>";
    }

    Ce problème je ne le constate pas sur un SPIP de base, j’en déduis qu’il s’agit d’une particularité de notre site.

    Si vous avez une idée... merci d’avance :)

    Freed

    • J’ai ajouté une option (u) aux regex pour mieux prendre en compte les accents (suite à une discussion sur ce forum) :
      http://zone.spip.org/trac/spip-zone/changeset/88279

      La doc dit :

      Cette option désactive les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec Perl. Les chaînes sont traitées comme des chaînes UTF-8. Cette option est disponible en PHP 4.1.0 et plus récent.

    • Bonjour RastaPopoulos,
      Merci pour cet update du plugin, cependant en le testant j’obtiens la même erreur :(

      Warning: preg_replace_callback() [function.preg-replace-callback]: Compilation failed: invalid UTF-8 string at offset 22 in /xxx/plugins/_externals/dictionnaires/dictionnaires_fonctions.php on line 50
      
    • Non mais le plugin n’a pas bougé, c’est une modif qui date d’il y a 4 mois et qui justement pourrait être en rapport avec ton erreur.

    • Le problème que tu décris ressemble pas mal à celui corrigé ici :

      http://zone.spip.org/trac/spip-zone/changeset/91004/

      Tu as testé avec la version 1.0.5 ?

    • Oui je suis passé en 1.0.5 ce matin pensant qu’il s’agissait d’une correction du problème

      Le lien que tu viens de me donner semble bien correspondre à un des contats de mon problème (ces symptômes se produisaient en production seulement)

      Autre info :
      J’obtiens ces erreurs de preg_replace_callback en environnement de développement et recette
      En production j’avais pas d’erreurs affichées (peut-etre que l’environnement n’affiche pas les erreurs PHP) mais tous les textes disparaissaient.
      En local (XXAMP) je n’ai pas d’erreur, ni de disparition de texte, en revanche lorsque j’ai un terme avec un accent il semble ne pas être traité

    • Re-bonjour,

      Finalement en ayant livré la nouvelle version du plugin en production (1.0.5) le problème de textes vides était toujours présent, en réalité les erreurs PHP n’étant pas affichées en prod, nous ne voyions pas le problème qui finalement était le même (preg_replace_callback)

      Nous avons choisi de désactiver le filtre |definitions sur les textes en attendant de trouver une solution

      PS : notre serveur de production est en PHP 5.4.40 , je ne sais pas si ça peut jouer sur quelque chose.

      Merci

    Répondre à ce message

  • 2

    Bonjour,
    Je rencontre un souci avec ce plugin lorsque je tente d’afficher une liste d’articles avec pagination en AJAX et qu’un terme provenant du dictionnaire se trouve dans la balise #INTRODUCTION (c’est à dire en début de texte quoi)
    J’obtiens un « Aborted » sur l’url appelée.
    Existe-t-il un filtre qui désactive le dictionnaire volontairement sur certains textes ?

    Merci d’avance.
    Freed

    • La balise #INTRODUCTION passe par propre(), donc par la détection auto des définitions.

      Mais je ne saurais pas dire pourquoi en ajax ça ferait tout planter, ya pas de raison immédiate qui me vient à l’esprit. Peut-être qu’il faudrait détecter qu’on est dans un hit ajax (il me semble qu’il y a une globale ou un truc pour savoir ça) et ne pas lancer la machinerie dans ce cas. Mais bon yorait pas vraiment de raison de faire ça, un même contenu aurait alors des fois des définitions, des fois pas, suivant s’il est chargé en ajax ou pas, ce n’est pas très cohérent…

      Faudrait surtout comprendre pourquoi ça plante. :(

    • J’avais corrigé le problème en utilisant define(’DICTIONNAIRES_DETECTION_MANUELLE’, true) ; et en appliquant le filtre |definitions uniquement sur les textes complets.

      C’est un peu contourner le problème mais pas besoin d’avoir des définitions dans des listes selon moi.

    Répondre à ce message

  • 7

    Bonjour,

    Si j’ajoute le mot Marche dans un dictionnaire, le plugin fait un lien par exemple sur une partie du mot dé[marche]. Si j’enlève le é, ce mot n’est pas impacté...

    Voici un exemple du problème sur cette article (dans le paragraphe la cane de Montfort au 19e siècle) :
    -  > http://broceliande.brecilien.org/La-cane-de-Montfort-dans-les-traditions-populaires

    Quelqu’un rencontre-t’il ce phénomène ?

    Merci de plugin génial !

    • Oui c’est très bizarre, comme si la lettre accentuée était reconnu comme étant un caractère « hors-mot ».

      Le masque de recherche est généré ici :
      http://zone.spip.org/trac/spip-zone/browser/_plugins_/dictionnaires/trunk/inc/dictionnaires.php#L113

      Chaque masque DOIT débuter par [^\w@\.] càd PAS (^) un caractère de mot (\w) ni un arobase ni un point. La lettre accentuée est donc reconnue comme compatible avec ce truc, ce qui n’est pas normal (un problème de charset ?).

      Si tu es très fort en expression rationnelle ou si tu connais quelqu’un qui est très fort, je veux bien un indice parce que pour l’instant moi je ne vois pas. :(

    • j’ai essayé chez moi avec diverses lettres accentuées, je n’arrive pas à reproduire.

      SPIP 3.1.0-alpha — utf-8

      bibliothèque MySQL (5.0.51a) - serveur MySQL (5.5.41)

      interclassement utf8_general_ci

    • Si Claude n’arrive pas à reproduire, ça irait donc peut-être bien dans le sens d’un problème d’encodage, de charset chez Philippe.

    • Un test rapide sur https://regex101.com/ me montre que l’expression capture bien le caractère accentué de démarche. En ajoutant la modifieur u après la regex cela semble mieux.

      u modifier : unicode : Pattern strings are treated as UTF-16. Also causes escape sequences to match unicode characters

      Mais \w est locale-dependent : pour de l’UTF-8, ça implique le modificateur u sinon un setlocale préalable (encore faut-il que cette locale système soit disponible et active).

    • Philippe tu peux tester si en ajoutant « u » après le « s » à la fin du masque ça marche chez toi ? À l’endroit que j’ai pointé plus haut, la fin est ligne 122 :
      http://zone.spip.org/trac/spip-zone/browser/_plugins_/dictionnaires/trunk/inc/dictionnaires.php#L122

    • OK ça marche !

      Merci pour votre réactivité !

      Pour info, je suis sur SPIP 3.0.17 utf8, mySQL 5.5.41 interclassement utf8_general_ci.
      A noter que j’utilise le plugin Full Text.

    • Voilà j’ai commité sur les deux versions du plugin Philippe :
      http://zone.spip.org/trac/spip-zone/changeset/88279

    Répondre à ce message

  • 2

    A noter que le plugin permet de surcharger la sortie HTML

    Même s’il s’agit d’une mauvaise pratique en terme d’accessibilité de placer du contenu dans l’attribut title.

    Voici un exemple pour afficher la définition dans le titre d’un lien (pour réaliser une info-bulle type « tooltip »),
    on pourra ajouter dans mes_fonctions.php

    function dictionnaires_remplacer_defaut($mot, $definition) {
    	if (!isset($definition['url']) OR !$url = $definition['url']) {
    		$url = generer_url_entite($definition['id_definition'],'definition');
    	}
      
      return "<a class='tooltip' href='#' title='".trim(attribut_html(supprimer_tags(typo($definition['texte']))))."'>".$mot."</a>";
      
    }
    • Premièrement, il est possible de remplacer uniquement un seul type de définition, par exemple que les « abbr » :

      function dictionnaires_remplacer_abbr_dist($mot, $definition)

      Et deuxièmement, attention à ce que dit le commentaire dans le code, et qu’il faudrait que je rajoute dans la documentation :

      Fonction de remplacement par défaut pour les abréviations trouvées dans les textes
      Ceci est un EXEMPLE montrant qu’on peut mettre un truc différent pour un type de définition précis
      Mais ce code est une MAUVAISE PRATIQUE en accessibilité
      (car seuls les gens avec des yeux valides et un pointeur de souris ont accès à l’information

      Au niveau accessibilité, il ne faut pas que l’information se trouve uniquement dans le title.

      • Soit il faut un lien vers une autre page contenant la définition (une page par définition ou bien une grande page avec une ancre sur la bonne définition).
      • Soit il faut que les définitions se trouve dans la page courante, et qu’il y ait un lien pointant vers l’ancre de la bonne définition, exactement comme les notes de bas de page, par exemple. Après en javascript, on peut utiliser ces définitions de la page courante pour générer des infobulles, mais c’est une amélioration progressive en plus, qui vient après coup (tout comme il existe des JS pour afficher les notes de bas de page en infobulle, comme le plugin de b_b).
    • Tu as raison ^^.

      Pour des info-bulles, on m’a signalé le plugin bigfoot plus respectueux en accessibilité.

    Répondre à ce message

  • Je m’en suis sorti par une boucle recherche.
    Cela nécessite le plugin « Recherche Fulltext ».

    1. J’ai ajouté un fichier nommé « inc_recherche » dans mon squelettecontenant le code suivant :

    <BOUCLE_recherch(ARTICLES){recherche}{! par points}>
    <a class="bloc spip_in" href="#URL_ARTICLE">#TITRE</a>
    </BOUCLE_recherch>

    2. J’ai ajouté ces 2 lignes dans ma page :

    <INCLURE{fond=inc_recherche}{recherche="#TITRE"}>
    <INCLURE{fond=inc_recherche}{recherche="#TERMES|replace{',' , '" "'}|concat{'"'}}>           

    Je ne doute pas que tout cela soit perfectible, mais c’est une solution rapide.

    En parcourant le forum du plugin Fulltext, je me suis d’ailleurs aperçu qu’un autre développeur faisait le lien entre ces 2 plugins

    Répondre à ce message

  • 3

    Bonjour et merci pour ce plugin,

    Y a t-il un moyen de boucler les articles où sont présents les termes d’un dictionnaire ?

    Cordialement,

    • Salut, ça doit pouvoir se faire en bouclant sur les champs titre et termes des définitions associées à un dictionnaire. Puis ensuite, en bouclant sur les articles de ton site en cherchant les termes dans le texte des article.

    • Ça me parait très (TRES) couteux. Surtout ce qui est prévu (todolist) au départ, c’est de scanner un contenu dès qu’il est édité (un article par exemple) et d’ajouter le lien à la définition (il y a déjà une table definitions_liens de prévue dans la base). Bref : comme pour les documents quoi. Notamment pour l’afficher ensuite dans l’admin en-dessous de chaque définition.

    • Oui c’est coûteux, je proposais cette solution car je ne savais pas que c’est dans la todo :p Maintenant on le sait ^^

    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