Completed
Push — master ( 6d9132...eebacf )
by cam
01:06
created
ecrire/inc/texte_mini.php 1 patch
Indentation   +520 added lines, -520 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('inc/filtres');
23 23
 include_spip('inc/lang');
@@ -39,21 +39,21 @@  discard block
 block discarded – undo
39 39
  **/
40 40
 function definir_puce() {
41 41
 
42
-	// Attention au sens, qui n'est pas defini de la meme facon dans
43
-	// l'espace prive (spip_lang est la langue de l'interface, lang_dir
44
-	// celle du texte) et public (spip_lang est la langue du texte)
45
-	$dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
42
+    // Attention au sens, qui n'est pas defini de la meme facon dans
43
+    // l'espace prive (spip_lang est la langue de l'interface, lang_dir
44
+    // celle du texte) et public (spip_lang est la langue du texte)
45
+    $dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']);
46 46
 
47
-	$p = 'puce' . (test_espace_prive() ? '_prive' : '');
48
-	if ($dir == 'rtl') {
49
-		$p .= '_rtl';
50
-	}
47
+    $p = 'puce' . (test_espace_prive() ? '_prive' : '');
48
+    if ($dir == 'rtl') {
49
+        $p .= '_rtl';
50
+    }
51 51
 
52
-	if (!isset($GLOBALS[$p])) {
53
-		$GLOBALS[$p] = '<span class="spip-puce ' . $dir . '"><b>–</b></span>';
54
-	}
52
+    if (!isset($GLOBALS[$p])) {
53
+        $GLOBALS[$p] = '<span class="spip-puce ' . $dir . '"><b>–</b></span>';
54
+    }
55 55
 
56
-	return $GLOBALS[$p];
56
+    return $GLOBALS[$p];
57 57
 }
58 58
 
59 59
 /**
@@ -67,31 +67,31 @@  discard block
 block discarded – undo
67 67
  */
68 68
 function spip_balisage_code(string $corps, bool $bloc = false, string $attributs = '', string $langage = '') {
69 69
 
70
-	$echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
71
-	$class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
72
-	if ($attributs) {
73
-		$attributs = " " . trim($attributs);
74
-	}
75
-	if ($langage) {
76
-		$class .= " language-$langage";
77
-		$attributs .= ' data-language="'. $langage .'"';
78
-	}
79
-	if ($bloc) {
80
-		$html = "<div class=\"precode\">"
81
-		  . "<pre class=\"$class\" dir=\"ltr\" style=\"text-align: left;\"$attributs>"
82
-		  . "<code>"
83
-		  . $echap
84
-		  . '</code>'
85
-		  . '</pre>'
86
-		  . '</div>';
87
-	}
88
-	else {
89
-		$echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
90
-		$echap = str_replace("  ", " &nbsp;", $echap);
91
-		$html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
92
-	}
93
-
94
-	return $html;
70
+    $echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
71
+    $class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
72
+    if ($attributs) {
73
+        $attributs = " " . trim($attributs);
74
+    }
75
+    if ($langage) {
76
+        $class .= " language-$langage";
77
+        $attributs .= ' data-language="'. $langage .'"';
78
+    }
79
+    if ($bloc) {
80
+        $html = "<div class=\"precode\">"
81
+            . "<pre class=\"$class\" dir=\"ltr\" style=\"text-align: left;\"$attributs>"
82
+            . "<code>"
83
+            . $echap
84
+            . '</code>'
85
+            . '</pre>'
86
+            . '</div>';
87
+    }
88
+    else {
89
+        $echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
90
+        $echap = str_replace("  ", " &nbsp;", $echap);
91
+        $html = "<code class=\"$class\" dir=\"ltr\"$attributs>" . $echap . '</code>';
92
+    }
93
+
94
+    return $html;
95 95
 }
96 96
 
97 97
 
@@ -99,14 +99,14 @@  discard block
 block discarded – undo
99 99
 // dont on souhaite qu'ils provoquent un saut de paragraphe
100 100
 
101 101
 if (!defined('_BALISES_BLOCS')) {
102
-	define(
103
-		'_BALISES_BLOCS',
104
-		'address|applet|article|aside|blockquote|button|center|d[ltd]|div|fieldset|fig(ure|caption)|footer|form|h[1-6r]|hgroup|head|header|iframe|li|map|marquee|nav|noscript|object|ol|pre|section|t(able|[rdh]|body|foot|extarea)|ul|script|style'
105
-	);
102
+    define(
103
+        '_BALISES_BLOCS',
104
+        'address|applet|article|aside|blockquote|button|center|d[ltd]|div|fieldset|fig(ure|caption)|footer|form|h[1-6r]|hgroup|head|header|iframe|li|map|marquee|nav|noscript|object|ol|pre|section|t(able|[rdh]|body|foot|extarea)|ul|script|style'
105
+    );
106 106
 }
107 107
 
108 108
 if (!defined('_BALISES_BLOCS_REGEXP')) {
109
-	define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS');
109
+    define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS');
110 110
 }
111 111
 
112 112
 //
@@ -117,100 +117,100 @@  discard block
 block discarded – undo
117 117
 // une $source differente ; le script detecte automagiquement si ce qu'on
118 118
 // echappe est un div ou un span
119 119
 function code_echappement($rempl, $source = '', $no_transform = false, $mode = null) {
120
-	if (!strlen($rempl)) {
121
-		return '';
122
-	}
123
-
124
-	// Tester si on echappe en span ou en div
125
-	if (is_null($mode) or !in_array($mode, ['div', 'span'])) {
126
-		$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span';
127
-	}
128
-
129
-	// Decouper en morceaux, base64 a des probleme selon la taille de la pile
130
-	$taille = 30000;
131
-	$return = '';
132
-	for ($i = 0; $i < strlen($rempl); $i += $taille) {
133
-		// Convertir en base64 et cacher dans un attribut
134
-		// utiliser les " pour eviter le re-encodage de ' et &#8217
135
-		$base64 = base64_encode(substr($rempl, $i, $taille));
136
-		$return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
137
-	}
138
-
139
-	return $return;
120
+    if (!strlen($rempl)) {
121
+        return '';
122
+    }
123
+
124
+    // Tester si on echappe en span ou en div
125
+    if (is_null($mode) or !in_array($mode, ['div', 'span'])) {
126
+        $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span';
127
+    }
128
+
129
+    // Decouper en morceaux, base64 a des probleme selon la taille de la pile
130
+    $taille = 30000;
131
+    $return = '';
132
+    for ($i = 0; $i < strlen($rempl); $i += $taille) {
133
+        // Convertir en base64 et cacher dans un attribut
134
+        // utiliser les " pour eviter le re-encodage de ' et &#8217
135
+        $base64 = base64_encode(substr($rempl, $i, $taille));
136
+        $return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
137
+    }
138
+
139
+    return $return;
140 140
 }
