#!/usr/bin/perl
use locale;
use English;
use Getopt::Std;
use Encode::Encoding;
use Encode::CN;
use Encode::KR;
use Encode::TW;
use Encode::JP;
use Unicode::String qw(utf8);

my $VERSION="2.1 modifiee";
my $CMD="minigrepmultilingue";
my $MODIFIED="03/01/2008";
my $HELP="
___________________________________________________________________________

$CMD $VERSION (c) Serge Fleury, Pierre Marchal SYLED/CLA2T PLURITAL $MODIFIED
___________________________________________________________________________

OBJECTIF : un mini-grep-multilingue 

SYNTAXE :   $CMD [options] <fichier-codage> <fichier-a-filtrer> <fichier-avec-motif> <fichier-de-sortie>

OPTIONS :
  -h        imprime le mode d'emploi de ce programme
  -c        version \"classique\" de minigrepmultilingue

EXEMPLES:
    perl mini-grep-multilingue.pl \"UTF-8\" RU_Convention_UTF8.txt motif.txt

___________________________________________________________________________


";
###########################################################################
# parse command line
###########################################################################
getopts('hdtc');
if (defined($opt_h)) {
  print STDERR "$HELP";
  exit(1);
}

my $classique=0;
if (defined($opt_c)) {
  print STDERR "\nmode \"classique\" active\n";
  $classique=1;
}
#----------------------------------------------------------------------------
if ((!($ARGV[0])) || (!($ARGV[1])) || (!($ARGV[2])) || (!($ARGV[3])))  {
    exit;
}
###########################################################################
# A. Lecture des arguments du programme 
my $tmpcodage=$ARGV[0];
chomp($tmpcodge);
my $filein=$ARGV[1];
print "Fichier en entree : $filein \n";
my $filewithforme=$ARGV[2];
my $fileout=$ARGV[3];
###########################################################################
print "extraction du motif...\n";
# B. le fichier contenant la forme à extraire
open(FILE0,"<:encoding($tmpcodage)",$filewithforme) or die "Pb sur l'ouverture du fichier $filewithforme !!! ";
my $formein=<FILE0>;
chomp($formein);
$formein=~/MOTIF=(\w+)$/;
my $forme=$1;
utf8($forme);
close(FILE0);
###########################################################################
my $points="&#x30FB;&#x30FB;&#x30FB;";
close(FILE1);
###########################################################################
print "extraction de la forme et ecriture du resultat dans $fileout \n";
# C. Parcours du fichier et extraction du motif
open(FILEIN,"<:encoding($tmpcodage)",$filein) or  die "Pb sur l'ouverture du fichier $filein !!! ";
open(FILEOUT,">:encoding(UTF-8)",$fileout) or  die "Pb sur l'ouverture du fichier $fileout !!! ";

# D. Nombre d'occurrences de la forme recherchée
my $occurrence=0;
while (my $ligne=<FILEIN>) {
	utf8($ligne);
    while ($ligne =~/$forme/g) {
	$occurrence++;
	}
}
close(FILEIN);

print FILEOUT "<html>\n<head>\n<title>$forme : un mot sur le web</title>\n";
print FILEOUT "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\" />\n";
print FILEOUT "<style type=\"text/css\">body{font-family: Times, \"Times New Roman\", serif;}</style>";
print FILEOUT "<body bgcolor=\"#ffffff\">\n";
print FILEOUT "<p>Fichier de travail (INPUT) : <span style=\"color: #ffc0cb\"><b>$filein</b></span></p>\n"; 
print FILEOUT "<p>Encodage utilisé (INPUT) : <span style=\"color: #ffc0cb\"><b>$tmpcodage</b></span></p>\n";
print FILEOUT "<p>Forme recherchée : <span style=\"color: #ffc0cb\"><b>$forme</b></span></p>\n";
print FILEOUT "<p>Nombre d'occurrences de la forme recherchée : <span style=\"color: #ffc0cb\"><b>$occurrence</b></span></p>\n";
print FILEOUT "_________________________________________________________________________________________________\n";
print FILEOUT "<blockquote>\n";
print FILEOUT "<ul>\n";

open(FILEIN,"<:encoding($tmpcodage)",$filein) or  die "Pb sur l'ouverture du fichier $filein !!! ";

my $i=1;
my $verif=0;
my $ligne_haut;

while (my $ligne=<FILEIN>)  {
    utf8($ligne);

    # si la ligne precedente contenait le motif on l'imprime : contexte apres
    if ($verif == 1) {
	unless (($ligne=~/^\s*$/)||($classique==1)) {
	    print FILEOUT "Ligne n°$i : $ligne$points<br/>";

	}
	$verif=0;
    }

    while ($ligne =~/$forme/g) { 
	my $gauche = $`;
	my $droite = $';
	my $test=0;
	# si le motif est trouve, il faut affiche 1 seule fois le contexte precedent stocke (cf infra)
	if (($ligne_haut ne "-------LIGNE_HAUT_DEJA_INSEREE----------------") && ($ligne_haut ne "") && ($classique==0)) {
	    print FILEOUT "<br/>Ligne n°",$i-1," : $points$ligne_haut";
	    $test=1;
	    $ligne_haut="-------LIGNE_HAUT_DEJA_INSEREE----------------";
	}
	unless ($test == 1) {
	    print FILEOUT "<br/>"; #imprimer un retour à la ligne si ligne du haut non affichée
	}
	print FILEOUT "<li><b>Ligne n°$i</b> : $gauche<span style=\"color: pink; background-color: black;\">$forme<\/span>$droite </li>";
	$verif=1;

    }	 

    # on stocke la ligne qui peut devenir le contexte precedent la prochaine recherche du motif
    if ($ligne=~/^$/) {
	$ligne_haut="";
    }
    else {
	$ligne_haut=$ligne;
    }
    $i++;
    
}
print FILEOUT "</ul>\n";
print FILEOUT "</blockquote>\n";
print FILEOUT "</html></body>";
###########################################################################
close(FILEIN);
close(FILEOUT);
###########################################################################
if ($occurrence==0){
exit(1);
}
else {
exit (0);
}
