source: spip-zone/_plugins_/office2spip/inc/fonctionsale.php @ 56893

Last change on this file since 56893 was 56893, checked in by fil@…, 8 years ago

supprimer le doctype

File size: 17.6 KB
Line 
1<?php
2
3        /*
4                La Fonction Sale()
5                (c)2005 James <klike@free.fr>
6                d'aprËs le bouton memo et le script spip_unparse
7        */
8       
9        /*
10                Attention: version beaucoup plus violente:
11                il s'agit ici de recuperer du HTML qui n'est de toute facon pas genere par SPIP
12                mais par OpenOffice
13        */
14       
15        function _tag2attributs($innerTag){
16          $pattern1 = "([a-zA-Z_]*)\s*=\s*[']([^']*)[']";
17          $pattern2 = '([a-zA-Z_]*)\s*=\s*["]([^"]*)["]';
18          preg_match_all (",$pattern1,Uims", $innerTag, $attr1, PREG_SET_ORDER);
19          preg_match_all (",$pattern2,Uims", $innerTag, $attr2, PREG_SET_ORDER);
20          $attributs = array();
21          foreach ($attr1 as $key => $value) {
22                $attributs[$value[1]]=$value[2];
23          }
24          foreach ($attr2 as $key => $value) {
25                $attributs[$value[1]]=$value[2];
26          }
27          ksort($attributs);
28          return $attributs;
29        }
30       
31        function _decode_entites($texte){
32                static $trans;
33                if (!isset($trans)) {
34                        $trans = get_html_translation_table(HTML_ENTITIES, $quote_style);
35                        $trans = array_flip($trans);
36#                       $trans["&euro;"]='€';
37#                       $trans["&oelig;"]='œ';
38#                       $trans["&OElig;"]='Œ';
39                        foreach ($trans as $key => $value){
40                           $trans['&#'.ord($value).';'] = $value;
41                        }
42                        // ajout du caractere apostrophe SPIP : í
43//                      $trans['&#8217;'] = "'";
44//                      $trans['&#039;'] = "'";
45//                      $trans['&#171;'] = "«";
46//                      $trans['&#187;'] = "»";
47//                      $trans['&#176;'] = "°";
48                        // des caracteres non supportes
49#                       $trans["&nbsp;&euro;"]=' €';
50
51                        # si &amp; est mentionne specifiquement, conserver un caractere
52                        # de facon a pouvoir ecrire "é s'écrit <html>&eacute;</html>"
53                        $trans['&amp;'] = '&#38;';
54
55
56                if ($GLOBALS['meta']['charset'] == 'utf-8'){
57                                foreach ($trans as $key=>$value)
58                                        $transutf[$key]=utf8_encode($value);
59                                $trans = $transutf;
60                        }
61                }
62                return strtr($texte, $trans);
63        }
64
65        function _correspondances_standards() {
66                return array(
67                        //Mise en page
68                        ",<(i|em)( [^>\r]*)?".">,Uims" => "{", //Italique
69                        ",</(i|em)>,Uims" => "}", //Italique
70                        ",<(b|strong)( [^>]*)?".">,Uims" => "{{", //Gras
71                        ",</(b|strong)>,Uims" => "}}", //Gras
72                        ",<(b|h[4-6]|strong)( [^>]*)?".">(.+)</\\1>,Uims" => "{{\\3}}", //Gras
73                        ",<(h[1-6])( [^>]*)?".">([[:blank:]]?)</\\1>,Uims" => "", //Intertitre
74                        ",<(h[1-3])( [^>]*)?".">(.+)</\\1>,Uims" => "\r{{{ \\3 }}}\r", //Intertitre
75
76                        //Liens, ancres & notes
77                        ",<a[\s][^<>]*href=\s*['\"]([^<>'\"]*)['\"][^<>]*>\s*?(.*)\s*<\/a>,Uims" => "[\\2->\\1]", //Lien externe
78
79                        //Paragraphes
80//                      ",<(p)( [^>]*)?"."></\\1>,Uims" => "", //Faux Paragr. (on s'en fiche)
81                        ",<(p)( [^>]*)?".">(.+)</\\1>,Uims" => "\r\r\\3\r\r", //Paragr. (ajouter \r avant aussi)
82                        ",(<no p[^>]*>)(\s*)(<\/no>),Uims" => "", // spiperie
83                        ",(<\/no p>)(.*)(<no p[^>]*>),Uims" => "\\2", // spiperie
84                        ",\s*?<w?br(\/)?( [^>]*)?".">\r-(&nbsp;|\s),Ui" => "\r- ", 
85                        ",\s*?<w?br(\/)?( [^>]*)?".">\r?,Ui" => "\r_ ", //Saut de ligne style suivi par du texte
86//                      ",(\s*(<br( [^>]*)?".">)?)*\\z,i" => "", //Saut de ligne en fin de texte (ca deconne severe, texte qui disparait completement)
87                        ",<hr( [^>]*)?".">,Uims" => "\r----\r", //Saut de page
88                       
89                        ",<(pre)( [^>]*)?".">(.+)</\\1>,Uims" => "<poesie>\n\\3\n</poesie>", //Poesie
90
91                        ",<(blockquote)( [^>]*)?".">(\s*?),Uims" => "<quote>\n", //quote
92                        ",(\s*?)</blockquote>,Uims" => "\n</quote>", //quote
93
94                        ",<form [^>]*><div><textarea [^>]*spip_cadre[^>]*>(.*)</textarea></div></form>,Uims" => "<cadre>\\1</cadre>",
95
96                        //typo
97                        ",&nbsp;:,i" => " :", 
98                        ",\r-(&nbsp;|\s),i" => "\r- ", 
99                        ",\r_[[:blank:]](\r[[:blank:]]?)+," => "\r\r", // BR suivis d'autres sauts de ligne deviennent paragraphes
100                        ",(\r[[:blank:]]?)+\r_[[:blank:]]," => "\r\r",
101                        ",\$[[:blank:]]+," => "\r",
102                        //Images & Documents
103                );
104        }
105
106        function _correspondances_a_bas_le_html() {
107       
108                return array(
109               
110                // on ne veut pas des heads / html / body
111                ",<head>.*<\/head>,Uims" => "",
112                ",<html>,Uims" => "",
113                ",<\/html>,Uims" => "",
114                ",<body.*>,Uims" => "",
115                ",<\/body>,Uims" => "",
116       
117                // on ne veux pas des tables
118                ",<table.*>,Uims" => "",
119                ",<\/table.*>,Uims" => "",
120                ",<tr.*>,Uims" => "",
121                ",<\/tr>,Uims" => "",
122                ",<td.*>,Uims" => "",
123                ",<\/td>,Uims" => "",
124       
125       
126                // on ne veux pas des div
127                ",<div.*>,Uims" => "",
128                ",<\/div.*>,Uims" => "",
129               
130                // divers et variÈs
131                ",<csobj.*>,Uims" => "",
132                ",<\/csobj>,Uims" => "",
133                ",<csscriptdict.*>,Uims" => "",
134                ",<\/csscriptdict>,Uims" => "",
135                ",<spacer.*>,Uims" => "",
136               
137                // javascript sur les liens
138                ",target=\".*\",Uims" => "",
139                ",onmouseover=\".*\",Uims" => "",
140                ",onmouseout=\".*\",Uims" => "",
141                ",onclick=\".*\",Uims" => "",
142               
143       
144                // c est pas du html mais je le met ici quand meme
145                ",\t,Uims" => " ",
146               
147                // ramasse-miettes: trucs qui restent
148                ",<(font|large|small|iframe|a|span|script|p|dl|dd|dt|sup|sdfield|u|form|fieldset|button|input|textarea|select|option|label|noscript|link|abbr|acronym|address)( [^>]*)?>,Uims" => "",
149                ",<\/(font|large|small|iframe|a|span|script|p|dl|dd|dt|sup|sdfield|u|form|fieldset|button|input|textarea|select|option|label|noscript|link|abbr|acronym|address)( [^>]*)?>,Uims" => "",
150                ",<center.*>,Uims" => "\n\n",
151                ",<\/center.*>,Uims" => "\n\n",
152                ",<col.*>,Uims" => "\n\n",
153                ",<\/col.*>,Uims" => "\n\n",
154               
155       
156                        );
157        }
158       
159        // les listes numerotees ou non ---------------------------------------------------------------
160        function _extraire_listes($texte){
161          $pattern = "(<ul[^>]*>|</ul>|<ol[^>]*>|</ol>)";
162       
163          preg_match_all (",$pattern,Uims", $texte, $tagMatches, PREG_SET_ORDER);
164          $textMatches = preg_split (",$pattern,Uims", $texte);
165       
166          $niveau = 0;
167          $prefixe= "-**********";
168          $prefixenum= "-##########";
169          $niveaunum = 0;
170          $texte = $textMatches [0];
171         
172          if (count($textMatches)>1){
173                  for ($i = 1; $i < count ($textMatches)-1; $i ++) {
174                        if (preg_match(",<ul[^>]*>,is",$tagMatches [$i-1][0])) {$niveau++;$pref = $prefixe;}
175                        else if (preg_match(",<ol[^>]*>,is",$tagMatches [$i-1][0])) {$niveau++;$pref = $prefixenum;}
176                        else if (strtolower($tagMatches [$i-1][0])=="</ul>") $niveau--;
177                        else if (strtolower($tagMatches [$i-1][0])=="</ol>") $niveau--;
178                        $pre = "";
179                        if ($niveau) $pre = substr($pref,0,$niveau+1);
180                        if (strlen(trim($textMatches [$i]))){
181                                $lignes = preg_split(",<li[^>]*>,i",$textMatches [$i]);
182                                foreach ($lignes as $key=>$item){
183                                        $lignes[$key] = trim(str_replace("</li>","",$item));
184                                        if (strlen($lignes[$key]))
185                                                $lignes[$key]="$pre " . $lignes[$key];
186                                        else 
187                                                unset($lignes[$key]);
188                                }
189                                        $texte .= implode("\r",$lignes)."\r";
190                        }
191                  }
192                  $texte .= end($textMatches);
193          }
194          return $texte;
195        }
196       
197        // les tableaux standards ou personalises -----------------------------------------------------
198        function _recompose_tableau($innerTag,$texte){
199                $table_class=array('spip'=>"|",'ville'=>"£");
200                $sep = $table_class['spip'];
201
202                $attributs = _tag2attributs($innerTag);
203// detecter la classe
204                $class = "";
205                if (isset($attributs['class']))
206                        $class = $attributs['class'];
207                if (isset($table_class[$class]))
208                        $sep = $table_class[$class];
209
210                // d'abord transformer tous les | en leur entite pour pas se tromper
211                $texte = str_replace($sep,"&#".ord($sep).";",$texte);
212
213                $summary = "";
214                $caption = "";
215                if (isset($attributs['summary']))
216                        $summary = trim($attributs['summary']);
217                if (preg_match(",<caption>(.*)</caption>,Uims",$texte))
218                        $caption = trim(preg_replace(",.*?<caption>(.*)</caption>.*?,Uims","\\1",$texte));
219                if (strlen($caption) || strlen($summary))
220                        $summary="$sep$sep $caption $sep $summary $sep$sep\r";
221               
222                // les lignes
223                $texte = preg_replace(",<tr[^>]*>\s*?(.*)\s*</tr>,Uims","\r$sep \\1$sep\r",$texte);
224               
225                // les colonnes
226                $texte = preg_replace(",<(td)(\s[^>]*)?".">[[:blank:]]*(.*)\s*?</\\1>,Uims"," \\3 $sep",$texte);
227                $texte = preg_replace(",<(th)(\s[^>]*)?".">[[:blank:]]*({{)?(.*?)(}})?\s*?</\\1>,ims"," {{\\4}} $sep",$texte);
228                // attention un |\n correspond a une fin de ligne et ne doit pas etre autorise au milieu d'une ligne
229                $texte = preg_replace(",(\s\\$sep)\r,Uims","\\1 \r",$texte);
230                // les doubles pipes en fin de ligne doivent etre remis en simpes |
231                $texte = str_replace("$sep$sep\r","$sep\r",$texte);
232               
233                // le thead
234                // verifier d'abors qu'il y a un vrai contenu dans le thead
235                $texte = preg_replace(",\r(\\$sep\s*{{[\s\r_]*}}\s*)*\\$sep\r,Uims","",$texte);
236                $texte = preg_replace(",<thead[^>]*>\s*?(.*)\s*</thead>,Uims","\\1\r",$texte);
237                // le tbody
238                $texte = preg_replace(",<tbody[^>]*>\s*?(.*)\s*</tbody>,Uims","\\1",$texte);
239                // le table
240                //$texte = preg_replace(",<table[^>]*>\s*?(.*)\s*</table>,Uims","\\1\r\r",$texte);
241               
242                // caption/head
243                $texte = preg_replace(",<caption>.*</caption>\s*?,Uims","\\1",$texte);
244                $texte = $summary . $texte;
245
246                // les lignes vides inter |
247                $texte = preg_replace(",\\$sep\r[\s\r]*\\$sep,Uims","$sep\r$sep",$texte);
248               
249                return $texte;
250        }       
251       
252        function _extraire_tableaux($texte){
253                // tableaux
254          $pattern = '<table([^>]*)>(.*)</table>';
255          preg_match_all (",$pattern,Uims", $texte, $tableMatches, PREG_SET_ORDER);
256          $textMatches = preg_split (",$pattern,Uims", $texte);
257       
258          foreach ($tableMatches as $key => $value) {
259                        $tableMatches [$key][0] = _recompose_tableau ($value[1],$value[2]);
260          }
261                for ($i = 0; $i < count ($textMatches); $i ++) {
262                        $textMatches [$i] = $textMatches [$i] . $tableMatches [$i] [0];
263                }
264                $texte = implode ("", $textMatches);
265                return $texte;
266        }
267       
268        // les balises img vers les <imgxx> (ou <docxx> ou <embxx>) -----------------------------------------------
269        function _retrouve_document($type,$fulltag,$innerTag,$shorttag){
270                static $puce=false;
271                static $puce_attr=false;
272                if (!$puce){
273                        if (function_exists('definir_puce')) $puce = definir_puce();
274                        $puce_attr = _tag2attributs($puce);
275                }
276                $attributs = _tag2attributs($innerTag);
277                // est-ce la puce ?
278                $test = array_diff_assoc($puce_attr,$attributs);
279                if (count($test)==0 && count($puce_attr)==count($attributs))
280                        return "\r-";
281                // sinon recherche dans spip_documents
282                $src = "";
283                if ($type=='img' && isset($attributs['src'])) // balise img
284                        $src = $attributs['src'];
285                else if ($type=='object' && isset($attributs['data'])) // balise object
286                        $src = $attributs['data'];
287
288                if (strlen($src)){
289                        // si le chemin fait reference a IMG, le ramener a la racine
290                        if (substr($src,0,strlen(_DIR_IMG))==_DIR_IMG)
291                                $src = str_replace(_DIR_RACINE,"",$src);
292                        $src = addslashes($src); // soyons prudent tout de meme ...
293                        $query = "SELECT id_document FROM spip_documents WHERE fichier='$src'";
294                        $res = spip_query($query);
295                        if ($row=spip_fetch_array($res)){
296                                $id_document = $row['id_document'];
297                                $align="";
298                                if (isset($attributs['class'])){
299                                preg_match_all (",spip_documents_([a-zA-Z_]*),ims", $attributs['class'], $classMatches, PREG_SET_ORDER);
300                                foreach($classMatches as $value)
301                                        $align.="|".$value[1];
302                                }
303                                $fulltag = "<$shorttag$id_document$align>";
304                                return $fulltag;
305                        }
306                }
307               
308                return $fulltag;
309        }
310        function _extraire_images($texte){
311                static $liste_tests=array(
312                        ',<(img)\s([^<>]*)>,Uims'=>'img', // image
313                        ',<(object)\s([^<>]*)>.*</object>,Uims'=>'emb' // object
314                        );
315                foreach($liste_tests as $pattern=>$shortcut){
316                  preg_match_all ($pattern, $texte, $tagMatches, PREG_SET_ORDER);
317                  $textMatches = preg_split ($pattern, $texte);
318       
319                  foreach ($tagMatches as $key => $value) {
320                                $tagMatches [$key][0] = _retrouve_document ($tagMatches[$key][1],$tagMatches[$key][0],$tagMatches[$key][2],$shortcut);
321                  }
322                        for ($i = 0; $i < count ($textMatches); $i ++) {
323                                $textMatches [$i] = $textMatches [$i] . $tagMatches [$i] [0];
324                        }
325                        $texte = implode ("", $textMatches);
326                }
327                // reconnaitre les |center sur img
328                $texte = preg_replace(",<div\s[^>]*class\s*=\s*['\"][^'\"]*spip_documents_([a-zA-Z_]*?)[^'\"]*['\"][^>]*>\s*<(img)([0-9]*)(|[^>]*)?>\s*</div>,Uims","<\\2\\3\\4|\\1>",$texte);
329                // reconnaitre les |center sur doc qui ont ete detectees comme des img
330                $texte = preg_replace(",<div\s[^>]*class\s*=\s*['\"][^'\"]*spip_documents_([a-zA-Z_]*?)[^'\"]*['\"][^>]*>\s*<(img)([0-9]*)(|[^>]*)?>\s*<div[^>]*class='spip_doc_titre'[^>]*>.*</div>\s*<div[^>]*class='spip_doc_descriptif'[^>]*>.*</div>\s*</div>,Uims","<doc\\3\\4|\\1>",$texte);
331                // reconnaitre les |center sur emb
332                $texte = preg_replace(",<div\s[^>]*class\s*=\s*['\"][^'\"]*spip_documents_([a-zA-Z_]*?)[^'\"]*['\"][^>]*>\s*<(emb)([0-9]*)(|[^>]*)?>\s*<div[^>]*class='spip_doc_titre'[^>]*>.*</div>\s*<div[^>]*class='spip_doc_descriptif'[^>]*>.*</div>\s*</div>,Uims","<\\2\\3\\4|\\1>",$texte);
333
334                // object
335               
336               
337                return $texte;
338        }
339       
340
341        // extraire code
342        function _extraire_code($contenu){
343                $pattern =",<(div|span) [^>]*spip_code[^>]*><code>(.*)</code></\\1>,Uims";
344                preg_match_all ($pattern, $contenu, $codeMatches, PREG_SET_ORDER);
345                $textMatches = preg_split ($pattern, $contenu);
346
347                foreach ($codeMatches as $key => $value) {
348                        $codeMatches [$key][0] = "<code>" . preg_replace(",<br[^>]*>\s*,i","\r",$value[2]) . "</code>";
349                }
350                for ($i = 0; $i < count ($textMatches); $i ++) {
351                        $textMatches [$i] = $textMatches [$i] . $codeMatches [$i] [0];
352                }
353                $contenu = implode ("", $textMatches);
354                return $contenu;
355        }
356        // extraire poesie
357        function _extraire_poesie($contenu){
358                $pattern =",<div [^>]*spip_poesie[^>]*>((\s*<div>.*</div>)*\s*)</div>,Uims";
359                preg_match_all ($pattern, $contenu, $poesieMatches, PREG_SET_ORDER);
360                $textMatches = preg_split ($pattern, $contenu);
361
362                foreach ($poesieMatches as $key => $value) {
363                        $poesieMatches [$key][0] = "<poesie>" . preg_replace(",\s*<div>(.*)</div>,Uim","\r\\1",$value[1]) . "</poesie>";
364                }
365                for ($i = 0; $i < count ($textMatches); $i ++) {
366                        $textMatches [$i] = $textMatches [$i] . $poesieMatches [$i] [0];
367                }
368                $contenu = implode ("", $textMatches);
369                return $contenu;
370        }
371
372        function _spip_avant_sale($contenu) {
373                if(function_exists('avant_sale'))
374                        return avant_sale($contenu);
375
376                $contenu = preg_replace(',<!doctype[^>]*>\s*,si', '', $contenu);
377
378                // PRETRAITEMENTS
379                $contenu = str_replace("\n\r", "\r", $contenu); // echapper au greedyness de preg_replace
380                $contenu = str_replace("\r\n", "\r", $contenu); // dojo produit du \r\n
381                $contenu = str_replace("\n", "\r", $contenu);
382                $contenu = str_replace("&mdash;", "--", $contenu);
383       
384                // virer les commentaires html (qui cachent souvent css et jajascript)
385                $contenu = preg_replace("/<!--.*-->/Uims", "", $contenu);
386
387                $contenu = preg_replace("/<(script|style)\b.+?<\/\\1>/i", "", $contenu);
388                $contenu = preg_replace(",[\r\n],", " ", $contenu); // Virer les retours chariot pour rendre le texte lisible - les paragaphes et br les reintroduiront la ou necessaire
389
390                return $contenu;
391        }
392
393        function _sucrer_cesures ($contenu) {
394                $contenu = preg_replace("/(&#8203;|&#173;|­|​​)/", "", $contenu); // Cesures discretes
395                $contenu = str_replace("’", "'", $contenu); // Corriger les apostrophes de Word
396                $contenu = str_replace("&rsquo;", "'", $contenu); // Corriger les apostrophes de Word
397                $contenu = str_replace("&lsquo;", "‘", $contenu); //
398                return $contenu;
399        }
400
401        function _spip_apres_sale($contenu) {
402                if(function_exists('apres_sale'))
403                        return apres_sale($contenu);
404
405                // POST TRAITEMENT
406                $contenu = str_replace("\r", "\n", $contenu);
407                $contenu = preg_replace(",\n_ --,", "\n--", $contenu);
408                $contenu = preg_replace(",\n_ }}},", "}}}\n", $contenu); // Corriger les fin de groupes apres le retour chariot
409                $contenu = preg_replace(",\n_ }},", "}}\n", $contenu);
410                $contenu = preg_replace(",\n_ },", "}\n", $contenu);
411                $contenu = preg_replace(",(\n_[[:blank:]]?)?\n-,", "\n-", $contenu);
412                $contenu = preg_replace(",[[:blank:]]+,", " ", $contenu); // Regrouper les espaces multiples
413                $contenu = preg_replace(",{{{[[:blank:]]?}}},", "", $contenu); // Sucrer les h3 vides
414                $contenu = preg_replace(",{{[[:blank:]]?}},", "", $contenu); // Sucrer les bolds vides
415                $contenu = preg_replace(",{[[:blank:]]?},", "", $contenu); // Sucrer les italiques vides
416                $contenu = preg_replace(",}}{{,", "", $contenu); // Regrouper les bold successifs
417                $contenu = preg_replace(",([^}])}{([^{]),", "$1$2", $contenu); // Regroupes les italiques successifs
418                $contenu = preg_replace(",\n[[:blank:]]+,", "\n", $contenu); // Supprimer les espaces en debut de ligne
419                $contenu = preg_replace(",\n_[[:blank:]](\n[[:blank:]]?)+," , "\n\n", $contenu); // BR suivis d'autres sauts de ligne deviennent paragraphes
420                $contenu = preg_replace(",(\n[[:blank:]]?)+\n_[[:blank:]]," , "\n\n", $contenu);
421
422                $contenu = preg_replace(",\n(?=\n\n),","",$contenu);
423               
424                // Virer les caracteres speciaux (notamment cesures discretes)
425                $contenu = _sucrer_cesures($contenu);
426
427                // virer les entites a la fin seulement
428                // &nbsp; est utilise pour reperer des trucs genre "- " en debut de ligne ...
429                $contenu = _decode_entites($contenu);
430               
431                return $contenu;
432        }
433
434        function sale($contenu_sale, $correspondances = '') {
435                $contenu_propre = $contenu_sale;
436               
437               
438                //PrÈ  Traitement
439                $contenu_propre = _spip_avant_sale($contenu_propre);
440               
441                //Traitement
442                if(empty($correspondances))
443                        $correspondances = _correspondances_standards();
444                       
445
446                $contenu_propre = _extraire_images($contenu_propre);
447               
448               
449                foreach($correspondances as $motif => $remplacement) {
450                        $contenu_propre = preg_replace($motif, $remplacement, $contenu_propre);
451                }
452               
453                $contenu_propre = _extraire_listes($contenu_propre);
454
455                $contenu_propre = _extraire_tableaux($contenu_propre);
456                $contenu_propre = _extraire_code($contenu_propre);
457                $contenu_propre = _extraire_poesie($contenu_propre);
458                //reconnaitre les url d'articles, rubriques ...
459                // DESACTIVE (on traite des fichiers Office qui n'ont donc pas de liens SPIP)
460                //              $url_look = url_de_base()."spip.php";
461                //              $contenu_propre = preg_replace(",\[(.*)->\s*$url_look"."[^\]]*id_((art)icle|(rub)rique)=([0-9]*?)[^\]]*],Uims","[\\1->\\4\\5]",$contenu_propre);
462
463                // a priori on garde ce qui est pas analysÈ
464                foreach(_correspondances_a_bas_le_html() as $motif => $remplacement)
465                        $contenu_propre = preg_replace($motif, $remplacement, $contenu_propre);
466
467                //Post Traitement
468                $contenu_propre = _spip_apres_sale($contenu_propre);
469
470                return trim($contenu_propre);
471        }
472
473?>
Note: See TracBrowser for help on using the repository browser.