source: spip-zone/_plugins_/frimousses/frimousses_fonctions.php @ 95082

Last change on this file since 95082 was 95082, checked in by gouz@…, 3 years ago

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

File size: 8.2 KB
Line 
1<?php
2if (!isset($GLOBALS['spip_version_branche']) OR intval($GLOBALS['spip_version_branche'])<2){
3        $p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
4        define('_DIR_PLUGIN_FRIMOUSSES',(_DIR_PLUGINS.end($p)).'/');
5}
6
7
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>');
13
14
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;
35}
36
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',
54
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',
73
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);
86
87        return $tab;
88}
89
90
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;
103}
104
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
195?>
Note: See TracBrowser for help on using the repository browser.