Changeset 112299 in spip-zone
- Timestamp:
- Nov 3, 2018, 12:51:44 PM (2 years ago)
- Location:
- _plugins_/htmlpurifier/trunk
- Files:
-
- 1 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
_plugins_/htmlpurifier/trunk/inc/texte.php
r112271 r112299 14 14 * Gestion des textes et raccourcis SPIP 15 15 * 16 * @package SPIP\Core\Texte 16 * Surcharge de ecrire/inc/texte 17 * 17 18 **/ 18 19 … … 24 25 include_spip('inc/lien'); 25 26 26 /************************************************************************************************************************* 27 * Fonctions inutilisees en dehors de inc/texte 28 * 29 */ 30 31 /** 32 * Raccourcis dépendant du sens de la langue 33 * 34 * @return array Tablea ('','') 35 */ 36 function definir_raccourcis_alineas() { 37 return array('', ''); 38 } 39 40 41 /** 42 * Traitement des raccourcis de tableaux 43 * 44 * Ne fait rien ici. Voir plugin Textwheel. 45 * 46 * @param string $bloc 27 include_spip('inc/textwheel'); 28 29 30 defined('_AUTOBR') || define('_AUTOBR', "<br class='autobr' />"); 31 define('_AUTOBR_IGNORER', _AUTOBR ? "<!-- ig br -->" : ""); 32 33 // 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 34 $GLOBALS['spip_raccourcis_typo'] = array(); 35 if (!isset($GLOBALS['toujours_paragrapher'])) { 36 $GLOBALS['toujours_paragrapher'] = true; 37 } 38 39 // class_spip : savoir si on veut class="spip" sur p i strong & li 40 // class_spip_plus : class="spip" sur les ul ol h3 hr quote table... 41 // la difference c'est que des css specifiques existent pour les seconds 42 // 43 if (!isset($GLOBALS['class_spip'])) { 44 $GLOBALS['class_spip'] = ''; 45 } 46 if (!isset($GLOBALS['class_spip_plus'])) { 47 $GLOBALS['class_spip_plus'] = ' class="spip"'; 48 } 49 50 51 /** 52 * Échapper et affichier joliement les `<script` ... 53 * 54 * @param string $t 47 55 * @return string 48 56 */ 49 function traiter_tableau($bloc) { 50 return $bloc; 51 } 52 53 54 /** 55 * Traitement des listes 56 * 57 * Ne fais rien. Voir Plugin Textwheel. 58 * (merci a Michael Parienti) 59 * 60 * @param string $texte 57 function echappe_js($t) { 58 static $wheel = null; 59 60 if (!isset($wheel)) { 61 $wheel = new TextWheel( 62 SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['echappe_js']) 63 ); 64 } 65 66 try { 67 $t = $wheel->text($t); 68 } catch (Exception $e) { 69 erreur_squelette($e->getMessage()); 70 // sanitizer le contenu methode brute, puisqu'on a pas fait mieux 71 $t = textebrut($t); 72 } 73 74 return $t; 75 } 76 77 78 /** 79 * Paragrapher seulement 80 * 81 * Fermer les paragraphes ; Essaie de préserver des paragraphes indiqués 82 * à la main dans le texte (par ex: on ne modifie pas un `<p align='center'>`) 83 * 84 * @param string $t 85 * Le texte 86 * @param null $toujours_paragrapher 87 * true pour forcer les `<p>` même pour un seul paragraphe 61 88 * @return string 89 * Texte paragraphé 62 90 */ 63 function traiter_listes($texte) { 64 return $texte; 65 } 66 67 /** 68 * Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc. 69 * 70 * Ne fais rien ici. Voir plugin Textwheel. 71 * 72 * @pipeline_appel pre_propre 73 * @pipeline_appel post_propre 74 * 75 * @param string $letexte 76 * @return string 77 */ 78 function traiter_raccourcis($letexte) { 79 80 // Appeler les fonctions de pre_traitement 81 $letexte = pipeline('pre_propre', $letexte); 82 83 // APPELER ICI UN PIPELINE traiter_raccourcis ? 84 // $letexte = pipeline('traiter_raccourcis', $letexte); 85 86 // Appeler les fonctions de post-traitement 87 $letexte = pipeline('post_propre', $letexte); 88 89 return $letexte; 90 } 91 92 /************************************************************************************************************************* 93 * Fonctions utilisees en dehors de inc/texte 94 */ 95 96 97 /** 98 * Échapper et affichier joliement les `<script` et `<iframe`... 99 * 100 * @param string $t 101 * @param string $class Attributs HTML du conteneur à ajouter 102 * @return string 103 */ 104 function echappe_js($t, $class = ' class = "echappe-js"') { 105 foreach (array('script', 'iframe') as $tag) { 106 if (stripos($t, "<$tag") !== false 107 and preg_match_all(',<' . $tag . '.*?($|</' . $tag . '.),isS', $t, $r, PREG_SET_ORDER) 91 function paragrapher($t, $toujours_paragrapher = null) { 92 static $wheel = array(); 93 if (is_null($toujours_paragrapher)) { 94 $toujours_paragrapher = $GLOBALS['toujours_paragrapher']; 95 } 96 97 if (!isset($wheel[$toujours_paragrapher])) { 98 $ruleset = SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['paragrapher']); 99 if (!$toujours_paragrapher 100 and $rule = $ruleset->getRule('toujours-paragrapher') 108 101 ) { 109 foreach ($r as $regs) { 110 $t = str_replace($regs[0], 111 "<code$class>" . nl2br(spip_htmlspecialchars($regs[0])) . '</code>', 112 $t); 113 } 114 } 102 $rule->disabled = true; 103 $ruleset->addRules(array('toujours-paragrapher' => $rule)); 104 } 105 $wheel[$toujours_paragrapher] = new TextWheel($ruleset); 106 } 107 108 try { 109 $t = $wheel[$toujours_paragrapher]->text($t); 110 } catch (Exception $e) { 111 erreur_squelette($e->getMessage()); 115 112 } 116 113 117 114 return $t; 118 115 } 119 120 116 121 117 /** … … 146 142 // on memorise le resultat sur les arguments non triviaux 147 143 static $dejavu = array(); 144 static $wheel = array(); 145 146 if (is_null($mode_filtre) or !in_array($mode_filtre, array(-1, 0, 1))) { 147 $mode_filtre = $GLOBALS['filtrer_javascript']; 148 } 148 149 149 150 // Attention, si ce n'est pas une chaine, laisser intact … … 151 152 return $arg; 152 153 } 153 154 if (is_null($mode_filtre) or !in_array($mode_filtre, array(-1, 0, 1))) {155 $mode_filtre = $GLOBALS['filtrer_javascript'];156 }157 158 154 if (isset($dejavu[$mode_filtre][$arg])) { 159 155 return $dejavu[$mode_filtre][$arg]; 160 156 } 161 157 162 // echapper les tags asp/php 163 $t = str_replace('<' . '%', '<%', $arg); 164 165 // echapper le php 166 $t = str_replace('<' . '?', '<?', $t); 167 168 // echapper le < script language=php > 169 $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); 170 171 // Pour le js, trois modes : parano (-1), prive (0), ok (1) 172 switch ($mode_filtre) { 173 case 0: 174 if (!_DIR_RESTREINT) { 175 $t = echappe_js($t); 176 } 177 break; 178 case -1: 179 $t = echappe_js($t); 180 break; 181 } 182 183 // pas de <base href /> svp ! 184 $t = preg_replace(',<(base\b),iS', '<\1', $t); 158 if (!isset($wheel[$mode_filtre])) { 159 $ruleset = SPIPTextWheelRuleset::loader( 160 $GLOBALS['spip_wheels']['interdire_scripts'] 161 ); 162 // Pour le js, trois modes : parano (-1), prive (0), ok (1) 163 // desactiver la regle echappe-js si besoin 164 if ($mode_filtre == 1 165 or ($mode_filtre == 0 and !test_espace_prive()) 166 ) { 167 $ruleset->addRules(array('securite-js' => array('disabled' => true))); 168 } 169 $wheel[$mode_filtre] = new TextWheel($ruleset); 170 } 171 172 try { 173 $t = $wheel[$mode_filtre]->text($arg); 174 } catch (Exception $e) { 175 erreur_squelette($e->getMessage()); 176 // sanitizer le contenu methode brute, puisqu'on a pas fait mieux 177 $t = textebrut($arg); 178 } 185 179 186 180 // Reinserer les echappements des modeles … … 239 233 } 240 234 235 $echapper = ($echapper ? 'TYPO' : false); 241 236 // Echapper les codes <html> etc 242 237 if ($echapper) { 243 $letexte = echappe_html($letexte, 'TYPO');238 $letexte = echappe_html($letexte, $echapper); 244 239 } 245 240 … … 250 245 // cf. inc/lien 251 246 252 $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO': '', $connect, null, $env);253 if ( $letexte != $mem) {254 $echapper = true;247 $letexte = traiter_modeles($mem = $letexte, false, $echapper ? $echapper : '', $connect, null, $env); 248 if (!$echapper and $letexte != $mem) { 249 $echapper = ''; 255 250 } 256 251 unset($mem); … … 260 255 261 256 // reintegrer les echappements 262 if ($echapper ) {263 $letexte = echappe_retour($letexte, 'TYPO');257 if ($echapper !== false) { 258 $letexte = echappe_retour($letexte, $echapper); 264 259 } 265 260 … … 282 277 283 278 // Correcteur typographique 279 284 280 define('_TYPO_PROTEGER', "!':;?~%-"); 285 281 define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8"); … … 297 293 * @uses corriger_caracteres() 298 294 * 299 * @param string $ letexteTexte295 * @param string $t Texte 300 296 * @param string $lang Langue 301 297 * @return string Texte 302 298 */ 303 function corriger_typo($ letexte, $lang = '') {304 299 function corriger_typo($t, $lang = '') { 300 static $typographie = array(); 305 301 // Plus vite ! 306 if (!$ letexte) {307 return $ letexte;308 } 309 310 $ letexte = pipeline('pre_typo', $letexte);302 if (!$t) { 303 return $t; 304 } 305 306 $t = pipeline('pre_typo', $t); 311 307 312 308 // Caracteres de controle "illegaux" 313 $ letexte = corriger_caracteres($letexte);309 $t = corriger_caracteres($t); 314 310 315 311 // Proteger les caracteres typographiques a l'interieur des tags html 316 if (preg_match_all(_TYPO_BALISE, $ letexte, $regs, PREG_SET_ORDER)) {312 if (preg_match_all(_TYPO_BALISE, $t, $regs, PREG_SET_ORDER)) { 317 313 foreach ($regs as $reg) { 318 314 $insert = $reg[0]; … … 320 316 // par des caracteres "illegaux". (cf corriger_caracteres()) 321 317 $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR); 322 $ letexte = str_replace($reg[0], $insert, $letexte);318 $t = str_replace($reg[0], $insert, $t); 323 319 } 324 320 } 325 321 326 322 // trouver les blocs idiomes et les traiter à part 327 $ letexte = extraire_idiome($ei = $letexte, $lang, true);328 $ei = ($ei !== $ letexte);329 330 // trouver les blocs multi et les traiter apart331 $ letexte = extraire_multi($em = $letexte, $lang, true);332 $em = ($em !== $ letexte);323 $t = extraire_idiome($ei = $t, $lang, true); 324 $ei = ($ei !== $t); 325 326 // trouver les blocs multi et les traiter à part 327 $t = extraire_multi($em = $t, $lang, true); 328 $em = ($em !== $t); 333 329 334 330 // Charger & appliquer les fonctions de typographie 335 $typographie = charger_fonction(lang_typo($lang), 'typographie'); 336 $letexte = $typographie($letexte); 331 $idxl = "$lang:" . (isset($GLOBALS['lang_objet']) ? $GLOBALS['lang_objet'] : $GLOBALS['spip_lang']); 332 if (!isset($typographie[$idxl])) { 333 $typographie[$idxl] = charger_fonction(lang_typo($lang), 'typographie'); 334 } 335 $t = $typographie[$idxl]($t); 337 336 338 337 // Les citations en une autre langue, s'il y a lieu 338 if ($ei) { 339 $t = echappe_retour($t, 'idiome'); 340 } 339 341 if ($em) { 340 $letexte = echappe_retour($letexte, 'multi'); 341 } 342 if ($ei) { 343 $letexte = echappe_retour($letexte, 'idiome'); 342 $t = echappe_retour($t, 'multi'); 344 343 } 345 344 346 345 // Retablir les caracteres proteges 347 $ letexte = strtr($letexte, _TYPO_PROTECTEUR, _TYPO_PROTEGER);346 $t = strtr($t, _TYPO_PROTECTEUR, _TYPO_PROTEGER); 348 347 349 348 // pipeline 350 $ letexte = pipeline('post_typo', $letexte);349 $t = pipeline('post_typo', $t); 351 350 352 351 # un message pour abs_url - on est passe en mode texte 353 352 $GLOBALS['mode_abs_url'] = 'texte'; 354 353 355 return $letexte; 356 } 357 358 359 /** 360 * Paragrapher seulement 361 * 362 * /!\ appelée dans inc/filtres et public/composer 363 * 364 * Ne fait rien ici. Voir plugin Textwheel 365 * 366 * @param string $letexte 367 * @param null $forcer 354 return $t; 355 } 356 357 358 // 359 // Tableaux 360 // 361 362 define('_RACCOURCI_TH_SPAN', '\s*(:?{{[^{}]+}}\s*)?|<'); 363 364 /** 365 * Traitement des raccourcis de tableaux 366 * 367 * @param string $bloc 368 368 * @return string 369 369 */ 370 function paragrapher($letexte, $forcer = true) { 371 return $letexte; 372 } 373 374 /** 375 * Harmonise les retours chariots et mange les paragraphes HTML 376 * 377 * Ne sert plus 378 * 379 * @param string $letexte Texte 380 * @return string Texte 381 **/ 382 function traiter_retours_chariots($letexte) { 383 $letexte = preg_replace(",\r\n?,S", "\n", $letexte); 384 $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte); 385 $letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte); 386 387 return $letexte; 370 function traiter_tableau($bloc) { 371 // id "unique" pour les id du tableau 372 $tabid = substr(md5($bloc), 0, 4); 373 374 // Decouper le tableau en lignes 375 preg_match_all(',([|].*)[|]\n,UmsS', $bloc, $regs, PREG_PATTERN_ORDER); 376 $lignes = array(); 377 $debut_table = $summary = ''; 378 $l = 0; 379 380 // Traiter chaque ligne 381 $reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS'; 382 $reg_line_all = ',^(' . _RACCOURCI_TH_SPAN . ')$,sS'; 383 $hc = $hl = array(); 384 foreach ($regs[1] as $ligne) { 385 $l++; 386 387 // Gestion de la premiere ligne : 388 if ($l == 1) { 389 // - <caption> et summary dans la premiere ligne : 390 // || caption | summary || (|summary est optionnel) 391 if (preg_match(',^\|\|([^|]*)(\|(.*))?$,sS', rtrim($ligne, '|'), $cap)) { 392 $cap = array_pad($cap, 4, null); 393 $l = 0; 394 if ($caption = trim($cap[1])) { 395 $debut_table .= "<caption>" . $caption . "</caption>\n"; 396 } 397 $summary = ' summary="' . entites_html(trim($cap[3])) . '"'; 398 } 399 // - <thead> sous la forme |{{titre}}|{{titre}}| 400 // Attention thead oblige a avoir tbody 401 else { 402 if (preg_match($reg_line1, $ligne, $thead)) { 403 preg_match_all('/\|([^|]*)/S', $ligne, $cols); 404 $ligne = ''; 405 $cols = $cols[1]; 406 $colspan = 1; 407 for ($c = count($cols) - 1; $c >= 0; $c--) { 408 $attr = ''; 409 if ($cols[$c] == '<') { 410 $colspan++; 411 } else { 412 if ($colspan > 1) { 413 $attr = " colspan='$colspan'"; 414 $colspan = 1; 415 } 416 // inutile de garder le strong qui n'a servi que de marqueur 417 $cols[$c] = str_replace(array('{', '}'), '', $cols[$c]); 418 $ligne = "<th id='id{$tabid}_c$c'$attr>$cols[$c]</th>$ligne"; 419 $hc[$c] = "id{$tabid}_c$c"; // pour mettre dans les headers des td 420 } 421 } 422 423 $debut_table .= "<thead><tr class='row_first'>" . 424 $ligne . "</tr></thead>\n"; 425 $l = 0; 426 } 427 } 428 } 429 430 // Sinon ligne normale 431 if ($l) { 432 // Gerer les listes a puce dans les cellules 433 // on declenche simplement sur \n- car il y a les 434 // -* -# -? -! (qui produisent des - !) 435 if (strpos($ligne, "\n-") !== false) { 436 $ligne = traiter_listes($ligne); 437 } 438 439 // tout mettre dans un tableau 2d 440 preg_match_all('/\|([^|]*)/S', $ligne, $cols); 441 442 // Pas de paragraphes dans les cellules 443 foreach ($cols[1] as &$col) { 444 if (strlen($col = trim($col))) { 445 $col = preg_replace("/\n{2,}/S", "<br /> <br />", $col); 446 if (_AUTOBR) { 447 $col = str_replace("\n", _AUTOBR . "\n", $col); 448 } 449 } 450 } 451 452 // assembler le tableau 453 $lignes[] = $cols[1]; 454 } 455 } 456 457 // maintenant qu'on a toutes les cellules 458 // on prepare une liste de rowspan par defaut, a partir 459 // du nombre de colonnes dans la premiere ligne. 460 // Reperer egalement les colonnes numeriques pour les cadrer a droite 461 $rowspans = $numeric = array(); 462 $n = $lignes ? count($lignes[0]) : 0; 463 $k = count($lignes); 464 // distinguer les colonnes numeriques a point ou a virgule, 465 // pour les alignements eventuels sur "," ou "." 466 $numeric_class = array( 467 '.' => 'point', 468 ',' => 'virgule', 469 true => '' 470 ); 471 for ($i = 0; $i < $n; $i++) { 472 $align = true; 473 for ($j = 0; $j < $k; $j++) { 474 $rowspans[$j][$i] = 1; 475 if ($align and preg_match('/^[{+-]*(?:\s|\d)*([.,]?)\d*[}]*$/', trim($lignes[$j][$i]), $r)) { 476 if ($r[1]) { 477 $align = $r[1]; 478 } 479 } else { 480 $align = ''; 481 } 482 } 483 $numeric[$i] = $align ? (" class='numeric " . $numeric_class[$align] . "'") : ''; 484 } 485 for ($j = 0; $j < $k; $j++) { 486 if (preg_match($reg_line_all, $lignes[$j][0])) { 487 $hl[$j] = "id{$tabid}_l$j"; // pour mettre dans les headers des td 488 } else { 489 unset($hl[0]); 490 } 491 } 492 if (!isset($hl[0])) { 493 $hl = array(); 494 } // toute la colonne ou rien 495 496 // et on parcourt le tableau a l'envers pour ramasser les 497 // colspan et rowspan en passant 498 $html = ''; 499 500 for ($l = count($lignes) - 1; $l >= 0; $l--) { 501 $cols = $lignes[$l]; 502 $colspan = 1; 503 $ligne = ''; 504 505 for ($c = count($cols) - 1; $c >= 0; $c--) { 506 $attr = $numeric[$c]; 507 $cell = trim($cols[$c]); 508 if ($cell == '<') { 509 $colspan++; 510 511 } elseif ($cell == '^') { 512 $rowspans[$l - 1][$c] += $rowspans[$l][$c]; 513 514 } else { 515 if ($colspan > 1) { 516 $attr .= " colspan='$colspan'"; 517 $colspan = 1; 518 } 519 if (($x = $rowspans[$l][$c]) > 1) { 520 $attr .= " rowspan='$x'"; 521 } 522 $b = ($c == 0 and isset($hl[$l])) ? 'th' : 'td'; 523 $h = (isset($hc[$c]) ? $hc[$c] : '') . ' ' . (($b == 'td' and isset($hl[$l])) ? $hl[$l] : ''); 524 if ($h = trim($h)) { 525 $attr .= " headers='$h'"; 526 } 527 // inutile de garder le strong qui n'a servi que de marqueur 528 if ($b == 'th') { 529 $attr .= " id='" . $hl[$l] . "'"; 530 $cols[$c] = str_replace(array('{', '}'), '', $cols[$c]); 531 } 532 $ligne = "\n<$b" . $attr . '>' . $cols[$c] . "</$b>" . $ligne; 533 } 534 } 535 536 // ligne complete 537 $class = alterner($l + 1, 'odd', 'even'); 538 $html = "<tr class='row_$class $class'>$ligne</tr>\n$html"; 539 } 540 541 return "\n\n<table" . $GLOBALS['class_spip_plus'] . $summary . ">\n" 542 . $debut_table 543 . "<tbody>\n" 544 . $html 545 . "</tbody>\n" 546 . "</table>\n\n"; 547 } 548 549 550 /** 551 * Traitement des listes 552 * 553 * On utilise la wheel correspondante 554 * 555 * @param string $t 556 * @return string 557 */ 558 function traiter_listes($t) { 559 static $wheel = null; 560 561 if (!isset($wheel)) { 562 $wheel = new TextWheel( 563 SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['listes']) 564 ); 565 } 566 567 try { 568 $t = $wheel->text($t); 569 } catch (Exception $e) { 570 erreur_squelette($e->getMessage()); 571 } 572 573 return $t; 574 } 575 576 577 // Ces deux constantes permettent de proteger certains caracteres 578 // en les remplacanat par des caracteres "illegaux". (cf corriger_caracteres) 579 580 define('_RACCOURCI_PROTEGER', "{}_-"); 581 define('_RACCOURCI_PROTECTEUR', "\x1\x2\x3\x4"); 582 583 define('_RACCOURCI_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_RACCOURCI_PROTEGER) . "][^<>]*>,imsS"); 584 585 /** 586 * mais d'abord, une callback de reconfiguration des raccourcis 587 * a partir de globales (est-ce old-style ? on conserve quand meme 588 * par souci de compat ascendante) 589 * 590 * @param $ruleset 591 * @return string 592 */ 593 function personnaliser_raccourcis(&$ruleset) { 594 if ($ruleset) { 595 if (isset($GLOBALS['debut_intertitre']) and $rule = $ruleset->getRule('intertitres')) { 596 $rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_intertitre'], $rule->replace[0]); 597 $rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_intertitre'], $rule->replace[1]); 598 $ruleset->addRules(array('intertitres' => $rule)); 599 } 600 if (isset($GLOBALS['debut_gras']) and $rule = $ruleset->getRule('gras')) { 601 $rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_gras'], $rule->replace[0]); 602 $rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_gras'], $rule->replace[1]); 603 $ruleset->addRules(array('gras' => $rule)); 604 } 605 if (isset($GLOBALS['debut_italique']) and $rule = $ruleset->getRule('italiques')) { 606 $rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_italique'], $rule->replace[0]); 607 $rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_italique'], $rule->replace[1]); 608 $ruleset->addRules(array('italiques' => $rule)); 609 } 610 if (isset($GLOBALS['ligne_horizontale']) and $rule = $ruleset->getRule('ligne-horizontale')) { 611 $rule->replace = preg_replace(',<[^>]*>,Uims', $GLOBALS['ligne_horizontale'], $rule->replace); 612 $ruleset->addRules(array('ligne-horizontale' => $rule)); 613 } 614 if (isset($GLOBALS['toujours_paragrapher']) and !$GLOBALS['toujours_paragrapher'] 615 and $rule = $ruleset->getRule('toujours-paragrapher') 616 ) { 617 $rule->disabled = true; 618 $ruleset->addRules(array('toujours-paragrapher' => $rule)); 619 } 620 } 621 622 // retourner une signature de l'etat de la fonction, pour la mise en cache 623 return implode("/", 624 array( 625 isset($GLOBALS['debut_intertitre']) ? $GLOBALS['debut_intertitre'] : "", 626 isset($GLOBALS['debut_gras']) ? $GLOBALS['debut_gras'] : "", 627 isset($GLOBALS['debut_italique']) ? $GLOBALS['debut_italique'] : "", 628 isset($GLOBALS['ligne_horizontale']) ? $GLOBALS['ligne_horizontale'] : "", 629 isset($GLOBALS['toujours_paragrapher']) ? $GLOBALS['toujours_paragrapher'] : 1, 630 ) 631 ); 632 } 633 634 /** 635 * Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc. 636 * 637 * @pipeline_appel pre_propre 638 * @pipeline_appel post_propre 639 * 640 * @param string $t 641 * @param bool $show_autobr 642 * @return string 643 */ 644 function traiter_raccourcis($t, $show_autobr = false) { 645 static $wheel = array(), $notes; 646 static $img_br_auto, $img_br_manuel, $img_br_no; 647 global $spip_lang, $spip_lang_rtl; 648 649 // hack1: respecter le tag ignore br 650 if (_AUTOBR_IGNORER 651 and strncmp($t, _AUTOBR_IGNORER, strlen(_AUTOBR_IGNORER)) == 0 652 ) { 653 $ignorer_autobr = true; 654 $t = substr($t, strlen(_AUTOBR_IGNORER)); 655 } else { 656 $ignorer_autobr = false; 657 } 658 659 // Appeler les fonctions de pre_traitement 660 $t = pipeline('pre_propre', $t); 661 662 $key = ""; 663 $key = personnaliser_raccourcis($key); 664 if (!isset($wheel[$key])) { 665 $ruleset = SPIPTextWheelRuleset::loader( 666 $GLOBALS['spip_wheels']['raccourcis'], 'personnaliser_raccourcis' 667 ); 668 $wheel[$key] = new TextWheel($ruleset); 669 670 if (_request('var_mode') == 'wheel' 671 and autoriser('debug') 672 ) { 673 $f = $wheel->compile(); 674 echo "<pre>\n" . spip_htmlspecialchars($f) . "</pre>\n"; 675 exit; 676 } 677 $notes = charger_fonction('notes', 'inc'); 678 } 679 680 // Gerer les notes (ne passe pas dans le pipeline) 681 list($t, $mes_notes) = $notes($t); 682 683 try { 684 $t = $wheel[$key]->text($t); 685 } catch (Exception $e) { 686 erreur_squelette($e->getMessage()); 687 } 688 689 // Appeler les fonctions de post-traitement 690 $t = pipeline('post_propre', $t); 691 692 if ($mes_notes) { 693 $notes($mes_notes, 'traiter', $ignorer_autobr); 694 } 695 696 if (_AUTOBR and !function_exists('aide_lang_dir')) { 697 include_spip('inc/lang'); 698 } 699 700 // hack2: wrap des autobr dans l'espace prive, pour affichage css 701 // car en css on ne sait pas styler l'element BR 702 if ($ignorer_autobr and _AUTOBR) { 703 if (is_null($img_br_no)) { 704 $img_br_no = ($show_autobr ? http_img_pack("br-no" . aide_lang_dir($spip_lang, $spip_lang_rtl) . "-10.png", 705 _T("tw:retour_ligne_ignore"), "class='br-no'", _T("tw:retour_ligne_ignore")) : ""); 706 } 707 $t = str_replace(_AUTOBR, $img_br_no, $t); 708 } 709 if ($show_autobr and _AUTOBR) { 710 if (is_null($img_br_manuel)) { 711 $img_br_manuel = http_img_pack("br-manuel" . aide_lang_dir($spip_lang, $spip_lang_rtl) . "-10.png", 712 _T("tw:retour_ligne_manuel"), "class='br-manuel'", _T("tw:retour_ligne_manuel")); 713 } 714 if (is_null($img_br_auto)) { 715 $img_br_auto = http_img_pack("br-auto" . aide_lang_dir($spip_lang, $spip_lang_rtl) . "-10.png", 716 _T("tw:retour_ligne_auto"), "class='br-auto'", _T("tw:retour_ligne_auto")); 717 } 718 if (false !== strpos(strtolower($t), '<br')) { 719 $t = preg_replace("/<br\b.*>/UiS", "$img_br_manuel\\0", $t); 720 $t = str_replace($img_br_manuel . _AUTOBR, $img_br_auto . _AUTOBR, $t); 721 } 722 } 723 724 return $t; 388 725 } 389 726 … … 417 754 // les appels dans les squelettes (de l'espace prive) fournissant un $connect 418 755 // ne seront pas perturbes 419 $interdire_script = false; 420 if (is_null($connect)) { 756 757 $interdire_script = ( empty($env) and $GLOBALS['filtrer_javascript'] == -1); 758 if (is_null($connect) and test_espace_prive()) { 421 759 $connect = ''; 422 760 $interdire_script = true; … … 427 765 } 428 766 767 $t = pipeline('pre_echappe_html_propre', $t); 768 $t = echappe_html($t); 769 $t = expanser_liens($t, $connect, $env); 770 771 $t = traiter_raccourcis($t, (isset($env['wysiwyg']) and $env['wysiwyg']) ? true : false); 429 772 // Dans l'espace prive on se mefie de tout contenu dangereux 430 773 // avant echappement des balises <html> … … 438 781 $t = echapper_html_suspect($t, false); 439 782 } 440 $t = echappe_html($t); 441 $t = expanser_liens($t, $connect, $env); 442 $t = traiter_raccourcis($t); 783 443 784 $t = echappe_retour_modeles($t, $interdire_script); 444 785 786 $t = pipeline('post_echappe_html_propre', $t); 787 445 788 return $t; 446 789 } -
_plugins_/htmlpurifier/trunk/paquet.xml
r112291 r112299 2 2 prefix="htmlpurifier" 3 3 categorie="outil" 4 version="4.10. 0.12"4 version="4.10.99.0" 5 5 etat="test" 6 compatibilite="[ 1.9.0;3.2.99]"6 compatibilite="[3.2.1;3.2.99]" 7 7 logo="htmlpurifier.png" 8 8 documentation="https://contrib.spip.net/HTML-Purifier,3671" … … 15 15 <auteur>Mise en plugin SPIP : RealET</auteur> 16 16 <auteur>Fil</auteur> 17 18 <utilise nom="tw" compatibilite="[0.3.1;[" /> 19 20 17 21 </paquet> 18
Note: See TracChangeset
for help on using the changeset viewer.