Blame | Last modification | View Log | RSS feed
<?php/***************************************************************************\* SPIP, Systeme de publication pour l'internet ** ** Copyright (c) 2001-2005 ** Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James ** ** Ce programme est un logiciel libre distribue sous licence GNU/GPL. ** Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *\***************************************************************************///// Ce fichier ne sera execute qu'une foisif (defined("_ECRIRE_INC_SURLIGNE")) return;define("_ECRIRE_INC_SURLIGNE", "1");// Ces commentaires vont etre substitue's en mode recherche// voir les champs SURLIGNE dans inc-index-squeldefine("MARQUEUR_SURLIGNE", '!-- debut_surligneconditionnel -->');define("MARQUEUR_FSURLIGNE", '!-- finde_surligneconditionnel -->');function surligner_sans_accents ($mot) {$accents =/* A */ chr(192).chr(193).chr(194).chr(195).chr(196).chr(197)./* a */ chr(224).chr(225).chr(226).chr(227).chr(228).chr(229)./* O */ chr(210).chr(211).chr(212).chr(213).chr(214).chr(216)./* o */ chr(242).chr(243).chr(244).chr(245).chr(246).chr(248)./* E */ chr(200).chr(201).chr(202).chr(203)./* e */ chr(232).chr(233).chr(234).chr(235)./* Cc */ chr(199).chr(231)./* I */ chr(204).chr(205).chr(206).chr(207)./* i */ chr(236).chr(237).chr(238).chr(239)./* U */ chr(217).chr(218).chr(219).chr(220)./* u */ chr(249).chr(250).chr(251).chr(252)./* yNn */ chr(255).chr(209).chr(241);if (lire_meta('charset') == 'utf-8') {include_ecrire('inc_charsets.php3');$mot = unicode2charset(utf_8_to_unicode($mot), 'iso-8859-1');}return strtr($mot, $accents, "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");}// tres salefunction split_by_char($str) {$len = strlen($str);$streturn = array();for ($i=0; $i<$len; $i++) {$streturn[$i] = substr($str, $i, 1);}return $streturn;}function surligner_regexp_accents ($mot) {$accents_regexp = array("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)."]","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)."]","e" => "[e".chr(232).chr(233).chr(234).chr(235). chr(200).chr(201).chr(202).chr(203)."]","c" => "[c".chr(199).chr(231)."]","i" => "[i".chr(236).chr(237).chr(238).chr(239). chr(204).chr(205).chr(206).chr(207)."]","u" => "[u".chr(249).chr(250).chr(251).chr(252). chr(217).chr(218).chr(219).chr(220)."]","y" => "[y".chr(255)."]","n" => "[n".chr(209).chr(241)."]");$mot = surligner_sans_accents ($mot);if (lire_meta('charset') == 'utf-8') {while(list($k,$s) = each ($accents_regexp)) {$accents_regexp_utf8[$k] = "(".join("|", split_by_char(ereg_replace("\]|\[","",$accents_regexp[$k]))).")";}$mot = strtr(strtolower($mot), $accents_regexp_utf8);$mot = importer_charset($mot, 'iso-8859-1');} else$mot = strtr(strtolower($mot), $accents_regexp);return $mot;}// mettre en rouge les mots passes dans $var_recherchefunction surligner_mots($page, $mots) {global $nombre_surligne;include_ecrire("inc_texte.php3"); // pour le reglage de $nombre_surligne// Remplacer les caracteres potentiellement accentues dans la chaine// de recherche par les choix correspondants en syntaxe regexp (!)$mots = split("[[:space:]]+", $mots);while (list(, $mot) = each ($mots)) {if (strlen($mot) >= 2) {$mot = surligner_regexp_accents(preg_quote(str_replace('/', '', $mot)));$mots_surligne[] = $mot;}}if (!$mots_surligne) return $page;$regexp = '/((^|>)([^<]*[^[:alnum:]_<])?)(('. join('|', $mots_surligne). ')[[:alnum:]_]*?)/Uis';// en cas de surlignement limite' (champs #SURLIGNE),// le compilateur a inse're' les balises de surlignement// sur toute la zone; reste a` raffiner.// On boucle pour le cas ou` il y a plusieurs zones$p = strpos($page, MARQUEUR_SURLIGNE);if ($p !== false) {$debut = '';while ($p) {$debut .= substr($page, 0, $p-1);$page = substr($page, $p+strlen(MARQUEUR_SURLIGNE));if (!$q = strpos($page,MARQUEUR_FSURLIGNE))$q = 1+strlen($page);$debut .= trouve_surligne(substr($page, 0, $q-1), $regexp);$page = substr($page, $q+strlen(MARQUEUR_FSURLIGNE));$p = strpos($page,MARQUEUR_SURLIGNE);}return $debut . $page;} else {// pour toute la page: ignorer ce qui est avant </head> ou <body>$re = '/<\/head>|<body[^>]*>/i';if (preg_match($re, $page, $exp)) {$debut = substr($page, 0, strpos($page, $exp[0])+strlen($exp[0]));$page = substr($page, strlen($debut));} else$debut = '';return $debut . trouve_surligne($page, $regexp);}}function trouve_surligne($page, $regexp) {// Remplacer une occurrence de mot maxi par espace inter-tag// (max 1 par paragraphe, sauf italiques etc.)// se limiter a 4 remplacements pour ne pas bouffer le CPU ;// traiter <textarea...>....</textarea> comme un tag.global $nombre_surligne;$page = preg_replace('/(<textarea[^>]*>)([^<>]*)(<\/textarea>)/Uis', '\1<<SPIP\2>>\3', $page);$page = preg_replace($regexp, '\1<span class="spip_surligne">\4</span>', $page, $nombre_surligne);$page = preg_replace('/(<textarea[^>]*>)<<SPIP([^<>]*)>>(<\/textarea>)/Uis', '\1\2\3', $page);return $page ;}?>