141 141
 
142 142
 
143 143
 // Echapper les <html>...</ html>
144 144
 function traiter_echap_html_dist($regs, $options = []) {
145
-	return $regs[3];
145
+    return $regs[3];
146 146
 }
147 147
 
148 148
 // Echapper les <pre>...</ pre>
149 149
 function traiter_echap_pre_dist($regs, $options = []) {
150
-	// echapper les <code> dans <pre>
151
-	$pre = $regs[3];
152
-
153
-	// echapper les < dans <code>
154
-	// on utilise _PROTEGE_BLOCS pour simplifier le code et la maintenance, mais on est interesse que par <code>
155
-	if (
156
-		strpos($pre, '<') !== false
157
-		and preg_match_all(_PROTEGE_BLOCS, $pre, $matches, PREG_SET_ORDER)
158
-	) {
159
-		foreach ($matches as $m) {
160
-			if ($m[1] === 'code') {
161
-				$code = '<code' . $m[2] . '>' . spip_htmlspecialchars($m[3]) . '</code>';
162
-				$pre = str_replace($m[0], $code, $pre);
163
-			}
164
-		}
165
-	}
166
-	return "<pre>$pre</pre>";
150
+    // echapper les <code> dans <pre>
151
+    $pre = $regs[3];
152
+
153
+    // echapper les < dans <code>
154
+    // on utilise _PROTEGE_BLOCS pour simplifier le code et la maintenance, mais on est interesse que par <code>
155
+    if (
156
+        strpos($pre, '<') !== false
157
+        and preg_match_all(_PROTEGE_BLOCS, $pre, $matches, PREG_SET_ORDER)
158
+    ) {
159
+        foreach ($matches as $m) {
160
+            if ($m[1] === 'code') {
161
+                $code = '<code' . $m[2] . '>' . spip_htmlspecialchars($m[3]) . '</code>';
162
+                $pre = str_replace($m[0], $code, $pre);
163
+            }
164
+        }
165
+    }
166
+    return "<pre>$pre</pre>";
167 167
 }
168 168
 
169 169
 // Echapper les <code>...</ code>
170 170
 function traiter_echap_code_dist($regs, $options = []) {
171
-	[, , $att, $corps] = $regs;
171
+    [, , $att, $corps] = $regs;
172 172
 
173
-	// ne pas mettre le <div...> s'il n'y a qu'une ligne
174
-	if (strpos($corps, "\n") !== false) {
175
-		// supprimer les sauts de ligne debut/fin
176
-		// (mais pas les espaces => ascii art).
177
-		$corps = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $corps);
173
+    // ne pas mettre le <div...> s'il n'y a qu'une ligne
174
+    if (strpos($corps, "\n") !== false) {
175
+        // supprimer les sauts de ligne debut/fin
176
+        // (mais pas les espaces => ascii art).
177
+        $corps = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $corps);
178 178
 
179
-		$echap = spip_balisage_code($corps, true, $att);
180
-	} else {
181
-		$echap = spip_balisage_code($corps, false, $att);
182
-	}
179
+        $echap = spip_balisage_code($corps, true, $att);
180
+    } else {
181
+        $echap = spip_balisage_code($corps, false, $att);
182
+    }
183 183
 
184
-	return $echap;
184
+    return $echap;
185 185
 }
186 186
 
187 187
 // Echapper les <cadre>...</ cadre> aka <frame>...</ frame>
188 188
 function traiter_echap_cadre_dist($regs, $options = []) {
189
-	$echap = trim(entites_html($regs[3]));
190
-	// compter les lignes un peu plus finement qu'avec les \n
191
-	$lignes = explode("\n", trim($echap));
192
-	$n = 0;
193
-	foreach ($lignes as $l) {
194
-		$n += floor(strlen($l) / 60) + 1;
195
-	}
196
-	$n = max($n, 2);
197
-	$echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre spip_cadre_block' dir='ltr'>$echap</textarea>";
198
-
199
-	return $echap;
189
+    $echap = trim(entites_html($regs[3]));
190
+    // compter les lignes un peu plus finement qu'avec les \n
191
+    $lignes = explode("\n", trim($echap));
192
+    $n = 0;
193
+    foreach ($lignes as $l) {
194
+        $n += floor(strlen($l) / 60) + 1;
195
+    }
196
+    $n = max($n, 2);
197
+    $echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre spip_cadre_block' dir='ltr'>$echap</textarea>";
198
+
199
+    return $echap;
200 200
 }
201 201
 
202 202
 function traiter_echap_frame_dist($regs, $options = []) {
203
-	return traiter_echap_cadre_dist($regs);
203
+    return traiter_echap_cadre_dist($regs);
204 204
 }
205 205
 
206 206
 function traiter_echap_script_dist($regs, $options = []) {
207
-	// rendre joli (et inactif) si c'est un script language=php
208
-	if (preg_match(',<script\b[^>]+php,ims', $regs[0])) {
209
-		return highlight_string($regs[0], true);
210
-	}
207
+    // rendre joli (et inactif) si c'est un script language=php
208
+    if (preg_match(',<script\b[^>]+php,ims', $regs[0])) {
209
+        return highlight_string($regs[0], true);
210
+    }
211 211
 
212
-	// Cas normal : le script passe tel quel
213
-	return $regs[0];
212
+    // Cas normal : le script passe tel quel
213
+    return $regs[0];
214 214
 }
215 215
 
216 216
 define('_PROTEGE_BLOCS', ',<(html|pre|code|cadre|frame|script|style)(\b[^>]*)?>(.*)</\1>,UimsS');
