/* SEIFT : Moteur de recherche en fulltext */
// Le répertoire de recherche (avec / final)
$conf["url"] = "vieux_site/";
// L'url du répertoire où l'on cherche (sans le / final)
$conf["web_url"] = "http://titine.free.fr/projets/seift/demo/vieux_site";
// Extension des fichiers recherché sous forme d'expression régulière ;)
$conf["ext"]="\.html?$";
// Taille des lignes extraites
$conf["extraitWidth"] = 90;
// Nbre de ligne extraites
$conf["nbreLigne"] = 3;
// Affiche t-on le nombre de résultat trouvé par page ? 0:Non
$conf["is_occurence"] = 1;
// Nbre de pages trouvées par page
if (isset($nbr_par_page) && $nbr_par_page != ""){
$conf["nbr_par_page"] = $nbr_par_page;
}else{
$conf["nbr_par_page"] = 10;
}
// Afficher le header ?
$conf["is_header"] = 1;
// Respecte la casse ?
$conf["is_casesensitive"]=$is_casesensitive;
//***************** FONCTIONS DIVERSES **********
// Verifier l'extension
function verifierExt($file,$ext){
return ereg("$ext",$file);
}
// fonction de comparaison pour le tri des résultats
function compare($a,$b){
if ($a["n"]==$b["n"]){
if ($a["nb_occurence"]==$b["nb_occurence"]) return 0;
return ($a["nb_occurence"]>$b["nb_occurence"])? -1 : 1;
}else{
return ($a["n"]<$b["n"])? -1 : 1;
}
}
// Fonction pour Traiter les accents une fois le code épuré des balises HTML
function traitementAccentsHTML($text){
$text = ereg_replace("à","à",$text);
$text = ereg_replace("à","à",$text);
$text = ereg_replace("â" ,"â",$text);
$text = ereg_replace("â" ,"â",$text);
$text = ereg_replace("ä" ,"ä",$text);
$text = ereg_replace("ä" ,"ä",$text);
$text = ereg_replace("æ" ,"ae",$text);
$text = ereg_replace("æ" ,"ae",$text);
$text = ereg_replace("ç" ,"ç",$text);
$text = ereg_replace("ç" ,"ç",$text);
$text = ereg_replace("è" ,"è",$text);
$text = ereg_replace("è" ,"è",$text);
$text = ereg_replace("é" ,"é",$text);
$text = ereg_replace("é" ,"é",$text);
$text = ereg_replace("ê" ,"ê",$text);
$text = ereg_replace("ê" ,"ê",$text);
$text = ereg_replace("ë" ,"ë",$text);
$text = ereg_replace("ë" ,"ë",$text);
$text = ereg_replace("î" ,"î",$text);
$text = ereg_replace("î" ,"î",$text);
$text = ereg_replace("ï" ,"ï",$text);
$text = ereg_replace("ï" ,"ï",$text);
$text = ereg_replace("ô" ,"ô",$text);
$text = ereg_replace("ô" ,"ô",$text);
$text = ereg_replace("ù" ,"ù",$text);
$text = ereg_replace("ù" ,"ù",$text);
$text = ereg_replace("û" ,"û",$text);
$text = ereg_replace("û" ,"û",$text);
$text = ereg_replace("®" ,"@",$text);
$text = ereg_replace("®" ,"@",$text);
$text = ereg_replace(" " ," ",$text);
$text = ereg_replace("<" ,"<",$text);
$text = ereg_replace("" ,"<",$text);
$text = ereg_replace(">" ,">",$text);
$text = ereg_replace("" ,">",$text);
$text = ereg_replace(""" ,'"',$text);
$text = ereg_replace(""" ,'"',$text);
$text = ereg_replace("$" ,"$",$text);
$text = ereg_replace("&" ,"&",$text);
$text = ereg_replace("&" ,"&",$text);
$text = ereg_replace("'" ,"'",$text);
$text = ereg_replace("™" ,"TM",$text);
$text = ereg_replace("" ,"TM",$text);
$text = ereg_replace("" ,"oe",$text);
$text = ereg_replace("œ" ,"oe",$text);
$text = ereg_replace("" ,"'",$text);
// Plus générale pour les accents farfelues ;-)
$text = ereg_replace("&(.)[^;]*;","\\1",$text);
return $text;
}
// Fonction filtre pour les différents formats
function filtre($text,$type){
if ($type == "html" || $type == "htm"){
// On ajoute des espaces où il en faut
$text = str_replace("
"," ",$text);
$text = eregi_replace(""," ",$text);
$text = strip_tags($text);
$text = traitementAccentsHTML($text);
$text = ereg_replace("[[:space:]][[:space:]]+", " ", $text);
} else if ($type == "txt"){
#rien
}else{
# ???
}
return $text;
}
// Fonction de recherche pour un mot
// argument : le mot, l'url du répertoire à traiter, la configuration $conf et le nb_now : nombre de pages déjà trouvées (0 au départ)
function recherche($search,$url,$nb_now,$n) {
global $conf;
global $tb_resultat;
$nb=$nb_now;
$rep = opendir("$url");
$search = trim($search);
if ($search == ""){
return 0;
}
while($dir = readdir($rep)) {
// On exclue les répertoire . et ..
if ($dir == "." || $dir == "..") continue;
// si c'est un sous-répertoire, on continue récursivement
if(is_dir("$url$dir/")){
$nb = recherche($search,$url.$dir."/",$nb,$n);
}
// Pas la bonne extension
if(! verifierExt($dir,$conf["ext"])) continue;
if(!($fichier = file($url.$dir))) {
// Impossible de lire le fichier
echo "";
continue;
}else {
// Mise en forme du texte sur lequel on bosse
$text = implode($fichier, " ");
$textinit=$text;
// On filtre en fonction de l'extension
$text=filtre($text,ereg_replace(".*\.([^\.])","\\1",$dir));
if($conf["is_casesensitive"]){
$text2=$text;
$search2=$search;
}else{
// On passe le texte en minuscule
$text2 =strtolower($text);
$search2 = strtolower($search);
}
$size = strlen($text);
// Récupération du titre si c'est du html
$debut_titre = strpos($textinit, "") + 7;
$fin_titre = strpos($textinit, "");
$longueur = $fin_titre - $debut_titre;
if ($fin_titre != "" && $longueur != 0) {
$title = substr($textinit, $debut_titre, $longueur);
if(trim($title)== "") $title = $dir;
} else {
// On essaye avec TITLE
$debut_titre = strpos($textinit, "") + 7;
$fin_titre = strpos($textinit, "");
$longueur = $fin_titre - $debut_titre;
if ($fin_titre != "" && $longueur != 0) {
$title = substr($textinit, $debut_titre, $longueur);
if(trim($title)== "") $title = $dir;
}else{
// Sinon, titre = nom du fichier
$title = $dir;
}
}
$pos = 0;
$occurence = 0;
$encore=1;
$description=""; // Les lignes de description
while(1){
$resultat = strpos($text2,$search2,$pos);
if (!$resultat){ // Plus de résultat dans la page
break;
} else {
// Une occurence de +
$occurence++;
$newpos = $resultat;
//On affiche Le titre si c'est la 1ere occurrence
if ($occurence == 1){
$nb++;
$description = "".htmlentities(traitementAccentsHTML($title))." :
\n";
}
// On affiche les extraits
if (($occurence <= $conf["nbreLigne"])){ // Si l'on doit afficher l'extrait (nbre trouvé < nbre à afficher)
// On extrait le texte autour du mot
$demiExtraitWidth = $conf["extraitWidth"] / 2;
$gpos = ($newpos - $demiExtraitWidth < 0) ? 0 : $newpos - $demiExtraitWidth;
$dpos = ($gpos + $conf["extraitWidth"] > $size) ? $size : $gpos + $conf["extraitWidth"];
$gpos = ($dpos < $size) ? $gpos : (($dpos - $conf["extraitWidth"] < 1) ? 0 : $dpos - $conf["extraitWidth"]);
// On le sort en enlevant les espaces du début
$extrait = trim(substr($text, $gpos, $dpos - $gpos));
$ligne = eregi_replace("(".$search.")","\\1",$extrait);
if($gpos != 0) $ligne = eregi_replace("^[^ ]* ","",$ligne); // On enlève les mots coupés en bout
if($dpos != $size) $ligne = eregi_replace("[^ ]*$","",$ligne); // et en fin
$description .= " ... ".$ligne."...
\n";
// TODO compromis entre avoir le bon nombre d'occurence ou répéter 2 fois ma même chose :(
$pos = $dpos; // Position = position de droite
// $pos=$newpos+strlen($search); // Juste derrière le 1er résultat
} else if(!$conf["is_occurence"]){ // Si on ne veut pas trier par occurence
break;
} else { // sinon on continue
$pos=$newpos+strlen($search);
}
}
}
// Fin de la recherche
// On stocke le nombre d'occurences
if($occurence != 0 ) {
$description .= "".htmlentities($conf["web_url"])."/".htmlentities($dir)." ";
if ($conf["is_occurence"]){
$description .= " - ".htmlentities($search2)." : $occurence\n";
}
}
$page=array("n"=>$n,"mot"=>$search,"nb_occurence"=>$occurence,"description"=>$description);
if($description != ""){ // On stocke dans le tableau de résultat
$tb_resultat[count($tb_resultat)]=$page; // On le mets à la fin du tableau
}
}
}
closedir($rep);
return $nb;
}
// Affichage des résultats
function afficher($tb_resultat){
global $conf;
global $nb_init; // A partir de quel resultat on commence l'affichage
usort($tb_resultat,compare); // On tri en fonction du nbre d'occurences
while(list($key,$value) = each($tb_resultat)) {
if (($key+1) > $nb_init && ($key+1)<=($nb_init+$conf["nbr_par_page"])){
echo "".($key+1).". ".$value['description']."\n
";
}
}
}
// Affiche la barre de navigation entre les pages
function choixpage($nb_init,$nb_total,$searchinit) {
global $conf;
// Boutons previous
if($nb_init>0)
echo " <<<previous ";
$imax= floor(($nb_total-1)/$conf["nbr_par_page"])+1;
if ($imax!=1){
for($i=1;$i <= $imax;$i++){
if($nb_init == (($i-1)*$conf["nbr_par_page"])){
echo " $i ";
} else {
echo " $i ";
}
}
}
// Bouton next
if($nb_init+$conf["nbr_par_page"]<$nb_total)
echo " next>>> ";
echo "
\n";
}
//**************************************************************************
//****************************************** Début du code *****************
if (!(isset($search) && $search != "") || $conf["is_header"]) { // Le Formulaire
echo "SEIFT
";
}
if (isset($search) && $search != "") { // Si le champ "recherche" a été rempli
// On enlève les espaces de fin et début
$search=rawurldecode($search);
$searchinit=$search;
$search=trim($search);
// Si il y a plusieurs mots ?
$mots = split("[' ]",$search,100);
// initialisation du nbre de fois que le mot a été trouvé
$nb = 0;
// Chrono ?
$seconde0=date("U");
// Recherche sur tout
$nb = recherche($search,$conf["url"],0,0);
// Recherche sur chaque mot si plus d'un mot
if (count($mots) > 1){
for($i=0; $i < count($mots); $i++){
$monMot = $mots[$i];
// On supprime les mots de liaisons usuels
if (preg_match("/^((.)|(..)|(les)|(une)|(des))$/",$monMot)){
// Rien
}else {
$nb = recherche($monMot,$conf["url"],$nb,$i+1);
}
}
}
$nb_total = $nb;
$seconde1=date("U");
$temps= ($seconde1-$seconde0);
if (isset($tb_resultat) || $tb_resultat != "")
{
echo "
";
echo "$nb_total pages trouvées en $temps secondes
\n";
choixpage($nb_init,$nb_total, $searchinit);
echo "
\n";
if (isset($tb_resultat) || $tb_resultat != "")
afficher($tb_resultat);
choixpage($nb_init,$nb_total, $searchinit);
}else{
echo " Nous sommes désolés mais aucune page ne correspond à votre recherche
\n
\n";
}
}
echo "
";