	#/usr/local/bin
#----------------------------------------------------------
use Tk;
use locale;
use LWP::Simple;
use Encode;
use HTML::Entities;
use Tk::NoteBook;
use Tk::SMListbox;
use Win32::Process;
#----------------------------------------------------------
# definition interface
#----------------------------------------------------------
# creation de la fenetre principale
$mw= MainWindow->new;
$mw->title("zouggi");
#---------------------------------------------------------
my $cadreMenu = $mw->Frame->pack(-side => 'top',
			  -fill => 'both');
my $b_menu1=$cadreMenu->Menubutton(-text => "Fichier",
				  -tearoff => 0,
				  -relief => 'ridge',
				  -menuitems => [
						['command' => "Charger Fichier TXT",
						  -command => \&lire_File],
					['command' => "URL vers TXT",
						   -command => \&url2txt],
						 ['command' => "info url",
						  -command => sub {&donnees_url}],
						 ['command' => "Sauvegarder",
						  -command => \&sauve_editor],
						 ['command' => "Sortie",
						  -command =>  sub {exit;}]])->pack(-side => 'left');
						  
						
my $b_menu2=$cadreMenu->Menubutton(-text => "syntaxe",
				  -tearoff => 0,
				  -relief => 'ridge',
				  -menuitems => [
						['command' => "Charger treetagger",
						-command => \&etiquetage],
						['command' => "Charger extraction",
						-command => \&extraction]])->pack(-side => 'right');
						
						
my $b_menu3=$cadreMenu->Menubutton(-text => "manuel",
				  -tearoff => 0,
				  -relief => 'ridge',
				  -menuitems => [
						['command' => "aide",
						-command => \&aide]])->pack(-side => 'right');
						

				  

#---------------------------------------------------------
my $cadre = $mw->Frame->pack(-side => 'top',
			  -expand=>1,
			  -fill => 'both');
my $onglet=$cadre->NoteBook(-backpagecolor=> '#C0C0C0',
				-background=>'#01B0F0', 
				-disabledforeground=>'black',
				-foreground=>'white', 
				-inactivebackground  => '#BFBFBF', #color for inactive tabs
				)->pack(-side=>'top',
					-expand=>1,
					-fill=>'both');

my $page1=$onglet->add("page1",-anchor=>'w',label=>'Edition-URL',-underline=>0);
my $page2=$onglet->add("page2",-anchor=>'w',label=>'Dictionnaire',-underline=>0);
my $page3=$onglet->add("page3",-anchor=>'w',label=>'Concordance',-underline=>0);
my $page4=$onglet->add("page4",-anchor=>'w',label=>'Rapport sur URL',-underline=>0);
my $page5=$onglet->add("page5",-anchor=>'w',label=>'Treetagger',-underline=>0);
my $page6=$onglet->add("page6",-anchor=>'w',label=>'extraction patron',-underline=>0);
#------------------------------------------------------------
# interface de la page 1 : edition d' URL...
#------------------------------------------------------------
my $cadreP1=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP1->configure(-background => 'green');
my $cadreP2=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP2->configure(-background => 'green');
my $cadreP2b=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP2b->configure(-background => 'violet');
my $cadreP3=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP3->configure(-background => 'black');

$cadreP1->Label(-text => "URL : ",
    	      -relief => 'raised')->pack(-side => 'left',
						  -anchor => 'w');
$cadreP1->Entry(-textvariable => \$url)->pack(-side => 'left',
						-anchor => 'w',
						-fill => 'x',
						-expand => 1);
$cadreP1->Button(-text => "Charger URL",
	       -command => sub {&lire_url})->pack(-side => 'left',
						   -anchor => 'e');
$cadreP1->Button(-text => "URL vers texte",
	       -command => sub {&url2txt})->pack(-side => 'left',
						   -anchor => 'e');
#--------- Editeur fenetre principale ---------------
$editortexte = $cadreP2->Scrolled("Text")->pack(-side => 'bottom',
				      -fill => 'both',
				      -expand => 1);
$editortexte->Text(-setgrid => 'true');

#---------------------------------------------------------------
# page 2
#.......
my $cadrePkkkkkk=$page2->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); 
$cadrePkkkkkk->configure(-background => 'green');

my $dicoG=$cadrePkkkkkk->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'left', -fill => 'both',-expand=>'0');
my $dicoD=$cadrePkkkkkk->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'left', -fill => 'both',-expand=>'1'); 


my $LabelDico=$dicoG->Label(-text => "Dico",-relief => 'ridge')->pack(-side => 'top',-fill => 'x');