@@ -229,73 +229,73 @@  discard block
 block discarded – undo
229 229
  * @return string|string[]
230 230
  */
231 231
 function echappe_html(
232
-	$letexte,
233
-	$source = '',
234
-	$no_transform = false,
235
-	$preg = '',
236
-	$callback_prefix = '',
237
-	$callback_options = []
232
+    $letexte,
233
+    $source = '',
234
+    $no_transform = false,
235
+    $preg = '',
236
+    $callback_prefix = '',
237
+    $callback_options = []
238 238
 ) {
239
-	if (!is_string($letexte) or !strlen($letexte)) {
240
-		return $letexte;
241
-	}
242
-
243
-	if (
244
-		($preg or str_contains($letexte, '<'))
245
-		and preg_match_all($preg ?: _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)
246
-	) {
247
-		foreach ($matches as $regs) {
248
-			// echappements tels quels ?
249
-			if ($no_transform) {
250
-				$echap = $regs[0];
251
-			} // sinon les traiter selon le cas
252
-			else {
253
-				$callback_secure_prefix = ($callback_options['secure_prefix'] ?? '');
254
-				if (
255
-					function_exists($f = $callback_prefix . $callback_secure_prefix . 'traiter_echap_' . strtolower($regs[1]))
256
-					or function_exists($f = $f . '_dist')
257
-					or ($callback_secure_prefix and (
258
-						function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1]))
259
-						or function_exists($f = $f . '_dist')
260
-					))
261
-				) {
262
-					$echap = $f($regs, $callback_options);
263
-				}
264
-			}
265
-
266
-			$p = strpos($letexte, (string) $regs[0]);
267
-			$letexte = substr_replace($letexte, code_echappement($echap, $source, $no_transform), $p, strlen($regs[0]));
268
-		}
269
-	}
270
-
271
-	if ($no_transform) {
272
-		return $letexte;
273
-	}
274
-
275
-	// Echapper le php pour faire joli (ici, c'est pas pour la securite)
276
-	// seulement si on a echappe les <script>
277
-	// (derogatoire car on ne peut pas faire passer < ? ... ? >
278
-	// dans une callback autonommee
279
-	if (strpos($preg ?: _PROTEGE_BLOCS, 'script') !== false) {
280
-		if (
281
-			strpos($letexte, '<' . '?') !== false and preg_match_all(
282
-				',<[?].*($|[?]>),UisS',
283
-				$letexte,
284
-				$matches,
285
-				PREG_SET_ORDER
286
-			)
287
-		) {
288
-			foreach ($matches as $regs) {
289
-				$letexte = str_replace(
290
-					$regs[0],
291
-					code_echappement(highlight_string($regs[0], true), $source),
292
-					$letexte
293
-				);
294
-			}
295
-		}
296
-	}
297
-
298
-	return $letexte;
239
+    if (!is_string($letexte) or !strlen($letexte)) {
240
+        return $letexte;
241
+    }
242
+
243
+    if (
244
+        ($preg or str_contains($letexte, '<'))
245
+        and preg_match_all($preg ?: _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)
246
+    ) {
247
+        foreach ($matches as $regs) {
248
+            // echappements tels quels ?
249
+            if ($no_transform) {
250
+                $echap = $regs[0];
251
+            } // sinon les traiter selon le cas
252
+            else {
253
+                $callback_secure_prefix = ($callback_options['secure_prefix'] ?? '');
254
+                if (
255
+                    function_exists($f = $callback_prefix . $callback_secure_prefix . 'traiter_echap_' . strtolower($regs[1]))
256
+                    or function_exists($f = $f . '_dist')
257
+                    or ($callback_secure_prefix and (
258
+                        function_exists($f = $callback_prefix . 'traiter_echap_' . strtolower($regs[1]))
259
+                        or function_exists($f = $f . '_dist')
260
+                    ))
261
+                ) {
262
+                    $echap = $f($regs, $callback_options);
263
+                }
264
+            }
265
+
266
+            $p = strpos($letexte, (string) $regs[0]);
267
+            $letexte = substr_replace($letexte, code_echappement($echap, $source, $no_transform), $p, strlen($regs[0]));
268
+        }
269
+    }
270
+
271
+    if ($no_transform) {
272
+        return $letexte;
273
+    }
274
+
275
+    // Echapper le php pour faire joli (ici, c'est pas pour la securite)
276
+    // seulement si on a echappe les <script>
277
+    // (derogatoire car on ne peut pas faire passer < ? ... ? >
278
+    // dans une callback autonommee
279
+    if (strpos($preg ?: _PROTEGE_BLOCS, 'script') !== false) {
280
+        if (
281
+            strpos($letexte, '<' . '?') !== false and preg_match_all(
282
+                ',<[?].*($|[?]>),UisS',
283
+                $letexte,
284
+                $matches,
285
+                PREG_SET_ORDER
286
+            )
287
+        ) {
288
+            foreach ($matches as $regs) {
289
+                $letexte = str_replace(
290
+                    $regs[0],
291
+                    code_echappement(highlight_string($regs[0], true), $source),
292
+                    $letexte
293
+                );
294
+            }
295
+        }
296
+    }
297
+
298
+    return $letexte;
299 299
 }
300 300
 
301 301
 //
@@ -303,57 +303,57 @@  discard block
 block discarded – undo
303 303
 // Rq: $source sert a faire des echappements "a soi" qui ne sont pas nettoyes
304 304
 // par propre() : exemple dans multi et dans typo()
