Changeset 95082 in spip-zone


Ignore:
Timestamp:
Feb 11, 2016, 12:13:47 PM (4 years ago)
Author:
gouz@…
Message:

nouvelle version : utilisation du code du plugin couteau suisse qui est plus malin dans le remplacement en protégeant les éléments SPIP

Location:
_plugins_/frimousses
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/frimousses/frimousses_fonctions.php

    r94969 r95082  
    55}
    66
    7 function frimousses_liste_smileys() {
    8  
    9   /*Listes des images a associer aux smileys*/
    107
    11         $les_smileys = Array
    12                 (
    13                         'smiley-lol-16.png' => Array
    14                                 (
    15                                         ':-))',
    16                                         ':-D',
    17                                         ':))'
    18                                 )
    19                         ,
    20                         'smiley-kiss-16.png' => Array
    21                                 (
    22                                         ':-)*',
    23                                         ':-*'
    24                                 )
    25                         ,
    26                         'smiley-16.png' => Array
    27                                 (
    28                                         ':-)',
    29                                         ':O)',
    30                                         ':o)',
    31                                         ':0)'
    32                                 )
    33                         ,
    34                         'smiley-angel-16.png' => Array
    35                                 (
    36                                         'o:)',
    37                                         'O:)',
    38                                         '0:)'
    39                                 )
    40                         ,
    41                         'smiley-eek-16.png' => Array
    42                                 (
    43                                         '%-)',
    44                                         '8-)'
    45                                 )
    46                         ,
    47                         'smiley-wink-16.png' => Array
    48                                 (
    49                                         ';-)'
    50                                 )
    51                         ,
    52                         'smiley-sad-16.png' => Array
    53                                 (
    54                                         ':-((',
    55                                         ':-('
    56                                 )
    57                         ,
    58                         'smiley-yell-16.png' => Array
    59                                 (
    60                                         ':-O',
    61                                         ':-0'
    62                                 )
    63                         ,
    64                         'smiley-neutral-16.png' => Array
    65                                 (
    66                                         ':-|',
    67                                         '|-)'
    68                                 )
    69                         ,
    70                         'smiley-confuse-16.png' => Array
    71                                 (
    72                                         ':-/'
    73                                 )
    74                         ,
    75                         'smiley-razz-16.png' => Array
    76                                 (
    77                                         ':-p',
    78                                         ':-P'
    79                                 )
    80                         ,
    81                         'smiley-cry-16.png' => Array
    82                                 (
    83                                         ':\'-(',
    84                                         ':\'(',
    85                                         ':~('
    86                                 )
    87                         ,
    88                         'smiley-red-16.png' => Array
    89                                 (
    90                                         ':-...',
    91                                         ':...',
    92                                         ':-..',
    93                                         ':..',
    94                                         ':-.',
    95                                         ':.'
    96                                 )
    97                         ,
    98                         'smiley-zipper-16.png' => Array
    99                                 (
    100                                         ':-x'
    101                                 )
    102                         ,
    103                         'smiley-cool-16.png' => Array
    104                                 (
    105                                         'B-)'
    106                                 )
    107                         ,
    108                         'smiley-sleep-16.png' => Array
    109                                 (
    110                                         ':-@'
    111                                 )
    112                         ,
    113                         'smiley-money-16.png' => Array
    114                                 (
    115                                         ':-$'
    116                                 )
    117                         ,
    118                         'smiley-roll-16.png' => Array
    119                                 (
    120                                         ':-!'
    121                                 )
     8// balises de tracage, directement compatibles regexpr
     9// le separateur _FRIMOUSSES_HTMLX est supprime en fin de calcul
     10@define('_FRIMOUSSES_HTMLA', '<span class="frimoussesfoo htmla"></span>');
     11@define('_FRIMOUSSES_HTMLB', '<span class="frimoussesfoo htmlb"></span>');
     12@define('_FRIMOUSSES_HTMLX', '<span class="frimoussesfoo \w+"></span>');
    12213
    123                 );
    12414
    125         return $les_smileys;
     15// fonction ajoutant un smiley au tableau $tab
     16// ex : compile_smiley($tab, ':-*', 'icon_kiss', 'gif');
     17function compile_smiley(&$tab, $smy, $img, $ext='png') {
     18        static $path, $path2;
     19        if(!isset($path)) {
     20                $path = find_in_path('frimousses');
     21                $path2 = url_absolue($path);
     22                $pp = defined('_DIR_PLUGIN_PORTE_PLUME');
     23        }
     24        $espace = strlen($smy)==2?' ':'';
     25        $file = "$img.$ext";
     26        list(,,,$size) = @getimagesize("$path/$file");
     27        $tab['0']['0'][] = $espace.$smy;
     28        // cs_code_echappement evite que le remplacement se fasse a l'interieur des attributs de la balise <img>
     29        $tab[0][1][] = frimousses_code_echappement("$espace<img alt=\"$smy\" title=\"$smy\" class=\"no_image_filtrer format_$ext\" src=\"$path2/$file\" $size/>", 'FRIMOUSSES');
     30       
     31        $tab[0][2][] = $file;
     32        $tab['racc'][] = $smy;
     33        // pour le porte-plume
     34        $tab[0][4]['smiley_'.$img] = $file;
    12635}
    12736
    128 // Filtre SMILEYS - 19 Dec. 2004
    129 //
    130 // pour toute suggestion, remarque, proposition d'ajout d'un
    131 // smileys, etc ; reportez vous au forum de l'article :
    132 // http://www.spip-contrib.net/Smileys-III-Un-point-d-entree-pour
     37// cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
     38function liste_smileys($tab = array(0 => array(), 'racc' => array())) {
     39        // l'ordre des smileys ici est important :
     40        //  - les doubles, puis les simples, puis les courts
     41        //  - le raccourci insere par la balise #SMILEYS est la premiere occurence de chaque fichier
     42        $smileys = array(
     43        // attention ' est different de ’ (&#8217;) (SPIP utilise/ecrit ce dernier)
     44         ":&#8217;-))"=> 'pleure_de_rire',
     45         ":&#8217;-)"=> 'pleure_de_rire',
     46         ":&#8217;-D"   => 'pleure_de_rire',
     47         ":&#8217;-("   => 'triste',
     48       
     49        // les doubles :
     50         ':-))' => 'mort_de_rire',
     51         ':))'  => 'mort_de_rire',
     52         ":'-))"=> 'pleure_de_rire',
     53         ':-((' => 'en_colere',
    13354
    134 function frimousses_pre_typo($chaine) {
    135         if (strpos($chaine, ':')===false && strpos($chaine, ')')===false) {return $chaine;}
     55        // les simples :
     56         ';-)'  => 'clin_d-oeil',
     57         ':-)'  => 'sourire',
     58         ':-D'  => 'mort_de_rire',
     59         ":'-)"=> 'pleure_de_rire',
     60         ":'-D" => 'pleure_de_rire',
     61         ':-('  => 'pas_content',
     62         ":'-(" => 'triste',
     63         ':-&gt;' => 'diable',
     64         '|-)'  => 'rouge',
     65         ':o)'  => 'rigolo',
     66         'B-)'  => 'lunettes',
     67         ':-P'  => 'tire_la_langue',
     68         ':-p'  => 'tire_la_langue',
     69         ':-|'  => 'bof',
     70         ':-/'  => 'mouais',
     71         ':-O'  => 'surpris',
     72         ':-o'  => 'surpris',
    13673
    137         static $replace1 = null;
    138         static $replace2 = null;
    139         if (!$replace1 OR !$replace2){
    140                 foreach(frimousses_liste_smileys() as $file => $smileys) {
    141                         $alt = _T('smileys:'.$smileys[0]);
    142                         $alt = attribut_html($alt);
    143                         $r = "<img src=\"".find_in_path('frimousses/'.$file).'" width="16" height="16" alt="'.$alt.'" title="'.$alt.'" class="smiley" />';
    144                         // 4 regexp simples qui accrochent sur le premier char
    145                         // sont plus rapides qu'une regexp complexe qui oblige a des retour en arriere
    146                         foreach($smileys as $index => $smiley) {
    147                                 $smiley = preg_quote($smiley, '/');
    148                                 $replace1['/^'.$smiley.'/imsS'] = "<html>$r</html>";
    149                                 $replace1['/\s'.$smiley.'/imsS'] = "<html>&nbsp;$r</html>";
    150                                 $replace2['/^&nbsp;'.$smiley.'/imsS'] = "<html>$r</html>";
    151                                 $replace2['/&nbsp;'.$smiley.'/imsS'] = "<html>&nbsp;$r</html>";
    152                         }
    153                 }
    154   }
     74        // les courts : tester a l'usage...
     75        // attention : ils ne sont reconnus que s'il y a un espace avant !
     76         ':)'   => 'sourire',
     77         ':('   => 'pas_content',
     78         ';)'   => 'clin_d-oeil',
     79         ':|'   => 'bof',
     80         '|)'   => 'rouge',
     81         ':/'   => 'mouais',
     82        );
     83       
     84        foreach ($smileys as $smy=>$val)
     85                compile_smiley($tab, $smy, $val);
    15586
    156   $chaine = preg_replace(array_keys($replace1),array_values($replace1),$chaine);
    157         if (strpos($chaine,'&')!==false)
    158                 $chaine = preg_replace(array_keys($replace2),array_values($replace2),$chaine);
    159 
    160         return $chaine;
     87        return $tab;
    16188}
    16289
    163 function balise_SMILEY_DISPO($p) {
    16490
    165   $p->code = '"<ul class=\"listes-items smileys\">';
    166   $frimousses = frimousses_liste_smileys();
    167 
    168   foreach($frimousses as $file => $smiley) {
    169                 $alt = _T('smileys:'.$smiley[0]);
    170                 $alt = attribut_html($alt);
    171                 $smiley = "<span class=\\\"smiley_nom_variante\\\">".implode("</span> <span class=\\\"smiley_nom_variante\\\">", $smiley)."</span>";
    172                 $p->code .= "<li class=\\\"item smiley\\\"><span class=\\\"smiley_nom\\\">$smiley</span> <img  class=\\\"smiley_image\\\" src=\\\"".find_in_path("frimousses/$file")."\\\" width=\\\"16\\\" height=\\\"16\\\" alt=\\\"$alt\\\" title=\\\"$alt\\\"/> <span class=\\\"smiley_alt\\\" />$alt</span></li>\n";
    173   }
    174   $p->code .= '</ul>"';
    175   $p->type = 'html';
    176  
    177   return $p;
     91// fonction qui renvoie un tableau de smileys uniques
     92function smileys_uniques($smileys) {
     93        $max = count($smileys[1]);
     94        $new = array(array(), array(), array());
     95        for ($i=0; $i<$max; $i++) {
     96                if(!in_array($smileys[2][$i], $new[2])) {
     97                        $new[0][] = $smileys[0][$i]; // texte
     98                        $new[1][] = $smileys[1][$i]; // image
     99                        $new[2][] = $smileys[2][$i]; // nom de fichier
     100                }
     101        }
     102        return $new;
    178103}
    179104
     105// fonction principale (pipeline pre_typo)
     106function frimousses_pre_typo($texte) {
     107        if (strpos($texte, ':')===false && strpos($texte, ')')===false) return $texte;
     108        // appeler cs_rempl_smileys() une fois que certaines balises ont ete protegees
     109        return frimousses_echappe_balises('html|code|cadre|frame|script|acronym|cite', 'frimousses_rempl_smileys', $texte);
     110}
     111
     112
     113// evite les transformations typo dans les balises $balises
     114// par exemple pour <html>, <cadre>, <code>, <frame>, <script>, <acronym> et <cite>, $balises = 'html|code|cadre|frame|script|acronym|cite'
     115// $fonction est la fonction prevue pour transformer $texte
     116// si $fonction = false, alors le texte est retourne simplement protege
     117// $texte est le texte d'origine
     118// si $balises = '' alors la protection par defaut est : html|code|cadre|frame|script
     119// si $balises = false alors le texte est utilise tel quel
     120function frimousses_echappe_balises($balises, $fonction, $texte, $arg=NULL){
     121        if(!strlen($texte)) return '';
     122        if (($fonction!==false) && !function_exists($fonction)) {
     123                // chargement des fonctions
     124                include_spip('frimousses_fonctions');
     125                if (!function_exists($fonction)) {
     126                        spip_log("Erreur - frimousses_echappe_balises() : $fonction() non definie dans : ".$_SERVER['REQUEST_URI']);
     127                        return $texte;
     128                }
     129        }
     130        // trace d'anciennes balises <html></html> ou autre echappement SPIP ?
     131        if(strpos($texte, _FRIMOUSSES_HTMLA)!==false) {
     132                $texte = preg_replace(',<p[^>]*>(\s*'._FRIMOUSSES_HTMLX.')</p>,', '$1', $texte);
     133                $texte = preg_replace_callback(','._FRIMOUSSES_HTMLA.'(.*?)(?='._FRIMOUSSES_HTMLB.'),s', 'frimousses_echappe_html_callback', $texte);
     134        }
     135        // protection du texte
     136        if($balises!==false) {
     137                if(!strlen($balises)) $balises = 'html|code|cadre|frame|script';
     138                $balises = ',<('.$balises.')(\s[^>]*)?>(.*)</\1>,UimsS';
     139                include_spip('inc/texte');
     140                $texte = echappe_html($texte, 'FRIMOUSSES', true, $balises);
     141        }
     142        // retour du texte simplement protege
     143        if ($fonction===false) return $texte;
     144        // transformation par $fonction
     145        $texte = $arg==NULL?$fonction($texte):$fonction($texte, $arg);
     146        // deprotection en abime, notamment des modeles...
     147        if(strpos($texte, 'base64FRIMOUSSES')!==false) $texte = echappe_retour($texte, 'FRIMOUSSES');
     148        if(strpos($texte, 'base64FRIMOUSSES')!==false) return echappe_retour($texte, 'FRIMOUSSES');
     149        return $texte;
     150}
     151
     152// fonction callback pour frimousses_echappe_balises
     153function frimousses_echappe_html_callback($matches) {
     154 return _FRIMOUSSES_HTMLA.frimousses_code_echappement($matches[1], 'FRIMOUSSES');
     155}
     156
     157
     158// Echapper les elements perilleux en les passant en base64
     159// Creer un bloc base64 correspondant a $rempl ; au besoin en marquant
     160// une $source differente ; optimisation du code spip !
     161// echappe_retour() permet de revenir en arriere
     162function frimousses_code_echappement($rempl, $source='', $mode='span') {
     163        // Convertir en base64
     164        $base64 = base64_encode($rempl);
     165        // guillemets simples dans la balise pour simplifier l'outil 'guillemets'
     166        return "<$mode class='base64$source' title='$base64'></$mode>";
     167}
     168
     169
     170
     171function frimousses_echappe_balises_callback($matches) {
     172 return frimousses_code_echappement($matches[1], 'FRIMOUSSES');
     173}
     174
     175// fonction de remplacement
     176// les balises suivantes sont protegees : html|code|cadre|frame|script|acronym|cite
     177function frimousses_rempl_smileys($texte) {
     178        if (strpos($texte, ':')===false && strpos($texte, ')')===false) return $texte;
     179        $smileys_rempl = liste_smileys()[0];
     180        $texte = preg_replace_callback(',(<img .*?/>),ms', 'frimousses_echappe_balises_callback', $texte);
     181        // smileys a probleme :
     182        $texte = str_replace(':->', ':-&gt;', $texte); // remplacer > par &gt;
     183        // remplacer ’ (apostrophe curly) par &#8217;
     184        $texte = str_replace(':’-', ':&#8217;-', $texte);
     185        $texte = str_replace(':'.chr(146).'-', ':&#8217;-', $texte);
     186        // voila, on remplace tous les smileys d'un coup...
     187        $texte = str_replace($smileys_rempl[0], $smileys_rempl[1], $texte);
     188
     189        return echappe_retour($texte, 'FRIMOUSSES');
     190}
     191
     192
     193
     194
    180195?>
  • _plugins_/frimousses/frimousses_pipelines.php

    r91098 r95082  
    44function frimousses_porte_plume_barre_pre_charger($barres) {
    55        // Commun aux 2 barres
    6         $frimousses = frimousses_liste_smileys();
     6        $frimousses = smileys_uniques(liste_smileys()[0]);
    77        $outil_frimousses = array();
    8         $compteur = 0;
    9         foreach($frimousses as $file => $smiley) {
     8        for ( $compteur=0; $compteur<count($frimousses[2]); $compteur++ ){
    109                $outil_frimousses[] = array(
    1110                        "id"          => "barre_frimousse$compteur",
    12                         "name"        => _T('smileys:'.$smiley[0]).' '.implode(' ', $smiley),
     11                        "name"        => _T('smileys:'.$frimousses[0][$compteur]).' '.$frimousses[0][$compteur],
    1312                        "className"   => "outil_frimousses$compteur",
    14                         "replaceWith" => ' '.$smiley[0].' ',
     13                        "replaceWith" => ' '.$frimousses[0][$compteur].' ',
    1514                        "display"     => true,
    1615                );
    17                 $compteur++;
    1816        }
    1917       
     
    4038
    4139function frimousses_porte_plume_lien_classe_vers_icone($flux) {
    42         $outils_frimousses["outil_frimousses"] = array(find_in_path('frimousses/smiley-16.png'), '0');
     40        $outils_frimousses["outil_frimousses"] = array(find_in_path('frimousses/mort_de_rire.png'), '0');
    4341       
    44         $frimousses = array_keys(frimousses_liste_smileys());
    45                 foreach($frimousses as $compteur => $file) {
    46                 $outils_frimousses["outil_frimousses$compteur"] = array(find_in_path('frimousses/'.$file), '0');
     42        $frimousses = array_values(smileys_uniques(liste_smileys()[0])[2]);
     43//      echo print_r($frimousses);
     44        foreach($frimousses as $compteur => $file) {
     45            $outils_frimousses["outil_frimousses$compteur"] = array(find_in_path('frimousses/'.$file), '0');
    4746        }
    4847       
  • _plugins_/frimousses/plugin.xml

    r91437 r95082  
    33        <slogan>Mettre des smileys dans le texte</slogan>
    44        <auteur>Pierre Andrews (Mortimer), Bionet, RealET</auteur>
    5         <version>1.4.2</version>
     5        <version>1.4.3</version>
    66        <icon>frimousse-logo-32.png</icon>
    77        <etat>stable</etat>
Note: See TracChangeset for help on using the changeset viewer.