source: spip-zone/_plugins_/dictionnaires/trunk/inc/dictionnaires.php @ 57442

Last change on this file since 57442 was 57442, checked in by real3t@…, 8 years ago
  • Une chaîne de langue qui pourra être utile du côté public.
  • Limiter les bulles d'aide à 80 caractère.
  • Dans le tableau listant les définitions, limiter aussi à 80 caractères de prévisualisation
  • rajouter l'identifiant du dictionnaire concerner par chaque définition (pour pouvoir faire une fonction personnelle faisant le lien vers un dictionnaire contenant la définition)
File size: 5.5 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) return;
5
6/*
7 * Récupérer un tableau facilement utilisable de toutes les définitions en activité sur le site
8 * Une définition active est une définition publié ET dans un dico actif
9 *
10 * @return array Retourne un tableau des définitions
11 *      array(
12                array(
13                        'titre' => 'Truc',
14                        'texte' => 'Ma définition',
15                        'termes' => array('trucs', 'bidule'), // autres termes qui seront reconnus
16                        'type' => '' | 'abbr',
17                ),
18                array(
19                        ...
20                )
21 *      )
22 */
23function dictionnaires_lister_definitions($purger=false){
24        // Le nom du fichier de cache
25        $fichier_cache =  _DIR_CACHE.'definitions.txt';
26       
27        // Par défaut rien
28        static $definitions_actives;
29       
30        // Si ça contient déjà quelque chose à ce stade, c'est avec le static donc on ne fait rien d'autre
31        if ($definitions_actives and is_array($definitions_actives)){
32                return $definitions_actives;
33        }
34        else{
35                $definitions_actives = array();
36        }
37       
38        // Si on le demande explicitement où si la lecture du fichier ne marche pas, on recalcule
39        if (
40                $purger == true
41                or !lire_fichier($fichier_cache, $definitions_actives)
42                or !($definitions_actives = unserialize($definitions_actives))
43                or !is_array($definitions_actives)
44        ){
45                $definitions_actives = array();
46               
47                // On récupère tous les dictionnaires actifs
48                $dicos_actifs = sql_allfetsel('id_dictionnaire', 'spip_dictionnaires', 'actif = 1');
49                if ($dicos_actifs and is_array($dicos_actifs)){
50                        $dicos_actifs = array_map('reset', $dicos_actifs);
51               
52                        // À l'intérieur on récupère toutes les définitions publiées
53                        $definitions_publiees = sql_allfetsel(
54                                'id_dictionnaire, id_definition, titre, termes, type, texte',
55                                'spip_definitions',
56                                array(
57                                        sql_in('id_dictionnaire', $dicos_actifs),
58                                        'statut ='.sql_quote('publie')
59                                )
60                        );
61                       
62                        if ($definitions_publiees and is_array($definitions_publiees)){
63                                $definitions_actives = $definitions_publiees;
64                        }
65                }
66               
67                // On passe la liste des définitions actives dans un pipeline
68                $definitions_actives = pipeline('lister_definitions', $definitions_actives);
69               
70                // On traite maintenant le tableau pour ajouter des infos prêtes à l'emploi
71                foreach ($definitions_actives as $cle=>$definition){
72                        // Si les termes sont données en chaine, on coupe avec les virgules
73                        if (is_string($definition['termes'])){
74                                $definition['termes'] = array_map('trim', explode(',', $definition['termes']));
75                        }
76                        // Si c'est ni une string ni un tableau on met un tableau vide
77                        elseif (!is_array($definition['termes'])){
78                                $definition['termes'] = array();
79                        }
80                       
81                        // On ajoute le titre à la liste des termes reconnus
82                        $definition['termes'][] = $definition['titre'];
83                       
84                        // Si c'est une abbréviation, on reconnait automatique une version avec des p.o.i.n.t.s.?
85                        if ($definition['type'] == 'abbr'){
86                                $titre = strtolower($definition['titre']);
87                                $avec_points = $titre[0];
88                                for ($i=1 ; $i<strlen($titre) ; $i++){
89                                        $avec_points .= '.'.$titre{$i};
90                                }
91                                $definition['termes'][] = $avec_points;
92                                $definition['termes'][] = $avec_points.'.';
93                        }
94                       
95                        // On nettoie les termes = pas de truc vide, tout en minuscule, pas de doublons
96                        $definition['termes'] = array_filter($definition['termes']);
97                        $definition['termes'] = array_map('strtolower', $definition['termes']);
98                        $definition['termes'] = array_unique($definition['termes']);
99                       
100                        // On génère le masque de recherche
101                        $definition['masque'] = '{([^\w@\.]|^)('
102                                .join(
103                                        '|',
104                                        array_map(
105                                                create_function('$mot', 'return str_replace(".", "\.", $mot);'),
106                                                $definition['termes']
107                                        )
108                                )
109                                .')(?=([^\w]|\s|&nbsp;|$))}is';
110                       
111                        // Et voilà
112                        $definitions_actives[$cle] = $definition;
113                }
114               
115                // Si on a des définitions à mettre en cache, on les écrit
116                if ($definitions_actives and is_writeable(_DIR_CACHE)){
117                        ecrire_fichier($fichier_cache, serialize($definitions_actives));
118                }
119        }
120       
121        return $definitions_actives;
122}
123
124/*
125 * Lister les définitions par terme.
126 * Chaque clé du tableau est alors un terme reconnu, en minuscule.
127 * Une même définition peut donc se trouver plusieurs fois dans la liste, avec différentes clés.
128 */
129function dictionnaires_lister_definitions_par_terme(){
130        static $definitions_par_terme = array();
131        $definitions = dictionnaires_lister_definitions();
132       
133        if (!$definitions_par_terme and $definitions){
134                foreach ($definitions as $definition){
135                        foreach ($definition['termes'] as $terme){
136                                $definitions_par_terme[$terme] = $definition;
137                        }
138                }
139        }
140       
141        return $definitions_par_terme;
142}
143
144/*
145 * Fonction de remplacement par défaut pour les termes trouvés dans les textes
146 */
147function dictionnaires_remplacer_defaut_dist($mot, $definition){
148        return $mot
149                .'<sup><a href="'
150                .($definition['url']?$definition['url']:generer_url_entite($definition['id_definition'],'definition'))
151                .'" title="'._T('definition:titre_definition').': '.couper(trim(attribut_html(supprimer_tags(typo($definition['texte'])))),80).'">'
152                .'?'
153                .'</a></sup>';
154}
155
156/*
157 * Fonction de remplacement par défaut pour les abbréviations trouvées dans les textes
158 * Ceci est un EXEMPLE montrant qu'on peut mettre un truc différent pour un type de définition précis
159 * Mais ce code est une MAUVAISE PRATIQUE en accessibilité
160 * (car seuls les gens avec des yeux valides et un pointeur de souris ont accès à l'information)
161 */
162#function dictionnaires_remplacer_abbr_dist($mot, $definition){
163#       return '<abbr title="'.couper(trim(attribut_html(supprimer_tags(typo($definition['texte'])))),80).'">'.$mot.'</abbr>';
164#}
165
166?>
Note: See TracBrowser for help on using the repository browser.