305 305
 function echappe_retour($letexte, $source = '', $filtre = '') {
306
-	if (strpos($letexte, (string) "base64$source")) {
307
-		# spip_log(spip_htmlspecialchars($letexte));  ## pour les curieux
308
-		$max_prof = 5;
309
-		while (
310
-			strpos($letexte, '<') !== false
311
-			and
312
-			preg_match_all(
313
-				',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS',
314
-				$letexte,
315
-				$regs,
316
-				PREG_SET_ORDER
317
-			)
318
-			and $max_prof--
319
-		) {
320
-			foreach ($regs as $reg) {
321
-				$rempl = base64_decode(extraire_attribut($reg[0], 'title'));
322
-				// recherche d'attributs supplementaires
323
-				$at = [];
324
-				foreach (['lang', 'dir'] as $attr) {
325
-					if ($a = extraire_attribut($reg[0], $attr)) {
326
-						$at[$attr] = $a;
327
-					}
328
-				}
329
-				if ($at) {
330
-					$rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>';
331
-					foreach ($at as $attr => $a) {
332
-						$rempl = inserer_attribut($rempl, $attr, $a);
333
-					}
334
-				}
335
-				if ($filtre) {
336
-					$rempl = $filtre($rempl);
337
-				}
338
-				$letexte = str_replace($reg[0], $rempl, $letexte);
339
-			}
340
-		}
341
-	}
342
-
343
-	return $letexte;
306
+    if (strpos($letexte, (string) "base64$source")) {
307
+        # spip_log(spip_htmlspecialchars($letexte));  ## pour les curieux
308
+        $max_prof = 5;
309
+        while (
310
+            strpos($letexte, '<') !== false
311
+            and
312
+            preg_match_all(
313
+                ',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS',
314
+                $letexte,
315
+                $regs,
316
+                PREG_SET_ORDER
317
+            )
318
+            and $max_prof--
319
+        ) {
320
+            foreach ($regs as $reg) {
321
+                $rempl = base64_decode(extraire_attribut($reg[0], 'title'));
322
+                // recherche d'attributs supplementaires
323
+                $at = [];
324
+                foreach (['lang', 'dir'] as $attr) {
325
+                    if ($a = extraire_attribut($reg[0], $attr)) {
326
+                        $at[$attr] = $a;
327
+                    }
328
+                }
329
+                if ($at) {
330
+                    $rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>';
331
+                    foreach ($at as $attr => $a) {
332
+                        $rempl = inserer_attribut($rempl, $attr, $a);
333
+                    }
334
+                }
335
+                if ($filtre) {
336
+                    $rempl = $filtre($rempl);
337
+                }
338
+                $letexte = str_replace($reg[0], $rempl, $letexte);
339
+            }
340
+        }
341
+    }
342
+
343
+    return $letexte;
344 344
 }
345 345
 
346 346
 // Reinserer le javascript de confiance (venant des modeles)
347 347
 
348 348
 function echappe_retour_modeles($letexte, $interdire_scripts = false) {
349
-	$letexte = echappe_retour($letexte);
349
+    $letexte = echappe_retour($letexte);
350 350
 
351
-	// Dans les appels directs hors squelette, securiser aussi ici
352
-	if ($interdire_scripts) {
353
-		$letexte = interdire_scripts($letexte);
354
-	}
351
+    // Dans les appels directs hors squelette, securiser aussi ici
352
+    if ($interdire_scripts) {
353
+        $letexte = interdire_scripts($letexte);
354
+    }
355 355
 
356
-	return trim($letexte);
356
+    return trim($letexte);
357 357
 }
358 358
 
359 359
 
@@ -381,131 +381,131 @@  discard block
 block discarded – undo
381 381
  *     texte coupé
382 382
  **/
383 383
 function couper($texte, $taille = 50, $suite = null) {
384
-	if (!($length = strlen($texte)) or $taille <= 0) {
385
-		return '';
386
-	}
387
-	$offset = 400 + 2 * $taille;
388
-	while (
389
-		$offset < $length
390
-		and strlen(preg_replace(',<(!--|\w|/)[^>]+>,Uims', '', substr($texte, 0, $offset))) < $taille
391
-	) {
392
-		$offset = 2 * $offset;
393
-	}
394
-	if (
395
-		$offset < $length
396
-		&& ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== null
397
-	) {
398
-		$p_tag_fermant = strpos($texte, '>', $offset);
399
-		if ($p_tag_fermant && ($p_tag_fermant < $p_tag_ouvrant)) {
400
-			$offset = $p_tag_fermant + 1;
401
-		} // prolonger la coupe jusqu'au tag fermant suivant eventuel
402
-	}
403
-	$texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */
404
-
405
-	if (!function_exists('nettoyer_raccourcis_typo')) {
406
-		include_spip('inc/lien');
407
-	}
408
-	$texte = nettoyer_raccourcis_typo($texte);
409
-
410
-	// balises de sauts de ligne et paragraphe
411
-	$texte = preg_replace('/<p( [^>]*)?' . '>/', "\r", $texte);
412
-	$texte = preg_replace('/<br( [^>]*)?' . '>/', "\n", $texte);
413
-
414
-	// on repasse les doubles \n en \r que nettoyer_raccourcis_typo() a pu modifier
415
-	$texte = str_replace("\n\n", "\r", $texte);
416
-
417
-	// supprimer les tags
418
-	$texte = supprimer_tags($texte);
419
-	$texte = trim(str_replace("\n", ' ', $texte));
420
-	$texte .= "\n";  // marquer la fin
421
-
422
-	// corriger la longueur de coupe
423
-	// en fonction de la presence de caracteres utf
424
-	if ($GLOBALS['meta']['charset'] == 'utf-8') {
425
-		$long = charset2unicode($texte);
426
-		$long = spip_substr($long, 0, max($taille, 1));
427
-		$nbcharutf = preg_match_all('/(&#[0-9]{3,6};)/S', $long, $matches);
428
-		$taille += $nbcharutf;
429
-	}
430
-
431
-
432
-	// couper au mot precedent
433
-	$long = spip_substr($texte, 0, max($taille - 4, 1));
434
-	$u = $GLOBALS['meta']['pcre_u'];
435
-	$court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
436
-	if (is_null($suite)) {
437
-		$suite = (defined('_COUPER_SUITE') ? _COUPER_SUITE : '&nbsp;(...)');
438
-	}
439
-	$points = $suite;
440
-
441
-	// trop court ? ne pas faire de (...)
442
-	if (spip_strlen($court) < max(0.75 * $taille, 2)) {
443
-		$points = '';
444
-		$long = spip_substr($texte, 0, $taille);
445
-		$texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
446
-		// encore trop court ? couper au caractere
447
-		if (spip_strlen($texte) < 0.75 * $taille) {
448
-			$texte = $long;
449
-		}
450
-	} else {
451
-		$texte = $court;
452
-	}
453
-
454
-	if (strpos($texte, "\n")) {  // la fin est encore la : c'est qu'on n'a pas de texte de suite
455
-	$points = '';
456
-	}
457
-
458
-	// remettre les paragraphes
459
-	$texte = preg_replace("/\r+/", "\n\n", $texte);
460
-
461
-	// supprimer l'eventuelle entite finale mal coupee
462
-	$texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
463
-
464
-	return quote_amp(trim($texte)) . $points;
384
+    if (!($length = strlen($texte)) or $taille <= 0) {
385
+        return '';
386
+    }
387
+    $offset = 400 + 2 * $taille;
388
+    while (
389
+        $offset < $length
390
+        and strlen(preg_replace(',<(!--|\w|/)[^>]+>,Uims', '', substr($texte, 0, $offset))) < $taille
391
+    ) {
392
+        $offset = 2 * $offset;
393
+    }
394
+    if (
395
+        $offset < $length
396
+        && ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== null
397
+    ) {
398
+        $p_tag_fermant = strpos($texte, '>', $offset);
399
+        if ($p_tag_fermant && ($p_tag_fermant < $p_tag_ouvrant)) {
400
+            $offset = $p_tag_fermant + 1;
401
+        } // prolonger la coupe jusqu'au tag fermant suivant eventuel
402
+    }
403
+    $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */
404
+
405
+    if (!function_exists('nettoyer_raccourcis_typo')) {
406
+        include_spip('inc/lien');
407
+    }
408
+    $texte = nettoyer_raccourcis_typo($texte);
409
+
410
+    // balises de sauts de ligne et paragraphe
411
+    $texte = preg_replace('/<p( [^>]*)?' . '>/', "\r", $texte);
412
+    $texte = preg_replace('/<br( [^>]*)?' . '>/', "\n", $texte);
413
+
414
+    // on repasse les doubles \n en \r que nettoyer_raccourcis_typo() a pu modifier
415
+    $texte = str_replace("\n\n", "\r", $texte);
416
+
417
+    // supprimer les tags
418
+    $texte = supprimer_tags($texte);
419
+    $texte = trim(str_replace("\n", ' ', $texte));
420
+    $texte .= "\n";  // marquer la fin
421
+
422
+    // corriger la longueur de coupe
423
+    // en fonction de la presence de caracteres utf
424
+    if ($GLOBALS['meta']['charset'] == 'utf-8') {
425
+        $long = charset2unicode($texte);
426
+        $long = spip_substr($long, 0, max($taille, 1));
427
+        $nbcharutf = preg_match_all('/(&#[0-9]{3,6};)/S', $long, $matches);
428
+        $taille += $nbcharutf;
429
+    }
430
+
431
+
432
+    // couper au mot precedent
433
+    $long = spip_substr($texte, 0, max($taille - 4, 1));
434
+    $u = $GLOBALS['meta']['pcre_u'];
435
+    $court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
436
+    if (is_null($suite)) {
437
+        $suite = (defined('_COUPER_SUITE') ? _COUPER_SUITE : '&nbsp;(...)');
438
+    }
439
+    $points = $suite;
440
+
441
+    // trop court ? ne pas faire de (...)
442
+    if (spip_strlen($court) < max(0.75 * $taille, 2)) {
443
+        $points = '';
444
+        $long = spip_substr($texte, 0, $taille);
445
+        $texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long);
446
+        // encore trop court ? couper au caractere
447
+        if (spip_strlen($texte) < 0.75 * $taille) {
448
+            $texte = $long;
449
+        }
450
+    } else {
451
+        $texte = $court;
452
+    }
453
+
454
+    if (strpos($texte, "\n")) {  // la fin est encore la : c'est qu'on n'a pas de texte de suite
455
+    $points = '';
456
+    }
457
+
458
+    // remettre les paragraphes
459
+    $texte = preg_replace("/\r+/", "\n\n", $texte);
460
+
461
+    // supprimer l'eventuelle entite finale mal coupee
462
+    $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
463
+
464
+    return quote_amp(trim($texte)) . $points;
465 465
 }
466 466
 
467 467
 
468 468
 function protege_js_modeles($t) {
469
-	if (isset($GLOBALS['visiteur_session'])) {
470
-		if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) {
471
-			if (!defined('_PROTEGE_JS_MODELES')) {
472
-				include_spip('inc/acces');
473
-				define('_PROTEGE_JS_MODELES', creer_uniqid());
474
-			}
475
-			foreach ($r as $regs) {
476
-				$t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t);
477
-			}
478
-		}
479
-		if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) {
480
-			if (!defined('_PROTEGE_PHP_MODELES')) {
481
-				include_spip('inc/acces');
482
-				define('_PROTEGE_PHP_MODELES', creer_uniqid());
483
-			}
484
-			foreach ($r as $regs) {
485
-				$t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t);
486
-			}
487
-		}
488
-	}
489
-
490
-	return $t;
469
+    if (isset($GLOBALS['visiteur_session'])) {
470
+        if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) {
471
+            if (!defined('_PROTEGE_JS_MODELES')) {
472
+                include_spip('inc/acces');
473
+                define('_PROTEGE_JS_MODELES', creer_uniqid());
474
+            }
475
+            foreach ($r as $regs) {
476
+                $t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t);
477
+            }
478
+        }
479
+        if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) {
480
+            if (!defined('_PROTEGE_PHP_MODELES')) {
481
+                include_spip('inc/acces');
482
+                define('_PROTEGE_PHP_MODELES', creer_uniqid());
483
+            }
484
+            foreach ($r as $regs) {
485
+                $t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t);
486
+            }
487
+        }
488
+    }
489
+
490
+    return $t;
491 491
 }
492 492
 
493 493
 
