[ Index ] |
|
Code source de SPIP 1.9.2c |
1 <?php 2 3 /***************************************************************************\ 4 * SPIP, Systeme de publication pour l'internet * 5 * * 6 * Copyright (c) 2001-2007 * 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 // 15 if (!defined("_ECRIRE_INC_VERSION")) return; 16 17 // Ces commentaires vont etre substitue's en mode recherche 18 // voir les champs SURLIGNE dans inc-index-squel 19 20 define("MARQUEUR_SURLIGNE", '!-- debut_surligneconditionnel -->'); 21 define("MARQUEUR_FSURLIGNE", '!-- finde_surligneconditionnel -->'); 22 23 // http://doc.spip.org/@surligner_sans_accents 24 function surligner_sans_accents ($mot) { 25 $accents = 26 /* A */ chr(192).chr(193).chr(194).chr(195).chr(196).chr(197). 27 /* a */ chr(224).chr(225).chr(226).chr(227).chr(228).chr(229). 28 /* O */ chr(210).chr(211).chr(212).chr(213).chr(214).chr(216). 29 /* o */ chr(242).chr(243).chr(244).chr(245).chr(246).chr(248). 30 /* E */ chr(200).chr(201).chr(202).chr(203). 31 /* e */ chr(232).chr(233).chr(234).chr(235). 32 /* Cc */ chr(199).chr(231). 33 /* I */ chr(204).chr(205).chr(206).chr(207). 34 /* i */ chr(236).chr(237).chr(238).chr(239). 35 /* U */ chr(217).chr(218).chr(219).chr(220). 36 /* u */ chr(249).chr(250).chr(251).chr(252). 37 /* yNn */ chr(255).chr(209).chr(241); 38 39 if ($GLOBALS['meta']['charset'] == 'utf-8') { 40 include_spip('inc/charsets'); 41 $mot = unicode2charset(utf_8_to_unicode($mot), 'iso-8859-1'); 42 } 43 44 return strtr($mot, $accents, "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"); 45 } 46 47 // tres sale 48 // http://doc.spip.org/@split_by_char 49 function split_by_char($str) { 50 $len = strlen($str); 51 $streturn = array(); 52 for ($i=0; $i<$len; $i++) { 53 $streturn[$i] = substr($str, $i, 1); 54 } 55 return $streturn; 56 } 57 58 // http://doc.spip.org/@surligner_regexp_accents 59 function surligner_regexp_accents ($mot) { 60 $accents_regexp = array( 61 "a" => "[a".chr(224).chr(225).chr(226).chr(227).chr(228).chr(229). chr(192).chr(193).chr(194).chr(195).chr(196).chr(197)."]", 62 "o" => "[o".chr(242).chr(243).chr(244).chr(245).chr(246).chr(248). chr(210).chr(211).chr(212).chr(213).chr(214).chr(216)."]", 63 "e" => "[e".chr(232).chr(233).chr(234).chr(235). chr(200).chr(201).chr(202).chr(203)."]", 64 "c" => "[c".chr(199).chr(231)."]", 65 "i" => "[i".chr(236).chr(237).chr(238).chr(239). chr(204).chr(205).chr(206).chr(207)."]", 66 "u" => "[u".chr(249).chr(250).chr(251).chr(252). chr(217).chr(218).chr(219).chr(220)."]", 67 "y" => "[y".chr(255)."]", 68 "n" => "[n".chr(209).chr(241)."]" 69 ); 70 71 $mot = surligner_sans_accents ($mot); 72 if ($GLOBALS['meta']['charset'] == 'utf-8') { 73 while(list($k,$s) = each ($accents_regexp)) { 74 $accents_regexp_utf8[$k] = "(".join("|", split_by_char(preg_replace(',[\]\[],','',$accents_regexp[$k]))).")"; 75 } 76 $mot = strtr(strtolower($mot), $accents_regexp_utf8); 77 $mot = importer_charset($mot, 'iso-8859-1'); 78 } else 79 $mot = strtr(strtolower($mot), $accents_regexp); 80 81 return $mot; 82 } 83 84 85 // mettre en rouge les mots passes dans $var_recherche 86 // http://doc.spip.org/@surligner_mots 87 function surligner_mots($page, $mots) { 88 global $nombre_surligne; 89 include_spip('inc/texte'); // pour le reglage de $nombre_surligne 90 tester_variable('nombre_surligne', 4); 91 92 // Remplacer les caracteres potentiellement accentues dans la chaine 93 // de recherche par les choix correspondants en syntaxe regexp (!) 94 $mots = preg_split(',\s+,ms', $mots); 95 96 foreach ($mots as $mot) { 97 if (strlen($mot) >= 2) { 98 $mot = surligner_regexp_accents(preg_quote(str_replace('/', '', $mot))); 99 $mots_surligne[] = $mot; 100 } 101 } 102 103 if (!$mots_surligne) return $page; 104 105 $regexp = '/((^|>)([^<]*[^[:alnum:]_<\x80-\xFF])?)((' 106 . join('|', $mots_surligne) 107 . ')[[:alnum:]_\x80-\xFF]*?)/Uis'; 108 109 // en cas de surlignement limite' (champs #SURLIGNE), 110 // le compilateur a inse're' les balises de surlignement 111 // sur toute la zone; reste a` raffiner. 112 // On boucle pour le cas ou` il y a plusieurs zones 113 114 $p = strpos($page, MARQUEUR_SURLIGNE); 115 if ($p !== false) { 116 $debut = ''; 117 while ($p) { 118 $debut .= substr($page, 0, $p-1); 119 $page = substr($page, $p+strlen(MARQUEUR_SURLIGNE)); 120 if (!$q = strpos($page,MARQUEUR_FSURLIGNE)) 121 $q = 1+strlen($page); 122 $debut .= trouve_surligne(substr($page, 0, $q-1), $regexp); 123 $page = substr($page, $q+strlen(MARQUEUR_FSURLIGNE)); 124 $p = strpos($page,MARQUEUR_SURLIGNE); 125 } 126 return $debut . $page; 127 } else { 128 // pour toute la page: ignorer ce qui est avant </head> ou <body> 129 $re = '/<\/head>|<body[^>]*>/i'; 130 if (preg_match($re, $page, $exp)) { 131 $debut = substr($page, 0, strpos($page, $exp[0])+strlen($exp[0])); 132 $page = substr($page, strlen($debut)); 133 } else 134 $debut = ''; 135 return $debut . trouve_surligne($page, $regexp); 136 } 137 } 138 139 // http://doc.spip.org/@trouve_surligne 140 function trouve_surligne($page, $regexp) { 141 // Remplacer une occurrence de mot maxi par espace inter-tag 142 // (max 1 par paragraphe, sauf italiques etc.) 143 // se limiter a 4 remplacements pour ne pas bouffer le CPU ; 144 // traiter <textarea...>....</textarea> comme un tag. 145 global $nombre_surligne; 146 $page = preg_replace('/(<textarea[^>]*>)([^<>]*)(<\/textarea>)/Uis', '\1<<SPIP\2>>\3', $page); 147 $page = preg_replace($regexp, '\1<span class="spip_surligne">\4</span>', $page, $nombre_surligne); 148 $page = preg_replace('/(<textarea[^>]*>)<<SPIP([^<>]*)>>(<\/textarea>)/Uis', '\1\2\3', $page); 149 return $page ; 150 } 151 152 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |