Changeset 35046 in spip-zone


Ignore:
Timestamp:
Feb 9, 2010, 4:58:40 PM (10 years ago)
Author:
patfr@…
Message:

Glossaire Interne : se dote d'une vérification de la base de donnée au cas où un mot serait caché par un autre.
Ex : "La France" caché par "France"
+ qq simplifications de code
+ syntaxe SPIP 2.0 pour la BD

Location:
_plugins_/couteau_suisse
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/couteau_suisse/action/action_rapide.php

    r34655 r35046  
    88#-----------------------------------------------------#
    99if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
     10
     11function redirige_vers_exec($params=array()) {
     12        $url = urldecode(_request('redirect'));
     13        foreach($params as $p=>$v) $url = parametre_url($url, $p, $v, '&');
     14        redirige_par_entete($url);
     15}
    1016
    1117function action_action_rapide_dist() {
  • _plugins_/couteau_suisse/lang/couteau_fr.php

    r34772 r35046  
    99        '2pts' => '@objet@ :',
    1010        'test_manuel'=>'Test manuel',
     11        'test_base'=>'Test de la base de données',
    1112        'base_donnees'=>'Base de données',
    1213
  • _plugins_/couteau_suisse/lang/couteauprive_fr.php

    r35021 r35046  
    311311        'glossaire_css' => 'Solution CSS',
    312312        'glossaire_js' => 'Solution JavaScript',
     313        'glossaire_erreur' => 'Le mot «@mot1@» rend indétectable le mot «@mot2@»',
     314        'glossaire_inverser' => 'Correction proposée : inverser l\'ordre des mots en base.',
     315        'glossaire_ok' => 'La liste des @nb@ mot(s) étudié(s) en base semble correcte.',
    313316        'guillemets:description' => 'Remplace automatiquement les guillemets droits (") par les guillemets typographiques de la langue de composition. Le remplacement, transparent pour l\'utilisateur, ne modifie pas le texte original mais seulement l\'affichage final.',
    314317        'guillemets:nom' => 'Guillemets typographiques',
  • _plugins_/couteau_suisse/outils/glossaire_fonctions.php

    r34839 r35046  
    2525// Separateur utilise pour fabriquer le titre de la fenetre de glossaire (fichiers fonds/glossaire_xx.html).
    2626@define('_GLOSSAIRE_TITRE_SEP', '<br />');
    27 // chaine pour interroger la base
    28 @define('_GLOSSAIRE_QUERY', 'SELECT id_mot, titre, texte, descriptif FROM spip_mots WHERE type=' . glossaire_groupes() . ' ORDER BY id_mot ASC');
    29 // TODO : QUERY pour SPIP 2.0
    30 
     27// chaine pour interroger la base (SPIP <= 1.92)
     28if(!defined('_SPIP19300'))
     29        @define('_GLOSSAIRE_QUERY', 'SELECT id_mot, titre, texte, descriptif FROM spip_mots WHERE type=' . glossaire_groupes() . ' ORDER BY id_mot ASC');
     30               
    3131// surcharge possible de cette fonction glossaire_generer_url_dist par : glossaire_generer_url($id_mot, $titre)
    3232// si elle existe, elle sera utilisee pour generer l'url cliquable des mots trouves
     
    5151function cs_glossaire_titres($titre) {
    5252        if(strpos($titre, ',')===false) return $titre;
    53         $mots = array();
    54         foreach (explode(_GLOSSAIRE_TITRE_BASE_SEP, str_replace('</','@@tag@@',$titre)) as $m)
    55                 // interpretation des expressions regulieres grace aux virgules : ,un +mot,i
    56                 if(strpos($m = trim($m), ',')===false) $mots[] = $m;
    57         return count($mots)?str_replace('@@tag@@','</',join(_GLOSSAIRE_TITRE_SEP, $mots)):'??';
     53        list(,,$mots) = glossaire_parse($titre);
     54        return $mots;
    5855}
    5956
     
    9693}
    9794
     95// renvoie le tableau des mots du glossaire
     96function glossaire_query_tab() {
     97        // interrogation personnalisee de la base
     98        if(defined('_GLOSSAIRE_QUERY')) {
     99                $res = array();
     100                $fetch = function_exists('sql_fetch')?'sql_fetch':'spip_fetch_array';
     101                $query = spip_query(_GLOSSAIRE_QUERY);
     102                while($r = $fetch($query)) $res[] = $r;
     103                return $res;
     104        }
     105        return sql_allfetsel('id_mot,titre,texte,descriptif', 'spip_mots', 'type='.glossaire_groupes(), '', 'id_mot ASC');
     106}
     107
     108// parse toutes les formes du titre d'un mot-cle du glossaire
     109// prendre en compte les formes du mot : architrave/architraves
     110function glossaire_parse($titre) {
     111        $mots = $regs = $titres = array();
     112        foreach(explode(_GLOSSAIRE_TITRE_BASE_SEP, str_replace('</','@@tag@@',$titre)) as $m) {
     113                // interpretation des expressions regulieres grace aux virgules : ,un +mot,i
     114                $m = trim(str_replace('@@tag@@','</',$m));
     115                if(strncmp($m,',',1)===0) $regs[] = $m;
     116                else {
     117                        $mots[] = charset2unicode($m);
     118                        $titres[] = $m;
     119                }
     120        }
     121        $titres = count($titres)?join(_GLOSSAIRE_TITRE_SEP, $titres):'??';
     122        if(count($mots)) {
     123                $mots = array_unique($mots);
     124                array_walk($mots, 'cs_preg_quote');
     125                $mots = glossaire_accents(join('|', $mots));
     126        } else $mots = '';
     127        return array($mots, $regs, $titres);
     128}
     129
     130function glossaire_gogogo($texte, $mots, $limit, &$unicode) {
     131        // prudence 2 : on protege TOUTES les balises HTML comprenant le mot
     132        if (strpos($texte, '<')!==false)
     133                $texte = preg_replace_callback(",<[^>]*(?:$mots)[^>]*>,Ui", 'glossaire_echappe_balises_callback', $texte);
     134        // prudence 3 : en iso-8859-1, (\W) comprend les accents, mais pas en utf-8... Donc on passe en unicode
     135        if(($GLOBALS['meta']['charset'] != 'iso-8859-1') && !$unicode)
     136                { $texte = charset2unicode($texte); $unicode = true; }
     137        // prudence 4 : on neutralise le mot si on trouve un accent (HTML ou unicode) juste avant ou apres
     138        if (strpos($texte, '&')!==false) {
     139                $texte = preg_replace_callback(',&(?:'._GLOSSAIRE_ACCENTS.");(?:$mots),i", 'glossaire_echappe_balises_callback', $texte);
     140                $texte = preg_replace_callback(",(?:$mots)&(?:"._GLOSSAIRE_ACCENTS.');,i', 'glossaire_echappe_balises_callback', $texte);
     141        }
     142        // a chaque mot reconnu, on pose une balise temporaire cryptee
     143        return trim(preg_replace_callback(",(?<=\W)(?:$mots)(?=\W),i", "glossaire_echappe_mot_callback", " $texte ", $limit));
     144}
     145
    98146// cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script|acronym|cite|a
    99147function cs_rempl_glossaire($texte) {
     
    106154        static $limit, $glossaire_generer_url, $glossaire_generer_mot, $glossaire_array = NULL;
    107155        if(!isset($glossaire_array)) {
    108                 $glossaire_array = array();
    109                 // compatibilite SPIP 1.92
    110                 $fetch = function_exists('sql_fetch')?'sql_fetch':'spip_fetch_array';
    111                 $query = spip_query(_GLOSSAIRE_QUERY);
    112                 while($r = $fetch($query)) $glossaire_array[] = $r;
     156                $glossaire_array = glossaire_query_tab();
    113157                $glossaire_generer_url = function_exists('glossaire_generer_url')?'glossaire_generer_url':'glossaire_generer_url_dist';
    114158                $limit = defined('_GLOSSAIRE_LIMITE')?_GLOSSAIRE_LIMITE:-1;
    115159                $glossaire_generer_mot = function_exists('glossaire_generer_mot')
    116 //                      ?'glossaire_generer_mot(\'\\2\', \'\\1\')':'glossaire_generer_mot_dist(\'\\2\', \'\\1\')';
    117                         ?'glossaire_generer_mot(\'\\2\', \'\\1\')':'\'\\1\'';
     160                        ?'glossaire_generer_mot(\'\\2\', \'\\1\')':'\'\\1\''; // 'glossaire_generer_mot_dist(\'\\2\', \'\\1\')';
    118161                $glossaire_generer_mot = '"<a $table1[\\2]_".$GLOBALS["gl_i"]++."\' class=\'cs_glossaire\'><span class=\'gl_mot\'>".'.$glossaire_generer_mot.'."</span>$table2[\\2]</a>"';
    119162        }
     
    127170        $mot_contexte=$GLOBALS['contexte']['id_mot']?$GLOBALS['contexte']['id_mot']:_request('id_mot');
    128171        foreach ($glossaire_array as $mot) if (($gloss_id = $mot['id_mot']) <> $mot_contexte) {
    129                 // prendre en compte les formes du mot : architrave/architraves
     172                // parser le mot-cle du glossaire
    130173                // contexte de langue a prendre en compte ici
    131                 $les_mots = $les_regexp = $les_titres = array();
    132                 foreach (explode(_GLOSSAIRE_TITRE_BASE_SEP, str_replace('</','@@tag@@',$titre = extraire_multi($mot['titre']))) as $m) {
    133                         // interpretation des expressions regulieres grace aux virgules : ,un +mot,i
    134                         $m = trim(str_replace('@@tag@@','</',$m));
    135                         if(strncmp($m,',',1)===0) $les_regexp[] = $m;
    136                         else {
    137                                 $les_mots[] = charset2unicode($m);
    138                                 $les_titres[] = $m;
    139                         }
    140                 }
    141                 $les_titres = count($les_titres)?join(_GLOSSAIRE_TITRE_SEP, $les_titres):'??';
     174                list($les_mots, $les_regexp, $les_titres) = glossaire_parse($titre=extraire_multi($mot['titre']));
    142175                $mot_present = false;
    143176                if(count($les_regexp)) {
    144177                        // a chaque expression reconnue, on pose une balise temporaire cryptee
    145178                        // ce remplacement est puissant, attention aux balises HTML ; par exemple, eviter : ,div,i
    146                         $texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", " $texte ", $limit);
     179                        $texte = preg_replace_callback($les_regexp, "glossaire_echappe_mot_callback", $texte, $limit);
    147180                        // TODO 1 : sous PHP 5.0, un parametre &$count permet de savoir si un remplacement a eu lieu
    148181                        // et s'il faut construire la fenetre de glossaire.
     
    151184                        $mot_present = true;
    152185                }
    153                 if(count($les_mots)) {
    154                         $les_mots = array_unique($les_mots);
    155                         array_walk($les_mots, 'cs_preg_quote');
    156                         $les_mots = glossaire_accents(join('|', $les_mots));
     186                if($les_mots) {
    157187                        if(preg_match(",\W(?:$les_mots)\W,i", $texte)) {
    158                                 // prudence 2 : on protege TOUTES les balises HTML comprenant le mot
    159                                 if (strpos($texte, '<')!==false)
    160                                         $texte = preg_replace_callback(",<[^>]*(?:$les_mots)[^>]*>,Ui", 'glossaire_echappe_balises_callback', $texte);
    161                                 // prudence 3 : en iso-8859-1, (\W) comprend les accents, mais pas en utf-8... Donc on passe en unicode
    162                                 if(($GLOBALS['meta']['charset'] != 'iso-8859-1') && !$unicode)
    163                                         { $texte = charset2unicode($texte); $unicode = true; }
    164                                 // prudence 4 : on neutralise le mot si on trouve un accent (HTML ou unicode) juste avant ou apres
    165                                 if (strpos($texte, '&')!==false) {
    166                                         $texte = preg_replace_callback(',&(?:'._GLOSSAIRE_ACCENTS.");(?:$les_mots),i", 'glossaire_echappe_balises_callback', $texte);
    167                                         $texte = preg_replace_callback(",(?:$les_mots)&(?:"._GLOSSAIRE_ACCENTS.');,i', 'glossaire_echappe_balises_callback', $texte);
    168                                 }
    169                                 // a chaque mot reconnu, on pose une balise temporaire cryptee
    170                                 $texte = preg_replace_callback(",(?<=\W)(?:$les_mots)(?=\W),i", "glossaire_echappe_mot_callback", " $texte ", $limit);
     188                                $texte = glossaire_gogogo($texte, $les_mots, $limit, $unicode);
    171189                                $mot_present = true;
    172190                        }
     
    187205        // remplacement final des balises posees ci-dessus
    188206        $GLOBALS['gl_i']=0;
    189         return trim(preg_replace(",@@GLOSS(.*?)#([0-9]+)@@,e", $glossaire_generer_mot, echappe_retour($texte, 'GLOSS')));
     207        return preg_replace(",@@GLOSS(.*?)#([0-9]+)@@,e", $glossaire_generer_mot, echappe_retour($texte, 'GLOSS'));
    190208}
    191209
  • _plugins_/couteau_suisse/outils/spam_action_rapide.php

    r34772 r35046  
    4545// fonction {$outil}_{$arg}_action() appelee par action/action_rapide.php
    4646function spam_test_0_action() {
    47         // tester l'anti-spam
     47        // lancer le test de l'anti-spam
    4848        // aucune action, le test est pris en charge par ?exec=action_rapide
    49         redirige_par_entete(parametre_url(urldecode(_request('redirect')), 'ar_message', _request('ar_message'), '&'));
     49        redirige_vers_exec(array('ar_message' =>_request('ar_message')));
    5050}
    5151
    5252function spam_test_1_action() {
    53         // tester l'anti-spam sur les messages de la base
    54         redirige_par_entete(parametre_url(urldecode(_request('redirect')), 'test_bd', 1, '&'));
     53        // lancer le test sur les messages de la base
     54        redirige_vers_exec(array('test_bd'=>1));
    5555}
    5656
  • _plugins_/couteau_suisse/outils/type_urls_action_rapide.php

    r34989 r35046  
    124124        $q = "UPDATE spip_$table SET url_propre="._q($url)." WHERE id_$type=$id";
    125125        spip_query($q);
    126         redirige_par_entete(parametre_url(parametre_url(urldecode(_request('redirect')),
    127                 'ar_num_objet', _request('ar_num_objet'), '&'), 'ar_type_objet', _request('ar_type_objet'), '&'));
     126        redirige_vers_exec(array('ar_num_objet' => _request('ar_num_objet'), 'ar_type_objet' => _request('ar_type_objet')));
    128127}
    129128// fonction {$outil}_{$arg}_action() appelee par action/action_rapide.php
     
    147146                }
    148147        }
    149         redirige_par_entete(parametre_url(parametre_url(urldecode(_request('redirect')),
    150                 'ar_num_objet', _request('ar_num_objet'), '&'), 'ar_type_objet', _request('ar_type_objet'), '&'));
     148        redirige_vers_exec(array('ar_num_objet' => _request('ar_num_objet'), 'ar_type_objet' => _request('ar_type_objet')));
    151149}
    152150
  • _plugins_/couteau_suisse/plugin.xml

    r35021 r35046  
    22        <nom><multi>Swiss Knife[fr]Le Couteau Suisse[ca]El Ganivet Su&#237;s[ar]&#1587;&#1603;&#1610;&#1606; &#1575;&#1604;&#1580;&#1610;&#1576;[nl]Het Zwitserland Mes[gl]A navalla su&#237;za[es]La Navaja Suiza[de]Schweizer Taschenmesser[tr]&#304;svi&#231;re &#199;ak&#305;s&#305;[br]Ar Gontell Suis[pt_br]Canivete Su&#237;&#231;o[ast]La Navaya Suiza[gl]A navalla su&#237;za[ro]Cu&#355;itul Elve&#355;ian[it]Coltellino Svizzero</multi></nom>
    33        <icon>img/couteau-50.gif</icon>
    4         <version>1.8.13.10</version>
     4        <version>1.8.13.11</version>
    55        <auteur>Patrice Vanneufville
    66_ &#169; 2007-2009 - Distribu&#233; sous licence GPL
Note: See TracChangeset for help on using the changeset viewer.