494 494
 function echapper_faux_tags($letexte) {
495
-	if (strpos($letexte, '<') === false) {
496
-		return $letexte;
497
-	}
498
-	$textMatches = preg_split(',(</?[a-z!][^<>]*>),', $letexte, -1, PREG_SPLIT_DELIM_CAPTURE);
499
-
500
-	$letexte = '';
501
-	while (is_countable($textMatches) ? count($textMatches) : 0) {
502
-		// un texte a echapper
503
-		$letexte .= str_replace('<', '&lt;', array_shift($textMatches));
504
-		// un tag html qui a servit a faite le split
505
-		$letexte .= array_shift($textMatches);
506
-	}
507
-
508
-	return $letexte;
495
+    if (strpos($letexte, '<') === false) {
496
+        return $letexte;
497
+    }
498
+    $textMatches = preg_split(',(</?[a-z!][^<>]*>),', $letexte, -1, PREG_SPLIT_DELIM_CAPTURE);
499
+
500
+    $letexte = '';
501
+    while (is_countable($textMatches) ? count($textMatches) : 0) {
502
+        // un texte a echapper
503
+        $letexte .= str_replace('<', '&lt;', array_shift($textMatches));
504
+        // un tag html qui a servit a faite le split
505
+        $letexte .= array_shift($textMatches);
506
+    }
507
+
508
+    return $letexte;
509 509
 }
510 510
 
511 511
 /**
@@ -525,115 +525,115 @@  discard block
 block discarded – undo
525 525
  * @return string
526 526
  */
