Changeset 43826 in spip-zone


Ignore:
Timestamp:
Jan 23, 2011, 6:56:50 PM (8 years ago)
Author:
patfr@…
Message:

Le glossaire : introduction d'un filtre permettant de fabriquer une liste de mots reconnus par le glossaire dans un texte.

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})]

Le filtre |cs_mots_glossaire 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
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.

Location:
_plugins_/couteau_suisse
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/couteau_suisse/outils/glossaire_fonctions.php

    r39013 r43826  
    154154
    155155// cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script|acronym|cite|a
    156 function cs_rempl_glossaire($texte) {
     156// si $liste=true alors la fonction renvoie la liste des mots trouves
     157// chaque element du tableau renvoye est array('mot trouve', id_mot, 'lien mot', 'titre mot');
     158function cs_rempl_glossaire($texte, $liste=false) {
    157159        global $gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id;
    158160        // si [!glossaire] est trouve on sort
    159161        if(strpos($texte, _CS_SANS_GLOSSAIRE)!==false)
    160                 return str_replace(_CS_SANS_GLOSSAIRE, '', $texte);
     162                return $liste?array():str_replace(_CS_SANS_GLOSSAIRE, '', $texte);
    161163        // mise en static de la table des mots pour eviter d'interrroger la base a chaque fois
    162164        // attention aux besoins de memoire...
     
    206208                        $lien = $glossaire_generer_url($gloss_id, $titre);
    207209                        // $definition =strlen($mot['descriptif'])?$mot['descriptif']:$mot['texte'];
    208                         $table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons
    209                         $table2[$gloss_id] = recuperer_fond(
    210                                 defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css',
    211                                 array('id_mot' => $gloss_id, 'titre' => $les_titres,
    212                                         'texte' => glossaire_safe($mot['texte']),
    213                                         'descriptif' => glossaire_safe($mot['descriptif'])));
     210                        if($liste)
     211                                $table1[$gloss_id] = array($gloss_id, $lien, $les_titres);
     212                        else {
     213                                $table1[$gloss_id] = "href='$lien' name='mot$gloss_id"; // name est complete plus tard pour eviter les doublons
     214                                $table2[$gloss_id] = recuperer_fond(
     215                                        defined('_GLOSSAIRE_JS')?'fonds/glossaire_js':'fonds/glossaire_css',
     216                                        array('id_mot' => $gloss_id, 'titre' => $les_titres,
     217                                                'texte' => glossaire_safe($mot['texte']),
     218                                                'descriptif' => glossaire_safe($mot['descriptif'])));
     219                        }
    214220                }
    215221        }
    216222        $GLOBALS['toujours_paragrapher'] = $mem;
    217         // remplacement des echappements
    218         $texte = preg_replace(",@@E(\d+)@@,e", '$GLOBALS[\'gloss_ech\'][\\1]', $texte);
    219         // remplacement final des balises posees ci-dessus
    220223        $GLOBALS['gl_i'] = 0;
    221         $texte = preg_replace(",@@M(\d+)#(\d+)@@,e", $glossaire_generer_mot, $texte);
     224        if($liste) $texte = (preg_match_all(',@@M(\d+)#(\d+)@@,', $texte, $reg, PREG_SET_ORDER)
     225                        && array_walk($reg,
     226                create_function('&$v,$k,&$t1', '$v=array_merge(array($GLOBALS[\'gloss_mots\'][$v[1]]),$t1[$v[2]]);'), $table1)
     227                )?$reg:array();
     228        else {
     229                // remplacement des echappements
     230                $texte = preg_replace(',@@E(\d+)@@,e', '$GLOBALS[\'gloss_ech\'][\\1]', $texte);
     231                // remplacement final des balises posees ci-dessus
     232                $texte = preg_replace(',@@M(\d+)#(\d+)@@,e', $glossaire_generer_mot, $texte);
     233        }
    222234        // nettoyage
    223235        unset($gloss_id, $gloss_mots, $gloss_mots_id, $gloss_ech, $gloss_ech_id);
     
    225237}
    226238
     239// filtre appliquant l'insertion du glossaire
    227240function cs_glossaire($texte) {
    228241        return cs_echappe_balises('html|code|cadre|frame|script|acronym|cite|a', 'cs_rempl_glossaire', $texte);
    229242}
    230243
     244// filtre renvoyant la liste des mots trouves dans le texte
     245function cs_mots_glossaire($texte, $type='', $sep='') {
     246        if(strpos($texte, "<span class='gl_mot'>")!==false && preg_match_all(",'gl_mot'>(.*?)</span>,", $texte, $reg))
     247                // glossaire deja present, on simplifie donc le texte
     248                $texte = join('  ', $reg[1]);
     249        $mots = cs_echappe_balises('html|code|cadre|frame|script|acronym|cite|a', 'cs_rempl_glossaire', $texte, true);
     250        $lien = '$v="<a href=\"$v[2]\"';
     251        $titre = strpos($type,'_unique')===false?'str_replace("<br />"," / ", $v[3])':'array_shift(explode(_GLOSSAIRE_TITRE_SEP, $v[3]))';
     252        switch($type) {
     253                case '':return $mots;
     254                case 'id_mot':
     255                        array_walk($mots, create_function('&$v', '$v=$v[1];'));
     256                        break;
     257                case 'lien_mot':
     258                        array_walk($mots, create_function('&$v', $lien.'>$v[0]</a>";'));
     259                        break;
     260                case 'lien_titre': case 'lien_titre_unique':
     261                        array_walk($mots, create_function('&$v', $lien.'>".'.$titre.'."</a>";'));
     262                        break;
     263                case 'nuage': case 'nuage_unique':
     264                        $stats = array(); $min = 999999; $max = 0;
     265                        foreach($mots as $m) $stats[$m[1]]++;
     266                        $m = min($stats); $d = max($stats) - $m;
     267                        array_walk($stats, create_function('&$v', "\$v=round((\$v-$m)*9/$d)+1;")); // valeurs de 1 a 10
     268                        array_walk($mots, create_function('&$v,$k,&$s', $lien.' class=\"nuage".$s[$v[1]]."\">".'.$titre.'."</a>";'), $stats);
     269                        break;
     270                default:return "#GLOSSAIRE/$type?";
     271        }
     272        $mots = array_unique($mots);
     273        return strlen($sep)?join($sep, $mots):$mots;
     274}
     275
    231276?>
  • _plugins_/couteau_suisse/plugin.xml

    r43730 r43826  
    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.33.01</version>
     4        <version>1.8.33.02</version>
    55        <version_base>1.0</version_base>
    66        <auteur>Patrice Vanneufville
Note: See TracChangeset for help on using the changeset viewer.