$dicoG->Button(-text => "Concordance", -command => sub {&concordance})->pack( -side => 'top',-padx => 5,-pady=>5);

					 				 
$editortexte2= $dicoD->Scrolled('SMListbox',


                -scrollbars => 'se',

                -height => 12,

                -relief => 'sunken',

                -sortable => 1,

                -selectmode => 'extended',

                -showallsortcolumns => 1,

                -takefocus => 1,

                -borderwidth => 1,

                -columns => [

                        [-text => 'Forme', -width => 20, -comparecommand => sub { $_[1] cmp $_[0]}],

                        [-text => 'Fq', -width => 10,-comparecommand => sub { $_[1] <=> $_[0]}],
                ]
				)->pack(
				-side => 'top',
				-expand => 'yes',
				-fill => 'both',
				-padx => 0,
				-padx => 0,
				
				

                                

                );

#.......
# création de la page 3 concordance 

my $listeconcordance=$page3->Scrolled('SMListbox',


                -scrollbars => 'se',

                -height => 12,

                -relief => 'sunken',

                -sortable => 1,

                -selectmode => 'extended',

                -showallsortcolumns => 1,

                -takefocus => 1,

                -borderwidth => 1,

                -columns => [

                        [-text => 'contexte gauche', -width => 39, -comparecommand => sub { $_[1] cmp $_[0]}],

                        [-text => 'pôle', -width => 10,-comparecommand => sub { $_[1] <=> $_[0]}],
						
						[-text => 'contexte droit', -width => 43,-comparecommand => sub { $_[1] <=> $_[0]}],
                ]
				)->pack(
				-side => 'top',
				-expand => 'yes',
				-fill => 'both',
				-padx => 0,
				-padx => 0,);
#.......
# page 4
my $cadreP4=$page4->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP4->configure(-background => 'green');

$editorurl = $cadreP4->Scrolled("Text")->pack(-side => 'bottom',
				      -fill => 'both',
				      -expand => 1);
$editorurl->Text(-setgrid => 'true');



#.......
#création de la page 5

my $cadreP5=$page5->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP5->configure(-background => 'green');

$editortreetagger = $cadreP5->Scrolled("Text")->pack(-side => 'bottom',
				      -fill => 'both',
				      -expand => 1);
$editortreetagger->Text(-setgrid => 'true');

#.......
#création page 6
my $cadreP6=$page6->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1');
$cadreP6->configure(-background => 'green');

$editorextraction = $cadreP6->Scrolled("Text")->pack(-side => 'bottom',
				      -fill => 'both',
				      -expand => 1);
$editorextraction->Text(-setgrid => 'true');

