source: spip-zone/_core_/plugins/textwheel/inc/texte.php @ 80926

Last change on this file since 80926 was 80926, checked in by cedric@…, 6 years ago

Report de r80865 : un pipeline pre_echappe_html_propre qui voit passer le texte brut de propre() avant tout echappement html
Le nommage est verbeux, mais on pourrait etre amené à intégrer un pipeline symétrique dans typo() et cela permetta de les distinguer

File size: 19.4 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2014                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13/**
14 * Gestion des textes et raccourcis SPIP
15 *
16 * Surcharge de ecrire/inc/texte
17 *
18 * @package SPIP\Textwheel\Texte
19**/
20
21if (!defined('_ECRIRE_INC_VERSION')) return;
22
23include_spip('inc/texte_mini');
24include_spip('inc/lien');
25
26include_spip('inc/textwheel');
27
28
29defined('_AUTOBR')||define('_AUTOBR', "<br class='autobr' />");
30define('_AUTOBR_IGNORER', _AUTOBR?"<!-- ig br -->":"");
31
32// Avec cette surcharge, cette globale n'est plus définie, et du coup ça plante dans les plugins qui font un foreach dessus comme ZPIP
33$GLOBALS['spip_raccourcis_typo'] = array();
34if (!isset($GLOBALS['toujours_paragrapher']))
35        $GLOBALS['toujours_paragrapher'] = true;
36
37// class_spip : savoir si on veut class="spip" sur p i strong & li
38// class_spip_plus : class="spip" sur les ul ol h3 hr quote table...
39// la difference c'est que des css specifiques existent pour les seconds
40//
41if (!isset($GLOBALS['class_spip']))
42        $GLOBALS['class_spip'] = '';
43if (!isset($GLOBALS['class_spip_plus']))
44        $GLOBALS['class_spip_plus'] = ' class="spip"';
45
46
47/**
48 * Échapper et affichier joliement les `<script` ...
49 *
50 * @param string $t
51 * @return string
52 */
53function echappe_js($t) {
54        static $wheel = null;
55
56        if (!isset($wheel))
57                $wheel = new TextWheel(
58                        SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['echappe_js'])
59                );
60
61        return $wheel->text($t);
62}
63
64
65/**
66 * Paragrapher seulement
67 *
68 * Fermer les paragraphes ; Essaie de préserver des paragraphes indiqués
69 * à la main dans le texte (par ex: on ne modifie pas un `<p align='center'>`)
70 *
71 * @param string $t
72 *     Le texte
73 * @param null $toujours_paragrapher
74 *     true pour forcer les `<p>` même pour un seul paragraphe
75 * @return string
76 *     Texte paragraphé
77 */
78function paragrapher($t, $toujours_paragrapher = null) {
79        static $wheel = array();
80        if (is_null($toujours_paragrapher))
81                $toujours_paragrapher = $GLOBALS['toujours_paragrapher'];
82
83        if (!isset($wheel[$toujours_paragrapher])) {
84                $ruleset = SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['paragrapher']);
85                if (!$toujours_paragrapher
86                  AND $rule=$ruleset->getRule('toujours-paragrapher')) {
87                        $rule->disabled = true;
88                        $ruleset->addRules(array('toujours-paragrapher'=>$rule));
89                }
90                $wheel[$toujours_paragrapher] = new TextWheel($ruleset);
91        }
92
93        return $wheel[$toujours_paragrapher]->text($t);
94}
95
96/**
97 * Empêcher l'exécution de code PHP et JS
98 *
99 * Sécurité : empêcher l'exécution de code PHP, en le transformant en joli code
100 * dans l'espace privé. Cette fonction est aussi appelée par propre et typo.
101 *
102 * De la même manière, la fonction empêche l'exécution de JS mais selon le mode
103 * de protection déclaré par la globale filtrer_javascript :
104 * - -1 : protection dans l'espace privé et public
105 * - 0  : protection dans l'espace public
106 * - 1  : aucune protection
107 *
108 * Il ne faut pas désactiver globalement la fonction dans l'espace privé car elle protège
109 * aussi les balises des squelettes qui ne passent pas forcement par propre ou typo après
110 * si elles sont appelées en direct
111 *
112 * @param string $arg
113 *     Code à protéger
114 * @return string
115 *     Code protégé
116**/
117function interdire_scripts($arg) {
118        // on memorise le resultat sur les arguments non triviaux
119        static $dejavu = array();
120        static $wheel = array();
121
122        // Attention, si ce n'est pas une chaine, laisser intact
123        if (!$arg OR !is_string($arg) OR !strstr($arg, '<')) return $arg;
124        if (isset($dejavu[$GLOBALS['filtrer_javascript']][$arg])) return $dejavu[$GLOBALS['filtrer_javascript']][$arg];
125
126        if (!isset($wheel[$GLOBALS['filtrer_javascript']])){
127                $ruleset = SPIPTextWheelRuleset::loader(
128                        $GLOBALS['spip_wheels']['interdire_scripts']
129                );
130                // Pour le js, trois modes : parano (-1), prive (0), ok (1)
131                // desactiver la regle echappe-js si besoin
132                if ($GLOBALS['filtrer_javascript']==1
133                        OR ($GLOBALS['filtrer_javascript']==0 AND !test_espace_prive()))
134                        $ruleset->addRules (array('securite-js'=>array('disabled'=>true)));
135                $wheel[$GLOBALS['filtrer_javascript']] = new TextWheel($ruleset);
136        }
137
138        $t = $wheel[$GLOBALS['filtrer_javascript']]->text($arg);
139
140        // Reinserer les echappements des modeles
141        if (defined('_PROTEGE_JS_MODELES'))
142                $t = echappe_retour($t,"javascript"._PROTEGE_JS_MODELES);
143        if (defined('_PROTEGE_PHP_MODELES'))
144                $t = echappe_retour($t,"php"._PROTEGE_PHP_MODELES);
145
146        return $dejavu[$GLOBALS['filtrer_javascript']][$arg] = $t;
147}
148
149
150/**
151 * Applique la typographie générale
152 *
153 * Effectue un traitement pour que les textes affichés suivent les règles
154 * de typographie. Fait une protection préalable des balises HTML et SPIP.
155 * Transforme les balises `<multi>`
156 *
157 * @filtre
158 * @uses traiter_modeles()
159 * @uses corriger_typo()
160 * @uses echapper_faux_tags()
161 * @see propre()
162 *
163 * @param string $letexte
164 *     Texte d'origine
165 * @param bool $echapper
166 *     Échapper ?
167 * @param string|null $connect
168 *     Nom du connecteur à la bdd
169 * @param array $env
170 *     Environnement (pour les calculs de modèles)
171 * @return string $t
172 *     Texte transformé
173**/
174function typo($letexte, $echapper=true, $connect=null, $env=array()) {
175        // Plus vite !
176        if (!$letexte) return $letexte;
177
178        // les appels directs a cette fonction depuis le php de l'espace
179        // prive etant historiquement ecrit sans argment $connect
180        // on utilise la presence de celui-ci pour distinguer les cas
181        // ou il faut passer interdire_script explicitement
182        // les appels dans les squelettes (de l'espace prive) fournissant un $connect
183        // ne seront pas perturbes
184        $interdire_script = false;
185        if (is_null($connect)){
186                $connect = '';
187                $interdire_script = true;
188        }
189
190        $echapper = ($echapper?'TYPO':false);
191        // Echapper les codes <html> etc
192        if ($echapper)
193                $letexte = echappe_html($letexte, $echapper);
194
195        //
196        // Installer les modeles, notamment images et documents ;
197        //
198        // NOTE : propre() ne passe pas par ici mais directement par corriger_typo
199        // cf. inc/lien
200
201        $letexte = traiter_modeles($mem = $letexte, false, $echapper ? $echapper : '', $connect, null, $env);
202        if (!$echapper AND $letexte != $mem) $echapper = '';
203        unset($mem);
204
205        $letexte = corriger_typo($letexte);
206        $letexte = echapper_faux_tags($letexte);
207
208        // reintegrer les echappements
209        if ($echapper!==false)
210                $letexte = echappe_retour($letexte, $echapper);
211
212        // Dans les appels directs hors squelette, securiser ici aussi
213        if ($interdire_script)
214                $letexte = interdire_scripts($letexte);
215
216        return $letexte;
217}
218
219// Correcteur typographique
220
221define('_TYPO_PROTEGER', "!':;?~%-");
222define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8");
223
224define('_TYPO_BALISE', ",</?[a-z!][^<>]*[".preg_quote(_TYPO_PROTEGER)."][^<>]*>,imsS");
225
226/**
227 * Corrige la typographie
228 *
229 * Applique les corrections typographiques adaptées à la langue indiquée.
230 *
231 * @pipeline_appel pre_typo
232 * @pipeline_appel post_typo
233 * @uses corriger_caracteres()
234 * @uses corriger_caracteres()
235 *
236 * @param string $t Texte
237 * @param string $lang Langue
238 * @return string Texte
239 */
240function corriger_typo($t, $lang='') {
241        static $typographie = array();
242        // Plus vite !
243        if (!$t) return $t;
244
245        $t = pipeline('pre_typo', $t);
246
247        // Caracteres de controle "illegaux"
248        $t = corriger_caracteres($t);
249
250        // Proteger les caracteres typographiques a l'interieur des tags html
251        if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) {
252                foreach ($regs as $reg) {
253                        $insert = $reg[0];
254                        // hack: on transforme les caracteres a proteger en les remplacant
255                        // par des caracteres "illegaux". (cf corriger_caracteres())
256                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
257                        $t = str_replace($reg[0], $insert, $t);
258                }
259        }
260
261        // trouver les blocs multi et les traiter a part
262        $t = extraire_multi($e = $t, $lang, true);
263        $e = ($e === $t);
264
265        // Charger & appliquer les fonctions de typographie
266        $idxl = "$lang:" . (isset($GLOBALS['lang_objet'])? $GLOBALS['lang_objet']: $GLOBALS['spip_lang']);
267        if (!isset($typographie[$idxl]))
268                $typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie');
269        $t = $typographie[$idxl]($t);
270
271        // Les citations en une autre langue, s'il y a lieu
272        if (!$e) $t = echappe_retour($t, 'multi');
273
274        // Retablir les caracteres proteges
275        $t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
276
277        // pipeline
278        $t = pipeline('post_typo', $t);
279
280        # un message pour abs_url - on est passe en mode texte
281        $GLOBALS['mode_abs_url'] = 'texte';
282
283        return $t;
284}
285
286
287//
288// Tableaux
289//
290
291define('_RACCOURCI_TH_SPAN', '\s*(:?{{[^{}]+}}\s*)?|<');
292
293/**
294 * Traitement des raccourcis de tableaux
295 *
296 * @param sring $bloc
297 * @return string
298 */
299function traiter_tableau($bloc) {
300        // id "unique" pour les id du tableau
301        $tabid = substr(md5($bloc),0,4);
302
303        // Decouper le tableau en lignes
304        preg_match_all(',([|].*)[|]\n,UmsS', $bloc, $regs, PREG_PATTERN_ORDER);
305        $lignes = array();
306        $debut_table = $summary = '';
307        $l = 0;
308        $numeric = true;
309
310        // Traiter chaque ligne
311        $reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS';
312        $reg_line_all = ',^('  . _RACCOURCI_TH_SPAN . ')$,sS';
313        $hc = $hl = array();
314        foreach ($regs[1] as $ligne) {
315                $l ++;
316
317                // Gestion de la premiere ligne :
318                if ($l == 1) {
319                // - <caption> et summary dans la premiere ligne :
320                //   || caption | summary || (|summary est optionnel)
321                        if (preg_match(',^\|\|([^|]*)(\|(.*))?$,sS', rtrim($ligne,'|'), $cap)) {
322                                $l = 0;
323                                if ($caption = trim($cap[1]))
324                                        $debut_table .= "<caption>".$caption."</caption>\n";
325                                $summary = ' summary="'.entites_html(trim($cap[3])).'"';
326                        }
327                // - <thead> sous la forme |{{titre}}|{{titre}}|
328                //   Attention thead oblige a avoir tbody
329                        else if (preg_match($reg_line1, $ligne, $thead)) {
330                                preg_match_all('/\|([^|]*)/S', $ligne, $cols);
331                                $ligne='';$cols= $cols[1];
332                                $colspan=1;
333                                for($c=count($cols)-1; $c>=0; $c--) {
334                                        $attr='';
335                                        if($cols[$c]=='<') {
336                                          $colspan++;
337                                        } else {
338                                          if($colspan>1) {
339                                                $attr= " colspan='$colspan'";
340                                                $colspan=1;
341                                          }
342                                          // inutile de garder le strong qui n'a servi que de marqueur
343                                          $cols[$c] = str_replace(array('{','}'), '', $cols[$c]);
344                                          $ligne= "<th id='id{$tabid}_c$c'$attr>$cols[$c]</th>$ligne";
345                                                $hc[$c] = "id{$tabid}_c$c"; // pour mettre dans les headers des td
346                                        }
347                                }
348
349                                $debut_table .= "<thead><tr class='row_first'>".
350                                        $ligne."</tr></thead>\n";
351                                $l = 0;
352                        }
353                }
354
355                // Sinon ligne normale
356                if ($l) {
357                        // Gerer les listes a puce dans les cellules
358                        // on declenche simplement sur \n- car il y a les
359                        // -* -# -? -! (qui produisent des -&nbsp;!)
360                        if (strpos($ligne,"\n-")!==false)
361                                $ligne = traiter_listes($ligne);
362
363                        // tout mettre dans un tableau 2d
364                        preg_match_all('/\|([^|]*)/S', $ligne, $cols);
365
366                        // Pas de paragraphes dans les cellules
367                        foreach ($cols[1] as &$col) {
368                                if (strlen($col = trim($col))) {
369                                        $col = preg_replace("/\n{2,}/S", "<br /> <br />", $col);
370                                        if (_AUTOBR)
371                                                $col = str_replace("\n", _AUTOBR."\n", $col);
372                                }
373                        }
374
375                        // assembler le tableau
376                        $lignes[]= $cols[1];
377                }
378        }
379
380        // maintenant qu'on a toutes les cellules
381        // on prepare une liste de rowspan par defaut, a partir
382        // du nombre de colonnes dans la premiere ligne.
383        // Reperer egalement les colonnes numeriques pour les cadrer a droite
384        $rowspans = $numeric = array();
385        $n = count($lignes[0]);
386        $k = count($lignes);
387        // distinguer les colonnes numeriques a point ou a virgule,
388        // pour les alignements eventuels sur "," ou "."
389        $numeric_class = array('.'=>'point',','=>'virgule');
390        for($i=0;$i<$n;$i++) {
391          $align = true;
392          for ($j=0;$j<$k;$j++) {
393                  $rowspans[$j][$i] = 1;
394                        if ($align AND preg_match('/^[{+-]*(?:\s|\d)*([.,]?)\d*[}]*$/', trim($lignes[$j][$i]), $r)){
395                                if ($r[1])
396                                        $align = $r[1];
397                        }
398                        else
399                                $align = '';
400          }
401          $numeric[$i] = $align ? (" class='numeric ".$numeric_class[$align]."'") : '';
402        }
403        for ($j=0;$j<$k;$j++) {
404                if (preg_match($reg_line_all, $lignes[$j][0])) {
405                        $hl[$j] = "id{$tabid}_l$j"; // pour mettre dans les headers des td
406                }
407                else
408                        unset($hl[0]);
409        }
410        if (!isset($hl[0]))
411                $hl = array(); // toute la colonne ou rien
412
413        // et on parcourt le tableau a l'envers pour ramasser les
414        // colspan et rowspan en passant
415        $html = '';
416
417        for($l=count($lignes)-1; $l>=0; $l--) {
418                $cols= $lignes[$l];
419                $colspan=1;
420                $ligne='';
421
422                for($c=count($cols)-1; $c>=0; $c--) {
423                        $attr= $numeric[$c];
424                        $cell = trim($cols[$c]);
425                        if($cell=='<') {
426                          $colspan++;
427
428                        } elseif($cell=='^') {
429                          $rowspans[$l-1][$c]+=$rowspans[$l][$c];
430
431                        } else {
432                          if($colspan>1) {
433                                $attr .= " colspan='$colspan'";
434                                $colspan=1;
435                          }
436                          if(($x=$rowspans[$l][$c])>1) {
437                                $attr.= " rowspan='$x'";
438                          }
439                          $b = ($c==0 AND isset($hl[$l]))?'th':'td';
440                                $h = (isset($hc[$c])?$hc[$c]:'').' '.(($b=='td' AND isset($hl[$l]))?$hl[$l]:'');
441                                if ($h=trim($h))
442                                        $attr.=" headers='$h'";
443                                // inutile de garder le strong qui n'a servi que de marqueur
444                                if ($b=='th') {
445                                        $attr.=" id='".$hl[$l]."'";
446                                        $cols[$c] = str_replace(array('{','}'), '', $cols[$c]);
447                                }
448                          $ligne= "\n<$b".$attr.'>'.$cols[$c]."</$b>".$ligne;
449                        }
450                }
451
452                // ligne complete
453                $class = alterner($l+1, 'odd', 'even');
454                $html = "<tr class='row_$class $class'>$ligne</tr>\n$html";
455        }
456        return "\n\n<table".$GLOBALS['class_spip_plus'].$summary.">\n"
457                . $debut_table
458                . "<tbody>\n"
459                . $html
460                . "</tbody>\n"
461                . "</table>\n\n";
462}
463
464
465/**
466 * Traitement des listes
467 *
468 * On utilise la wheel correspondante
469 *
470 * @param string $t
471 * @return string
472 */
473function traiter_listes ($t) {
474        static $wheel = null;
475
476        if (!isset($wheel))
477                $wheel = new TextWheel(
478                        SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['listes'])
479                );
480
481        return $wheel->text($t);
482}
483
484
485// Ces deux constantes permettent de proteger certains caracteres
486// en les remplacanat par des caracteres "illegaux". (cf corriger_caracteres)
487
488define('_RACCOURCI_PROTEGER', "{}_-");
489define('_RACCOURCI_PROTECTEUR', "\x1\x2\x3\x4");
490
491define('_RACCOURCI_BALISE', ",</?[a-z!][^<>]*[".preg_quote(_RACCOURCI_PROTEGER)."][^<>]*>,imsS");
492
493/**
494 * mais d'abord, une callback de reconfiguration des raccourcis
495 * a partir de globales (est-ce old-style ? on conserve quand meme
496 * par souci de compat ascendante)
497 *
498 * @param $ruleset
499 */
500function personnaliser_raccourcis(&$ruleset){
501        if (isset($GLOBALS['debut_intertitre']) AND $rule=$ruleset->getRule('intertitres')){
502                $rule->replace[0] = preg_replace(',<[^>]*>,Uims',$GLOBALS['debut_intertitre'],$rule->replace[0]);
503                $rule->replace[1] = preg_replace(',<[^>]*>,Uims',$GLOBALS['fin_intertitre'],$rule->replace[1]);
504                $ruleset->addRules(array('intertitres'=>$rule));
505        }
506        if (isset($GLOBALS['debut_gras']) AND $rule=$ruleset->getRule('gras')){
507                $rule->replace[0] = preg_replace(',<[^>]*>,Uims',$GLOBALS['debut_gras'],$rule->replace[0]);
508                $rule->replace[1] = preg_replace(',<[^>]*>,Uims',$GLOBALS['fin_gras'],$rule->replace[1]);
509                $ruleset->addRules(array('gras'=>$rule));
510        }
511        if (isset($GLOBALS['debut_italique']) AND $rule=$ruleset->getRule('italiques')){
512                $rule->replace[0] = preg_replace(',<[^>]*>,Uims',$GLOBALS['debut_italique'],$rule->replace[0]);
513                $rule->replace[1] = preg_replace(',<[^>]*>,Uims',$GLOBALS['fin_italique'],$rule->replace[1]);
514                $ruleset->addRules(array('italiques'=>$rule));
515        }
516        if (isset($GLOBALS['ligne_horizontale']) AND $rule=$ruleset->getRule('ligne-horizontale')){
517                $rule->replace = preg_replace(',<[^>]*>,Uims',$GLOBALS['ligne_horizontale'],$rule->replace);
518                $ruleset->addRules(array('ligne-horizontale'=>$rule));
519        }
520        if (isset($GLOBALS['toujours_paragrapher']) AND !$GLOBALS['toujours_paragrapher']
521          AND $rule=$ruleset->getRule('toujours-paragrapher')) {
522                $rule->disabled = true;
523                $ruleset->addRules(array('toujours-paragrapher'=>$rule));
524        }
525}
526
527/**
528 * Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
529 *
530 * @pipeline_appel pre_propre
531 * @pipeline_appel post_propre
532 *
533 * @param string $t
534 * @param bool $show_autobr
535 * @return string
536 */
537function traiter_raccourcis($t, $show_autobr = false) {
538        static $wheel, $notes;
539        static $img_br_auto,$img_br_manuel,$img_br_no;
540
541        // hack1: respecter le tag ignore br
542        if (_AUTOBR_IGNORER
543                AND strncmp($t, _AUTOBR_IGNORER, strlen(_AUTOBR_IGNORER))==0) {
544                $ignorer_autobr = true;
545                $t = substr($t, strlen(_AUTOBR_IGNORER));
546        } else
547                $ignorer_autobr = false;
548
549        // Appeler les fonctions de pre_traitement
550        $t = pipeline('pre_propre', $t);
551
552        if (!isset($wheel)) {
553                $ruleset = SPIPTextWheelRuleset::loader(
554                        $GLOBALS['spip_wheels']['raccourcis'],'personnaliser_raccourcis'
555                );
556                $wheel = new TextWheel($ruleset);
557
558                if (_request('var_mode') == 'wheel'
559                AND autoriser('debug')) {
560                        $f = $wheel->compile();
561                        echo "<pre>\n".spip_htmlspecialchars($f)."</pre>\n";
562                        exit;
563                }
564                $notes = charger_fonction('notes', 'inc');
565        }
566
567        // Gerer les notes (ne passe pas dans le pipeline)
568        list($t, $mes_notes) = $notes($t);
569
570        $t = $wheel->text($t);
571
572        // Appeler les fonctions de post-traitement
573        $t = pipeline('post_propre', $t);
574
575        if ($mes_notes)
576                $notes($mes_notes,'traiter',$ignorer_autobr);
577
578        // hack2: wrap des autobr dans l'espace prive, pour affichage css
579        // car en css on ne sait pas styler l'element BR
580        if ($ignorer_autobr AND _AUTOBR) {
581                if (is_null($img_br_no))
582                        $img_br_no = ($show_autobr?http_img_pack("br-no-10.png",_T("tw:retour_ligne_ignore"),"class='br-no'",_T("tw:retour_ligne_ignore")):"");
583                $t = str_replace(_AUTOBR, $img_br_no, $t);
584        }
585        if ($show_autobr AND _AUTOBR) {
586                if (is_null($img_br_manuel))
587                        $img_br_manuel = http_img_pack("br-manuel-10.png",_T("tw:retour_ligne_manuel"),"class='br-manuel'",_T("tw:retour_ligne_manuel"));
588                if (is_null($img_br_auto))
589                        $img_br_auto = http_img_pack("br-auto-10.png",_T("tw:retour_ligne_auto"),"class='br-auto'",_T("tw:retour_ligne_auto"));
590                if (false !== strpos(strtolower($t), '<br')) {
591                        $t = preg_replace("/<br\b.*>/UiS", "$img_br_manuel\\0", $t);
592                        $t = str_replace($img_br_manuel._AUTOBR, $img_br_auto._AUTOBR, $t);
593                }
594        }
595
596        return $t;
597}
598
599
600/**
601 * Transforme les raccourcis SPIP, liens et modèles d'un texte en code HTML
602 *
603 * Filtre à appliquer aux champs du type `#TEXTE*`
604 *
605 * @filtre
606 * @uses echappe_html()
607 * @uses expanser_liens()
608 * @uses traiter_raccourcis()
609 * @uses echappe_retour_modeles()
610 * @see typo()
611 *
612 * @param string $t
613 *     Texte avec des raccourcis SPIP
614 * @param string|null $connect
615 *     Nom du connecteur à la bdd
616 * @param array $env
617 *     Environnement (pour les calculs de modèles)
618 * @return string $t
619 *     Texte transformé
620**/
621function propre($t, $connect=null, $env=array()) {
622        // les appels directs a cette fonction depuis le php de l'espace
623        // prive etant historiquement ecrits sans argment $connect
624        // on utilise la presence de celui-ci pour distinguer les cas
625        // ou il faut passer interdire_script explicitement
626        // les appels dans les squelettes (de l'espace prive) fournissant un $connect
627        // ne seront pas perturbes
628        $interdire_script = false;
629        if (is_null($connect) AND test_espace_prive()){
630                $connect = '';
631                $interdire_script = true;
632        }
633
634        if (!$t) return strval($t);
635
636        $t = pipeline('pre_echappe_html_propre', $t);
637
638        $t = echappe_html($t);
639        $t = expanser_liens($t,$connect, $env);
640       
641        $t = traiter_raccourcis($t, (isset($env['wysiwyg']) AND $env['wysiwyg'])?true:false);
642        $t = echappe_retour_modeles($t, $interdire_script);
643
644        return $t;
645}
646?>
Note: See TracBrowser for help on using the repository browser.