#!/usr/bin/perl

###########################################################################
#
# Script Perl permettant de definir un formulaire et des routines associees
# pour permettre aux etudiants de trouver des references dans la bibliographie
# sur les methodes formelles.
#
# Auteur: Guy Tremblay
# Creation: Printemps 1998
# Revision: Hiver 1997
#
###########################################################################


#----------------------------------------------------------------------

if ($ENV{"SCRIPT_FILENAME"}) {
    @tmp1 = split( "/", $ENV{"SCRIPT_FILENAME"} );
} else {
    @tmp1 = split( "/", $ENV{"HOME"} );
}
$home = $tmp1[1];

require "ctime.pl";

# Variable globale a utiliser comme prefixe pour acceder a ma bibliographie

$prefixeBib = "/$home/tremblay_gu/biblio/";

#----------------------------------------------------------------------


require "/$home/tremblay_gu/public_html/cgi-bin/cgi-lib.pl";

$ancienneLigne = "";
$finRencontree = 0;


MAIN:
{

    if (&ReadParse(*input))
    {
	&ProcessForm;
    }
    else
    {
	&ShowForm;
    }
}

###############################################
#Sous-routine qui affiche le formulaire
###############################################
sub ShowForm
{
	print &PrintHeader;
	print &HtmlTop("Recherche dans une des bibliographies de <A HREF=\"http://www.labunix.uqam.ca/~tremblay\">Guy Tremblay</A>.");
	print <<EOTA;
	Ce formulaire sert &agrave; effectuer une recherche dans
	    une des bibliographies d&eacute;velopp&eacute;es et entretenues par Guy Tremblay.
		<P> 

Dans le cas de certaines bibliographies, un r&eacute;sum&eacute;
d&eacute;crivant bri&egrave;vement le contenu de l'article ou du livre
associ&eacute; est associ&eacute; &agrave; certaines des
r&eacute;f&eacute;rences.

<P>
<HR>
<P>

Le mot-cl&eacute; indiqu&eacute; pour la recherche peut &ecirc;tre un
nom d'auteur, un mot d'un titre ou un mot-cl&eacute; d&eacute;crivant
le contenu de l'article ou livre. En fait, de fa&ccedil;on plus
g&eacute;n&eacute;rale, cette cl&eacute; de recherche peut &ecirc;tre
une expression r&eacute;guli&egrave;re <i>perl</i>.

	<FORM METHOD=POST>
	<P>
<PRE>Entrez un mot-cl&eacute;:       <INPUT TYPE="TEXT" NAME="motcle" SIZE=20 VALUE="">
</PRE>

<P>
<P>

Indiquez la bibliographie dans laquelle se fera la recherche:
<SELECT NAME="biblio">
<OPTION VALUE="arch+pp" SELECTED>Architecture et programmation parall&egrave;le
<OPTION VALUE="bd">Bases de donn&eacute;es
<OPTION VALUE="comp">Compilation
<OPTION VALUE="components">Composants logiciels
<OPTION VALUE="design">Conception (<I>design</I>)
<OPTION VALUE="enseignement">Enseignement
<OPTION VALUE="dic">Informatique cognitive
<OPTION VALUE="mf">M&eacute;thodes formelles
<OPTION VALUE="fp">Programmation fonctionnelle 
<OPTION VALUE="web-services">Services <em>Web</em>
<OPTION VALUE="standards">Standards
<OPTION VALUE="varia">Varia
</SELECT>

<P>

<INPUT TYPE="SUBMIT" VALUE="Effectuer recherche">
<INPUT TYPE="RESET" VALUE="Effacer">
</FORM>

<P> Veuillez noter que la recherche peut prendre quelques minutes.
<P><HR><P><P><P>
    <B> R&eacute;alisation</B>: Ce script a &eacute;t&eacute; d&eacute;velopp&eacute; par <A HREF="http://www.labunix.uqam.ca/~tremblay"> Guy Tremblay</A>, professeur au d&eacute;partement d'informatique de l'UQAM.
EOTA
    
    print "<P><P>";
	
	print &HtmlBot;
}