527 527
 function echapper_html_suspect($texte, $options = [], $connect = null, $env = []) {
528
-	static $echapper_html_suspect;
529
-	if (!$texte or !is_string($texte)) {
530
-		return $texte;
531
-	}
532
-
533
-	if (!isset($echapper_html_suspect)) {
534
-		$echapper_html_suspect = charger_fonction('echapper_html_suspect', 'inc', true);
535
-	}
536
-	// si fonction personalisee, on delegue
537
-	if ($echapper_html_suspect) {
538
-		// on collecte le tableau d'arg minimal pour ne pas casser un appel a une fonction inc_echapper_html_suspect() selon l'ancienne signature
539
-		$args = [$texte, $options];
540
-		if ($connect or !empty($env)) {
541
-			$args[] = $connect;
542
-		}
543
-		if (!empty($env)) {
544
-			$args[] = $env;
545
-		}
546
-		return $echapper_html_suspect(...$args);
547
-	}
548
-
549
-	if (is_bool($options)) {
550
-		$options = ['strict' => $options];
551
-	}
552
-	$strict = $options['strict'] ?? true;
553
-
554
-	// pas de balise html ou pas d'attribut sur les balises ? c'est OK
555
-	if (
556
-		strpos($texte, '<') === false
557
-		or !str_contains($texte, '=')
558
-	) {
559
-		return $texte;
560
-	}
561
-
562
-	// dans le prive, on veut afficher tout echappé pour la moderation
563
-	if (!isset($env['espace_prive'])) {
564
-		// conserver le comportement historique en cas d'appel court sans env
565
-		$env['espace_prive'] = test_espace_prive();
566
-	}
567
-	if (!empty($env['espace_prive']) or !empty($env['wysiwyg'])) {
568
-
569
-		// quand c'est du texte qui passe par propre on est plus coulant tant qu'il y a pas d'attribut du type onxxx=
570
-		// car sinon on declenche sur les modeles ou ressources
571
-		if (
572
-			!$strict and
573
-			(strpos($texte, 'on') === false or !preg_match(",<\w+.*\bon\w+\s*=,UimsS", $texte))
574
-		) {
575
-			return $texte;
576
-		}
577
-
578
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
579
-		include_spip("src/Texte/Collecteur/Modeles");
580
-		$collecteurModeles = new Spip\Texte\Collecteur\Modeles();
581
-		$texte = $collecteurModeles->echapper($texte);
582
-		$texte = echappe_js($texte);
583
-
584
-		$texte_to_check = $texte;
585
-		// si les raccourcis liens vont etre interprétés, il faut les expanser avant de vérifier que le html est safe
586
-		// car un raccourci peut etre utilisé pour faire un lien malin
587
-		// et un raccourci est potentiellement modifié par safehtml, ce qui fait un faux positif dans is_html_safe
588
-		if (!empty($options['expanser_liens'])) {
589
-			$texte_to_check = expanser_liens($texte_to_check, $env['connect'] ?? '', $env['env'] ?? []);
590
-		}
591
-		if (!is_html_safe($texte_to_check)) {
592
-			$texte = $options['texte_source_affiche'] ?? $texte;
593
-			$texte = preg_replace(",<(/?\w+\b[^>]*>),", "<tt>&lt;\\1</tt>", $texte);
594
-			$texte = str_replace('<', '&lt;', $texte);
595
-			$texte = str_replace('&lt;tt>', '<tt>', $texte);
596
-			$texte = str_replace('&lt;/tt>', '</tt>', $texte);
597
-			if (!function_exists('attribut_html')) {
598
-				include_spip('inc/filtres');
599
-			}
600
-			if (!empty($options['wrap_suspect'])) {
601
-				$texte = wrap($texte, $options['wrap_suspect']);
602
-			}
603
-			$texte = "<mark class='danger-js' title='" . attribut_html(_T('erreur_contenu_suspect')) . "'>⚠️</mark> " . $texte;
604
-		}
605
-
606
-		$texte = $collecteurModeles->retablir($texte);
607
-	}
608
-
609
-	// si on est là dans le public c'est le mode parano
610
-	// on veut donc un rendu propre et secure, et virer silencieusement ce qui est dangereux
611
-	else {
612
-		$collecteurLiens = $collecteurModeles = null;
613
-		if (!empty($options['expanser_liens'])) {
614
-			$texte = expanser_liens($texte, $env['connect'] ?? '', $env['env'] ?? []);
615
-		}
616
-		else {
617
-			include_spip("src/Texte/Collecteur/AbstractCollecteur");
618
-			include_spip("src/Texte/Collecteur/Liens");
619
-			include_spip("src/Texte/Collecteur/Modeles");
620
-
621
-			$collecteurLiens = new Spip\Texte\Collecteur\Liens();
622
-			$texte = $collecteurLiens->echapper($texte, ['sanitize_callback' => 'safehtml']);
623
-
624
-			$collecteurModeles = new Spip\Texte\Collecteur\Modeles();
625
-			$texte = $collecteurModeles->echapper($texte);
626
-		}
627
-		$texte = safehtml($texte);
628
-		if ($collecteurModeles) {
629
-			$texte = $collecteurModeles->retablir($texte);
630
-		}
631
-		if ($collecteurLiens) {
632
-			$texte = $collecteurLiens->retablir($texte);
633
-		}
634
-	}
635
-
636
-	return $texte;
528
+    static $echapper_html_suspect;
529
+    if (!$texte or !is_string($texte)) {
530
+        return $texte;
531
+    }
532
+
533
+    if (!isset($echapper_html_suspect)) {
534
+        $echapper_html_suspect = charger_fonction('echapper_html_suspect', 'inc', true);
535
+    }
536
+    // si fonction personalisee, on delegue
537
+    if ($echapper_html_suspect) {
538
+        // on collecte le tableau d'arg minimal pour ne pas casser un appel a une fonction inc_echapper_html_suspect() selon l'ancienne signature
539
+        $args = [$texte, $options];
540
+        if ($connect or !empty($env)) {
541
+            $args[] = $connect;
542
+        }
543
+        if (!empty($env)) {
544
+            $args[] = $env;
545
+        }
546
+        return $echapper_html_suspect(...$args);
547
+    }
548
+
549
+    if (is_bool($options)) {
550
+        $options = ['strict' => $options];
551
+    }
552
+    $strict = $options['strict'] ?? true;
553
+
554
+    // pas de balise html ou pas d'attribut sur les balises ? c'est OK
555
+    if (
556
+        strpos($texte, '<') === false
557
+        or !str_contains($texte, '=')
558
+    ) {
559
+        return $texte;
560
+    }
561
+
562
+    // dans le prive, on veut afficher tout echappé pour la moderation
563
+    if (!isset($env['espace_prive'])) {
564
+        // conserver le comportement historique en cas d'appel court sans env
565
+        $env['espace_prive'] = test_espace_prive();
566
+    }
567
+    if (!empty($env['espace_prive']) or !empty($env['wysiwyg'])) {
568
+
569
+        // quand c'est du texte qui passe par propre on est plus coulant tant qu'il y a pas d'attribut du type onxxx=
570
+        // car sinon on declenche sur les modeles ou ressources
571
+        if (
572
+            !$strict and
573
+            (strpos($texte, 'on') === false or !preg_match(",<\w+.*\bon\w+\s*=,UimsS", $texte))
574
+        ) {
575
+            return $texte;
576
+        }
577
+
578
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
579
+        include_spip("src/Texte/Collecteur/Modeles");
580
+        $collecteurModeles = new Spip\Texte\Collecteur\Modeles();
581
+        $texte = $collecteurModeles->echapper($texte);
582
+        $texte = echappe_js($texte);
583
+
584
+        $texte_to_check = $texte;
585
+        // si les raccourcis liens vont etre interprétés, il faut les expanser avant de vérifier que le html est safe
586
+        // car un raccourci peut etre utilisé pour faire un lien malin
587
+        // et un raccourci est potentiellement modifié par safehtml, ce qui fait un faux positif dans is_html_safe
588
+        if (!empty($options['expanser_liens'])) {
589
+            $texte_to_check = expanser_liens($texte_to_check, $env['connect'] ?? '', $env['env'] ?? []);
590
+        }
591
+        if (!is_html_safe($texte_to_check)) {
592
+            $texte = $options['texte_source_affiche'] ?? $texte;
593
+            $texte = preg_replace(",<(/?\w+\b[^>]*>),", "<tt>&lt;\\1</tt>", $texte);
594
+            $texte = str_replace('<', '&lt;', $texte);
595
+            $texte = str_replace('&lt;tt>', '<tt>', $texte);
596
+            $texte = str_replace('&lt;/tt>', '</tt>', $texte);
597
+            if (!function_exists('attribut_html')) {
598
+                include_spip('inc/filtres');
599
+            }
600
+            if (!empty($options['wrap_suspect'])) {
601
+                $texte = wrap($texte, $options['wrap_suspect']);
602
+            }
603
+            $texte = "<mark class='danger-js' title='" . attribut_html(_T('erreur_contenu_suspect')) . "'>⚠️</mark> " . $texte;
604
+        }
605
+
606
+        $texte = $collecteurModeles->retablir($texte);
607
+    }
608
+
609
+    // si on est là dans le public c'est le mode parano
610
+    // on veut donc un rendu propre et secure, et virer silencieusement ce qui est dangereux
611
+    else {
612
+        $collecteurLiens = $collecteurModeles = null;
613
+        if (!empty($options['expanser_liens'])) {
614
+            $texte = expanser_liens($texte, $env['connect'] ?? '', $env['env'] ?? []);
615
+        }
616
+        else {
617
+            include_spip("src/Texte/Collecteur/AbstractCollecteur");
618
+            include_spip("src/Texte/Collecteur/Liens");
619
+            include_spip("src/Texte/Collecteur/Modeles");
620
+
621
+            $collecteurLiens = new Spip\Texte\Collecteur\Liens();
622
+            $texte = $collecteurLiens->echapper($texte, ['sanitize_callback' => 'safehtml']);
623
+
624
+            $collecteurModeles = new Spip\Texte\Collecteur\Modeles();
625
+            $texte = $collecteurModeles->echapper($texte);
626
+        }
627
+        $texte = safehtml($texte);
628
+        if ($collecteurModeles) {
629
+            $texte = $collecteurModeles->retablir($texte);
630
+        }
631
+        if ($collecteurLiens) {
632
+            $texte = $collecteurLiens->retablir($texte);
633
+        }
634
+    }
635
+
636
+    return $texte;
637 637
 }
638 638
 
639 639
 
@@ -654,52 +654,52 @@  discard block
 block discarded – undo
654 654
  *      texte sécurisé
655 655
  **/