#---------------------------------------------------------------
MainLoop;
#---------------------------------------------------------------
#---------------------Procédures------------------------------
#---------------------------------------------------------------
sub lire_url {
    $info="Chargement $url...";
    $editortexte->delete("1.0","end");

    my $page = get( $url );

    if ( not defined( $page ) ){
	print "Problème lors du téléchargement !\n";
    }

    $editortexte->insert("end",$page);

    $info = "$url chargée.";
}
#----------------------------------------------------------------
sub makedico {
	my ($texteasegmenter)=@_;
	my @listedemots=split(/\W+/,$texteasegmenter);
	my %dico=();
	foreach my $mot (@listedemots) {
		if (exists($dico{$mot})) {
			$dico{$mot}++
		}
		else {
			$dico{$mot}=1;
		}
	}
	foreach my $mot (sort keys %dico) {
			$editortexte2->insert("end",[$mot, $dico{$mot}]);
	}
}
sub url2txt {
    $editortexte->delete("1.0","end");
    my $page = get( $url );
    if ( not defined($page) ){
	die "Problème lors du téléchargement !\n";
    }
    my $codage_page = "latin1";
    if ($page =~ /\bcharset\s*=\s*([\w-]+)/i) {
	$codage_page = $1;
	eval { decode ($codage_page, "test") };
	if ( defined ($@) ) {
	    $codage_page = "latin1";
	}
    }
    my $page_unicode = decode( $codage_page, $page );
    my $texte_unicode = supprime_html( $page_unicode );
    my $texte = normalise_latin1( $texte_unicode );
    $editortexte->insert("end",$texte);
	
	&makedico($texte);
	
    #-------------------------------------------------------------
    sub supprime_html { 
	my @balises_a_ignorer =
	    ("applet","code","embed","head","object","script","server");
	
	my $html = shift @_; 
	$html =~ s/\n+/ /g;
	$html =~ s/\r+/ /g;
	decode_entities($html);
	foreach my $balise (@balises_a_ignorer) {
	    $html=~s/<$balise.*?<\/$balise>//ig;
	}
	$html =~ s/<!--.*?-->//g;     #commentaires
	$html =~ s/<\/?p\/?>/\n/ig;   #paragraphes
	$html =~ s/<br\/?>/\n/ig;     #retours à la ligne
	$html =~ s/<\/tr>/\n/ig;      #lignes de tableau
	$html =~ s/<\/?h[1-6]>/\n/ig; #titres
	$html =~ s/<\/?div.*?>/\n/ig; #sections
	$html =~ s/<.*?>//g;          #autres balises
	$html =~ s/\s*\n\s*/\n/g;     #espaces en début/fin de ligne
	$html =~ s/ +/ /g;            #séquences de plusieurs espaces  
	return $html;
    }
    sub normalise_latin1 {
	my $chaine = shift @_;
	$chaine =~ s/[\x{2019}\x{2018}]/\'/g;
	$chaine =~ s/[\x{201C}\x{201D}]/\"/g;
	$chaine =~ s/[\x{2013}\x{2014}]/-/g;
	$chaine =~ s/\x{2026}/.../g;
	$chaine =~ s/\x{0152}/OE/g;
	$chaine =~ s/\x{0153}/oe/g;
	$chaine =~ s/[^\x{0000}-\x{00FF}]//g;
	return $chaine;
    }
}
#---------------------------------------------------------------
sub sauve_fic {
    
    $info="Sauvegarde du fichier RESULTAT.txt...";
    $nom_fic="RESULTAT.txt";
    open(FIC,">$nom_fic");
    print FIC $editortexte->get("1.0","end");
    $info= "Fichier '$nom_fic' sauvegardé.";
}
#---------------------------------------------------------------
sub search_in_fic {
    
    $info="Recherche dans le fichier...";
    &text_search($editortexte, $search_string, 'search');
    if ($mw->depth > 1) {
	text_toggle($editortexte, ['configure', 'search', -background => 'SeaGreen4', -foreground => 'white'], 800,
		          ['configure', 'search', -background => undef,       -foreground => undef],   200);
      } else {
	text_toggle($editortexte, ['configure', 'search', -background => 'black',     -foreground => 'white'], 800,
		          ['configure', 'search', -background => undef,       -foreground => undef],   200);
      }

    $info= "Recherche dans Fichier terminée.";
}
#---------------------------------------------------------------
sub text_search {

    # The utility procedure below searches for all instances of a given string in a text widget and applies a given tag
    # to each instance found.
    # Arguments:
    #
# w -	The window in which to search.  Must be a text widget.
    # string -	The string to search for. (regexp and so on...)
    # tag -	Tag to apply to each instance of a matching string.

    my($w, $string, $tag) = @_;

    $w->tag('remove',  $tag, '0.0', 'end');
    (my $num_lines) = $w->index('end') =~ /(\d*)\.\d*/;
    for($i = 1; $i <=$num_lines; $i++) {
	my $line = $w->get("${i}.0", "${i}.1000");
	next if not defined $line or $line !~ /($string)/;
        my $l = length $1;
	$stringRegexp=$1;
	my $offset = 0;
	while (1) {
	    my $tmpoffset=0;
	    my $index = index $line, $stringRegexp, $tmpoffset;
	    last if $index == -1;
	    $offset += $index;
	    $w->tag('add', $tag, sprintf("%d.%d", $i, $offset), sprintf("%d.%d", $i, $offset+$l));
	    $offset += $l;
	    $line = substr $line, $index+$l;
	    if ($line=~/($string)/) { $stringRegexp=$1;
				      $l = length $1;}
	} # whilend
    } # forend

} # end text_search
#---------------------------------------------------------------
sub text_toggle {
    # The procedure below is invoked repeatedly to invoke two commands at periodic intervals.  It normally reschedules itself
    # after each execution but if an error occurs (e.g. because the window was deleted) then it doesn't reschedule itself.
    # Arguments:
    #
    # w -       Text widget reference.
    # cmd1 -	Reference to a list of tag options.
    # sleep1 -	Ms to sleep after executing cmd1 before executing cmd2.
    # cmd2 -	Reference to a list of tag options.
    # sleep2 -	Ms to sleep after executing cmd2 before executing cmd1 again.
    my($w, $cmd1, $sleep1, $cmd2, $sleep2) = @_;
# return if not Exists $w;
    $w->tag(@{$cmd1});
    $w->after($sleep1, [sub {text_toggle(@_)}, $w, $cmd2, $sleep2, $cmd1, $sleep1]);
} # end text_toggle
#---------------------------------------------------------------
sub concordance {
	my @selection = $editortexte2->curselection();
	if ($#selection eq -1) {
		return;
		}
	my @listeItem=();
	for (my $sel=0;$sel <= $#selection; $sel++) {
		my @formes=$editortexte2->getRow($selection[$sel]);
		my $forme=$formes[0];
		print $forme,"\n";
		push(@listeItem,$forme);
	}
	print "@listeItem \n";;
	my $texte=$editortexte->get("1.0",'end');
	my $nbdemotagarderdanslecontexte=10;
	
	
	foreach my $motif (@listeItem) {
		# on lance la concordance sur $motif
		while ($texte=~/\b$motif\b/g) {
			my $gauche=$`; 
			#print $gauche;
			my $pole=$&;
			my $droite=$';
			my @GAUCHE=split(/\W+/,$gauche) ; 
			my @DROITE=split(/\W+/,$droite) ; 
			#création  d'un contexte droit
			my $tmpdroite="";
			for ($i =0;$i<=$nbdemotagarderdanslecontexte-1;$i++) {
			$tmpdroite.=$DROITE[$i]." ";
		}
		#création contexte gauche
		my $tmpgauche="";
		@GAUCHE=reverse(@GAUCHE);
		for ($i =1;$i<=$nbdemotagarderdanslecontexte;$i++) {
			$tmpgauche=$GAUCHE[$i]." ".$tmpgauche;
		}
		$listeconcordance->insert("end",[$tmpgauche, $pole,$tmpdroite]);
		}

	}
}


sub lire_File {
	my $types= [
		['Text Files', ['.txt','.dic','.par']],
		['All Files', ['.*']]
		];
		
	my $tmp_nom_source=$mw->getOpenFile(-filetypes=>$types);
	print $tmp_nom_source,"\n";
	if ($tmp_nom-source=~/^$/) {
	return;
	}
	
	my $texte="";
	$url=$tmp_nom_source;
	open(TMP,$tmp_nom_source);
	while(<TMP>) {
	$texte.=$_;
	}
	close (TMP);
	$editortexte->delete("1.0","end");
	$editortexte->insert("end",$texte);
	&makedico($texte);
}

sub etiquetage {
	$texte=$editortexte->get("1.0",'end');
	open (FILETMP, ">inputtreetagger1.txt");
	print FILETMP $texte;
	close (FILETMP);
	system("perl tokenise-fr.pl inputtreetagger1.txt > inputtreetagger2.txt");
#on lance treetagger
	my $treetagger="inputtreetagger2.txt";
	my $treetaggerout="outputtreetagger1.txt";
	my $liblangue = "french.par";
	my $progname = "tree-tagger.exe";
	my $commandtreetagger = "$progname $liblangue -lemma -token -sgml -no-unknown \"$treetagger\" \"$treetaggerout\"" ;
	
	Win32::Process::Create($Win32::Process::Create::Processobj,
				"tree-tagger.exe",
				$commandtreetagger,
				0,
				NORMAL_PRIORITY_CLASS,
				".",
				)
	or 
	die Win32::FormatMessage( Win32::GetLastError() ),"\n";
	$Win32::Process::Create::Processobj->Wait(INFINITE);

	# on met au format XML
	system ("perl treetagger2xml.pl outputtreetagger1.txt");
	
	# il faut maintenat lire les résultats
	my $texte="";
	open (TMP, "outputtreetagger1.txt.xml");
	while(<TMP>) {
	$texte.=$_;
	}
	$editortreetagger->delete("1.0","end");
	$editortreetagger->insert("end",$texte);
	$onglet->raise('page5');
}
	
sub extraction {
    my $texte=$editortreetagger->get("1.0",'end');
    $editorextraction->delete("1.0","end");
	my @lignes=split(/\n/,$texte);
	while (@lignes) {
		my $ligne=shift(@lignes);
		chomp $ligne;
		my $sequence="";
		my $longueur=0;
		if ( $ligne =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
			my $forme=$1;
			$sequence.=$forme;
			$longueur=1;
			my $nextligne=$lignes[0];
			if ( $nextligne =~ /<element><data type=\"type\">ADJ*<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
				my $forme=$1;
				$sequence.=" ".$forme."\n";
				$longueur=2;
			}
			if ($longueur == 2) {
			$editorextraction->insert("end",$sequence);
			}
		}
	}
}

sub donnees_url {
my $texteasegmenter=$editortexte->get("1.0","end");
$editorurl -> delete("1.0","end");
print "<$texteasegmenter>\n";
if($texteasegmenter eq "\n") {
		$editorurl->insert("end","Le texte est vide, nous ne pouvons pas faire de rapports...\n");
		return;
	}
	my @listedemots=split(/\W+/,$texteasegmenter);
	my %dico=();
	$cmptlignes=0;
	$cmptmots=0;
	$cmptmotsdifferents=0;
	my @listedelignes=split(/\n/,$texteasegmenter);
	$cmptlignes=$#listedelignes+1;
	foreach $mot (@listedemots) {
		$cmptmots++;
		if ($mot ne "") {
			if (exists($dico{$mot})) {
				$dico{$mot}++;
			}
			else {

				#On affecte la valeur 1 à la valeur de la clé $mot du tableau $dicomots

				$dico{$mot}=1;

				#On incrémente le cmpt $cmptmotsdifferents

				$cmptmotsdifferents++;

			}

		}

	}



	$editorurl->insert("end", "Resultat de l'analyse du fichier :\n");

	#Si la valeur de la variable $cmptlignes est égale à 0, on exécute le bloc d'instructions

	if ($cmptlignes==0) {

		#On affiche "Le fichier ne contient aucune ligne."

		$editorurl->insert("end","Le fichier ne contient aucune ligne.\n");

	}

		#Sinon si la valeur de la variable $cmptlignes est égale à 1, on exécute le bloc d'instructions

	elsif ($cmptlignes==1) {

		#On affiche "Le fichier contient ", suivi du contenu de la variable $cmptlignes, et suivi de " ligne"

	

	    $editorurl->insert("end","Le fichier contient $cmptlignes \n");

	}

	#Sinon si aucune des deux conditions précédentes n'est remplie (Donc si la valeur de la variable $cmptlignes est strictement supérieure à 1), on exécute le bloc 	d'instructions

	else {

		#On affiche "Le fichier contient " du contenu de la variable $cmptlignes, et de " lignes"

		$editorurl->insert("end","Le fichier contient $cmptlignes lignes.\n");

	}

	#Si la valeur de la variable $cmptmots est égale à 0, on exécute le bloc d'instructions

	if ($cmptmots==0) {

		#On affiche "Le fichier ne contient aucun mot."

		$editorurl->insert("end","Le fichier ne contient aucun mot.\n");

	}

	#Sinon si la valeur de la variable $cmptmots est égale à 1, on exécute le bloc d'instructions

	elsif ($cmptmots==1) {

		#On affiche "Le fichier contient ", suivi du contenu de la variable $cmptmots, et suivi de " mot"

		$editorurl->insert("end","Le fichier contient $cmptmots mot\n");

	}

	#Sinon si aucune des deux conditions précédentes n'est remplie (Donc si la valeur de la variable $cmptmots est strictement supérieure à 1), on exécute le bloc 		d'instructions

	else {

		#On affiche "Le fichier contient ", suivi du contenu de la variable $cmptmots, suivi de " mots", suivi de " dont ", suivi  du contenu de la variable $cmptmotsdifferents, et suivi de " differents"

		$editorurl->insert("end", "Le fichier contient $cmptmots mots dont $cmptmotsdifferents differents.\n");

	}

	$onglet->raise('page4');

}

sub aide {
	my $toplevel = $mw->Toplevel(-title=>"comment se débrouiller avec le programme");
	my $editormanuel = $toplevel->Scrolled("Text")->pack(-side => 'bottom',
				-fill => 'both',
				-expand => 1);
	$manuel ="Dans les menus déroulants il ya plusieurs éléments
1- dans Fichier	 : 
on peut cherder des fichiers .txt, lancer la fonction de recherche sur l'url, sauvegarder notre travail et sortir du programme
2- dans Manuel se trouvent les différentes aides que vous avez ouvertes
3- dans Syntaxe : on peut lancer les fonction treetagger et extraction de patron

les onglets : 
édition-URL permet de voir la page ou le texte qu'on souhaite étudier
Dictionnaire permet de faire une liste des mots et de les classer en forme et fréquence
Concordance est la page de résultats des contextes gauches et droits
Treetagger est la pages des résultats après analyse par le logiciel treetagger
extraction patron est la mise en page des Noms suivis d'Adjectifs dans les phrases

";
	$editormanuel->insert("end",$manuel);
}