sub ProcessForm
{
    local($motCle);

    $motCle = $input{'motcle'};
    $laBib = $input{'biblio'};
    if (!$laBib) {
	$laBib = "mf";
    }
    $bib = $prefixeBib . $laBib . ".bib";

    print &PrintHeader;
    print &HtmlTop("R&eacute;f&eacute;rences trouv&eacute;es pour \"$motCle\" (dans $laBib.bib)");
    
    &ObtenirReferences($motCle);

    print "<P><P>";
    print &HtmlBot;
}


# -------------------------------------------------

sub ObtenirReferences
{
    local($motCle) = @_;
    local($numRef) = 0;

    $motCle =~ y/a-z/A-Z/;


    if (!open(BIB, "< $bib")) {
        print "$bib\n";
	print "*** Erreur: Fichier bibliographie pas trouvee\n";
	return;
    }

    $refs = "";

    print "<A NAME=\"Ref-0\"></A>\n<UL>\n";
    while($ref = &obtenirReference) {
	$laRef = $ref;
	$ref =~ y/a-z/A-Z/;
	if ($ref =~ /$motCle/) {
	    $titre = &trouverTitre($laRef);
	    $laRef =~ s/!!/\n/g;
	    $numRef = $numRef + 1;
	    print "<LI><A HREF=\"\#Ref-$numRef\"> \# $numRef: </A>$titre\n";
	    $refs = 
		$refs . 
                "<B><A NAME=\"Ref-$numRef\">" . 
		"R&eacute;f&eacute;rence \#$numRef: " . 
		"</A></B>\n<PRE>\n$laRef</PRE>\n<P><EM>Pour revenir &agrave; l'index, <A HREF=\"#index\">cliquez-ici.</A><P></EM><HR><P>\n\n";
	}
    }
    close(BIB);
    if ($numRef == 0) {
	print "<LI> Aucune r&eacute;f&eacute;rence trouv&eacute;e\n";
    }
    print "</UL>\n";
    print "<P> <HR><P>\n";
    print $refs;
}

sub trouverTitre
{
    local($uneRef) = @_;
    $titreTrouve = 0;

    @words = split(/!!/, $uneRef);
    for( $i = 0; ($i < $#words) && (! $titreTrouve); $i++ ) {
	if ( $words[$i] =~ /[ \t]title/ ) {
	    $words[$i] =~ s/[ \t]*title[ \t]*=[ \t]*//;
	    $titreTrouve = $words[$i];
	}
    }
    if (! $titreTrouve) {
	return "Titre inconnu";
    }

    for ( ; $i < $#words; $i++ ) {
	if ( $words[$i] =~ /=/ ) {
	    chop $titreTrouve;
	    return $titreTrouve;
	}
	$words[$i] =~ s/^[ \t]*//;
	$titreTrouve .= " " . $words[$i];
    }
}

sub obtenirReference
{
    $ref = "";
    $trouve = 0;
    $fin = 0;
    
    if ($finRencontree) {
	return( 0 );
    }

    if ($ancienneLigne && ($ancienneLigne ne "")) {
	$ligne = $ancienneLigne;
    } else {
	$ancienneLigne = $ligne;
	$ligne = <BIB>;
	$finRencontree = (! $ligne);
    }
    
    
    while ( $ligne && (! $fin) ) {
	if (substr($ligne,0,1) eq "@") {
	    if ($trouve) {
		$fin = 1;
	    } else {
		$trouve = 1;
		chop $ligne;
		$ref = $ligne . "!!";
	    }
	} else {
	    chop $ligne;
	    $ref = $ref . $ligne . "!!";
	}
	$ancienneLigne = $ligne;
	if (! $fin) {
	    $ligne = <BIB>;
	    if (! $ligne) {
		$finRencontree = 1;
		$ancienneLigne = $ligne;
	    }
	}
    }
    
    return $ref;
}