656 656
 function safehtml($t) {
657
-	static $safehtml;
658
-
659
-	if (!$t or !is_string($t)) {
660
-		return $t;
661
-	}
662
-	# attention safehtml nettoie deux ou trois caracteres de plus. A voir
663
-	if (strpos($t, '<') === false) {
664
-		return str_replace("\x00", '', $t);
665
-	}
666
-
667
-	$collecteurIdiomes = null;
668
-	if (stripos($t, '<:') !== false) {
669
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
670
-		include_spip("src/Texte/Collecteur/Idiomes");
671
-		$collecteurIdiomes = new Spip\Texte\Collecteur\Idiomes();
672
-		$t = $collecteurIdiomes->echapper($t);
673
-	}
674
-	$collecteurMultis = null;
675
-	if (stripos($t, '<multi') !== false) {
676
-		include_spip("src/Texte/Collecteur/AbstractCollecteur");
677
-		include_spip("src/Texte/Collecteur/Multis");
678
-		$collecteurMultis = new Spip\Texte\Collecteur\Multis();
679
-		$t = $collecteurMultis->echapper($t, ['sanitize_callback' => 'safehtml']);
680
-	}
681
-
682
-	if (!function_exists('interdire_scripts')) {
683
-		include_spip('inc/texte');
684
-	}
685
-	$t = interdire_scripts($t); // jolifier le php
686
-	$t = echappe_js($t);
687
-
688
-	if (!isset($safehtml)) {
689
-		$safehtml = charger_fonction('safehtml', 'inc', true);
690
-	}
691
-	if ($safehtml) {
692
-		$t = $safehtml($t);
693
-	}
694
-
695
-	if ($collecteurMultis) {
696
-		$t = $collecteurMultis->retablir($t);
697
-	}
698
-	if ($collecteurIdiomes) {
699
-		$t = $collecteurIdiomes->retablir($t);
700
-	}
701
-
702
-	return interdire_scripts($t); // interdire le php (2 precautions)
657
+    static $safehtml;
658
+
659
+    if (!$t or !is_string($t)) {
660
+        return $t;
661
+    }
662
+    # attention safehtml nettoie deux ou trois caracteres de plus. A voir
663
+    if (strpos($t, '<') === false) {
664
+        return str_replace("\x00", '', $t);
665
+    }
666
+
667
+    $collecteurIdiomes = null;
668
+    if (stripos($t, '<:') !== false) {
669
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
670
+        include_spip("src/Texte/Collecteur/Idiomes");
671
+        $collecteurIdiomes = new Spip\Texte\Collecteur\Idiomes();
672
+        $t = $collecteurIdiomes->echapper($t);
673
+    }
674
+    $collecteurMultis = null;
675
+    if (stripos($t, '<multi') !== false) {
676
+        include_spip("src/Texte/Collecteur/AbstractCollecteur");
677
+        include_spip("src/Texte/Collecteur/Multis");
678
+        $collecteurMultis = new Spip\Texte\Collecteur\Multis();
679
+        $t = $collecteurMultis->echapper($t, ['sanitize_callback' => 'safehtml']);
680
+    }
681
+
682
+    if (!function_exists('interdire_scripts')) {
683
+        include_spip('inc/texte');
684
+    }
685
+    $t = interdire_scripts($t); // jolifier le php
686
+    $t = echappe_js($t);
687
+
688
+    if (!isset($safehtml)) {
689
+        $safehtml = charger_fonction('safehtml', 'inc', true);
690
+    }
691
+    if ($safehtml) {
692
+        $t = $safehtml($t);
693
+    }
694
+
695
+    if ($collecteurMultis) {
696
+        $t = $collecteurMultis->retablir($t);
697
+    }
698
+    if ($collecteurIdiomes) {
699
+        $t = $collecteurIdiomes->retablir($t);
700
+    }
701
+
702
+    return interdire_scripts($t); // interdire le php (2 precautions)
703 703
 }
704 704
 
705 705
 
@@ -707,25 +707,25 @@  discard block
 block discarded – undo
707 707
  * Detecter si un texte est "safe" ie non modifie significativement par safehtml()
708 708
  */
709 709
 function is_html_safe(string $texte): bool {
710
-	if ($is_html_safe = charger_fonction('is_html_safe', 'inc', true)) {
711
-		return $is_html_safe($texte);
712
-	}
713
-
714
-	// simplifier les retour ligne pour etre certain de ce que l'on compare
715
-	$texte = str_replace("\r\n", "\n", $texte);
716
-	// safehtml reduit aussi potentiellement les &nbsp;
717
-	$texte = str_replace("&nbsp;", " ", $texte);
718
-	// safehtml remplace les entités numériques
719
-	if (strpos($texte, '&#') !== false) {
720
-		$texte = unicode2charset($texte);
721
-	}
722
-
723
-	$texte_safe = safehtml($texte);
724
-
725
-	// on teste sur strlen car safehtml supprime le contenu dangereux
726
-	// mais il peut aussi changer des ' en " sur les attributs html,
727
-	// donc un test d'egalite est trop strict
728
-	return strlen($texte_safe) === strlen($texte);
710
+    if ($is_html_safe = charger_fonction('is_html_safe', 'inc', true)) {
711
+        return $is_html_safe($texte);
712
+    }
713
+
714
+    // simplifier les retour ligne pour etre certain de ce que l'on compare
715
+    $texte = str_replace("\r\n", "\n", $texte);
716
+    // safehtml reduit aussi potentiellement les &nbsp;
717
+    $texte = str_replace("&nbsp;", " ", $texte);
718
+    // safehtml remplace les entités numériques
719
+    if (strpos($texte, '&#') !== false) {
720
+        $texte = unicode2charset($texte);
721
+    }
722
+
723
+    $texte_safe = safehtml($texte);
724
+
725
+    // on teste sur strlen car safehtml supprime le contenu dangereux
726
+    // mais il peut aussi changer des ' en " sur les attributs html,
727
+    // donc un test d'egalite est trop strict
728
+    return strlen($texte_safe) === strlen($texte);
729 729
 }
730 730
 
731 731
 /**
@@ -746,13 +746,13 @@  discard block
 block discarded – undo
746 746
  *     texte sans les modèles d'image
747 747
  **/
748 748
 function supprime_img($letexte, $message = null) {
749
-	if ($message === null) {
750
-		$message = '(' . _T('img_indisponible') . ')';
751
-	}
752
-
753
-	return preg_replace(
754
-		',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i',
755
-		$message,
756
-		$letexte
757
-	);
749
+    if ($message === null) {
750
+        $message = '(' . _T('img_indisponible') . ')';
751
+    }
752
+
753
+    return preg_replace(
754
+        ',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i',
755
+        $message,
756
+        $letexte
757
+    );
758 758
 }
Please login to merge, or discard this patch.