	#!/bin/bash
	  # lancement de l'interpréteur wish\
	  exec wish "$0" "${1+"$@"}"
	  
	  
	  #______________________________________________________
	  # --------------------------------------------------------------------------------
	  #	PAGITOR est un petit programme d'analyse de textes - 
	  # version 1.1
	  # 27/05/2025
	  # ______________________________________________________
	  
  	 # OCCURRENCES  est un mini programme permettant de rechercher 
	  # des mots dans un texte d'un widget "text" 
	  # écrit en TCL-TK
	  # auteur : daniel MACOUIN à partir de codes d'autres personnes. 
	  # licence NOL
	
	  #=======================================================
	  # l'interface est minimaliste, elle sert pour illustrer les routines de recherches
	 # qui peuvent s'insérer dans n'importe quel éditeur de texte écrit en TclTk
	  #---------------------------------------------------------------------------------------------------
	
	# au depart le logiciel s'appelait MuleMenu étant un essai de mettre à jour un index de texte ouvert dans le menu "pages"
	
	
	 package require Tk
	
	
	set Chemin(abs) [pwd]
	  set NomScript [info script]
	  set Chemin(rel) [file dirname $NomScript]
	
		
	global nomDocument
	set nomDocument "defaut"
	
	global ancienNomDocument
	set ancienNomDocument "defaut"
		
	global fichiers 
  	set  fichiers(clef) valeur 

	global numNouveau
	set numNouveau 0 
	
	global nomOnglet
	set nomOnglet $nomDocument
	
	
#<programme>  MuleMenu est un programme pour tester l'ouverture d'un menu PAGES"
	
#<interface>
#<Initialisation> 	
	#frame des onglets
	frame .f -bg lightgreen
	pack .f  -padx 2 -pady 2   -expand true -fill both
	
	label .f.onglet -justify left -width 15 -height 1 -textvariable nomOnglet -relief sunken
	pack .f.onglet -side left
	
	#frame du texte et de ses scrollbar
	
	frame .ft -bg ivory
	pack .ft  -padx 2 -pady 2   -expand true -fill both

 	scrollbar .ft.scrollx -orient horizontal -command ".ft.texte$nomDocument xview"
 	scrollbar .ft.scrolly -orient vertical -command ".ft.texte$nomDocument yview"
	
  	text .ft.texte$nomDocument -width 80 -height 35  -xscrollcommand  ".ft.scrollx set"  -yscrollcommand ".ft.scrolly set"
	
  	pack .ft.scrollx  -side bottom -fill x
	pack .ft.texte$nomDocument -side left -expand 1 -fill both
  	pack .ft.scrolly  -side right -fill y
	
	 .ft.texte$nomDocument insert 0.0 "  page par defaut  inutilisable "	
	#neutralisatoin de la page defaut 
	.ft.texte$nomDocument configure  -background gray  -state disable
	
#<BARRE_MENUS>
		menu .menubar -activebackground LemonChiffon 
		. config -menu .menubar 
		
		option add *Menu.activeBackground gray 
		
		
  		foreach m { Fichier Recherche Pages Césure Analyse Aide} {
			set $m [ menu .menubar.m$m -tearoff 1]
		
			  .menubar add cascade -label $m -menu .menubar.m$m
					}
#<MENUScLASSIQUE>  
	.menubar.mFichier add command -label "ouvrir" -command "ChargerTexte   .ft.texte"
	.menubar.mFichier add command -label "nouveau" -command  NouveauDocument
	.menubar.mFichier add command -label "fermer"  -command "Fermer ft.texte$nomDocument"
	.menubar.mFichier add command -label "QUITTER " -command "exit" 
	
	.menubar.mRecherche add command -label "rechercher " -command  ChoisirMot 
	
	#on crée une nouvelle entrée dans le menu "fichier defaut"
	.menubar.mPages add command -label $nomDocument  -command   		"NomPages $nomDocument "
	
	#réglages fins de lignes
	.menubar.mCésure add command -label "aucune" -command { .ft.texte$nomDocument configure -wrap none -setgrid 1 }
	.menubar.mCésure add command -label "lettre" -command { .ft.texte$nomDocument configure -wrap char -setgrid 1}
	.menubar.mCésure add command -label "mot" -command  {.ft.texte$nomDocument configure -wrap word -setgrid 1}

	#menu analyse
	.menubar.mAnalyse add command -label "Mots par nombres" -command {NombresMotsN  .ft.texte$nomDocument }
	.menubar.mAnalyse add command -label "Mots par tri alpha " -command {NombresMotsAlpha  .ft.texte$nomDocument }

	#menu aide 
	.menubar.mAide add command -label "Aide " -command {AidePagitor }
	.menubar.mAide add command -label "à propos " -command {Apropos }
	
	#---- FIN DES MENUS 
	
proc AidePagitor {} {
	
destroy .aide
toplevel .aide    -borderwidth 3
frame .aide.f 
pack .aide.f -expand 1
text  .aide.f.aidePagitor -background AliceBlue  -wrap word -xscrollcommand  ".aide.f.scrollx  set"  -yscrollcommand ".aide.f.scrolly set" -width 50
	
 scrollbar .aide.f.scrollx -orient horizontal -command ".aide.f.aidePagitor xview"
 scrollbar .aide.f.scrolly -orient vertical -command ".aide.f.aidePagitor yview"

pack .aide.f.scrollx -side bottom -fill x 
pack  .aide.f.aidePagitor -fill both -side left
pack  .aide.f.scrolly -side right -fill y

.aide.f.aidePagitor insert end "AIDE POUR PAGITOR
       ****
Ce logiciel libre permet 
	* de charger des textes, 
	* d'y rechercher des portions de texte, 
	* de compter les mots 
	* de  les afficher selon l'ordre alphabétique ou selon le nombre d'occurences.
	
Menu Recherche

	L'appel de ce menu permet d'ouvrir une nouvelle fenêtre offrant un large choix de recherches. Une aide particulière est disponible à partir de cette fenêtre appelée TopMots.
	Ce module intègre les routines du logiciel Occurences du même auteur.
	
Menu Pages

	On peut ouvrir plusieurs textes en même temps avec Pagitor. Ce menu permet de passer de l'un à l'autre.
	
Menu Césure

	Le choix est possible entre 
		* aucune césure, les lignes ne sont pas coupées.
		* retour à la ligne après un mot entier
		* retour à la ligne après un caractère quelconque
	Par défaut et au réaffichage, le choix de la césure se fait au niveau des mots entiers.
		
Menu Analyse

	les mots sont comptés dans le texte. on peut afficher le résultat dans une nouvelle fenêtre selon :
		* l'ordre alphabétique
		* le nombre croissant d'occurences.
		
Menu Aide
	Ce menu ouvre cette fenêtre d'aide.
	
		****
	
"
	}
	
proc Apropos {}  {
	tk_messageBox -message " à propos de pagitor\n \n    ****\n auteur Daniel Macouin\n    version 1.1\n    2025 \n logiciel libre"
	}
	
proc ChargerTexte {okurence} {
 		global nomDocument 
global ancienNomDocument
global fichiers
global nomOnglet

		
		#on va ouvrir un fichier et récupérer son nom dans la variable nomDocument
		#avec ce nom on va ajouter une entrée dans le menu "Pages"
 set choix [ tk_getOpenFile -title "MULE-MENU  : 0uvrir"]
		  if [ catch { open $choix } FIC ] {
		  tk_messageBox -type ok -icon warning \
			  -message "Impossible d'ouvrir le fichier $choix"
		  return 1
		} else {
	# on oublie l'affichage du document en cours
 	 pack forget .ft.texte$nomDocument

	#et on mémorise son nom dans la variable "ancienDocument" qui sera transmise plus tard à une nouvelle procédure 	quand on sélectionnera un nouveau document depuis le menu "fichiers".
	set ancienNomDocument $nomDocument
		set nomDocument [file rootname [file tail $choix]]
		  set contenu [ read -nonewline $FIC ]

	# on met à jour l'onglet de page
	set nomOnglet $nomDocument
	
	#on crée le nouveau document
	text .ft.texte$nomDocument -width 80 -height 35 -xscrollcommand  ".ft.scrollx  set"  -yscrollcommand  ".ft.scrolly set" -background ivory -wrap none 

		  regsub -all {\ {4}} $contenu "\t" contenu
		 .ft.texte$nomDocument insert 0.0 $contenu
		   		
		  close $FIC
		
		#on prend le nom du fichier sans son chemin ni son extension et on l'inscrit dans le tableau "fichiers" à la fois en tant que clé et que valeur
		# ce qui permettra en récupérant la valeur du label du menu fichier de réafficher la zone texte de ce fichier.
		set fichiers($nomDocument) $nomDocument
		# on crée la sous-commande du menu fichiers avec comme label le nom du fichier chargé.
		.menubar.mPages add command -label $nomDocument  -command   		"NomPages $nomDocument "
		# on oublie l'affichage du document en cours
 		 pack forget .ft.texte$ancienNomDocument

 #on affiche le document ouvert et les scrollbars afférents.  
	destroy .ft.scrollx 
	destroy .ft.scrolly
	
	scrollbar .ft.scrollx -orient horizontal -command ".ft.texte$nomDocument xview  " 
	scrollbar .ft.scrolly -orient vertical -command ".ft.texte$nomDocument  yview "
	
 	pack .ft.scrollx -side bottom -fill x
		pack .ft.texte$nomDocument -side left -expand 1 -fill both 
 	pack .ft.scrolly -side right -fill y
	
	
	set ancienNomDocument $nomDocument
	
	.ft.texte$nomDocument configure -wrap word -setgrid 1 
	
	# on supprime l'éventuel toplevel de occurence 
	destroy .topMot 	; #ferme la fenêtre précédemment ouverte
	
	
		  return 0
		}
	  }


#<NOM_PAGE>

proc  NomPages {nomTexte } {

#ATTENTION, cette procédure gère les pages déjà créées, donc on ne peut pas en créer ici, seulement les "oublier" ou les réafficher par "pack".

		global fichiers
		global ancienNomDocument	
		global nomDocument
		global nomOnglet
		
		set nomDocument $nomTexte

 		set sortie [array get fichiers] 

# on met à jour l'onglet de page
	set nomOnglet $nomDocument

#on oublie le texte en cours et ses ascenceurs 
	destroy .ft.scrollx 
	destroy .ft.scrolly

	pack forget .ft.texte$ancienNomDocument 

#on affiche le nouveau texte sélectionné et ses ascenceurs
	
	scrollbar .ft.scrollx -orient horizontal -command ".ft.texte$nomDocument xview " 
	scrollbar .ft.scrolly -orient vertical -command ".ft.texte$nomDocument  yview "
	
 	pack .ft.scrollx -side bottom -fill x
		pack .ft.texte$nomDocument -side left -expand 1 -fill both 
 	pack .ft.scrolly -side right -fill y

	set ancienNomDocument $nomDocument
	
	.ft.texte$nomDocument configure -wrap word -setgrid 1  

	# on supprime l'éventuel toplevel de occurence 
	destroy .topMot 	; #ferme la fenêtre précédemment ouverte
	
		}
		
proc NouveauDocument { } {
	
	global numNouveau 
	
	global nomOnglet

	global nomDocument
	set nomDocument "nouveau"
	
	global ancienNomDocument

	global fichiers 
	
	set clefs [array names fichiers]

	set fichiers(nouveau$numNouveau) nouveau$numNouveau
	set nomDocument "nouveau$numNouveau"
	
	incr  numNouveau
	
	# on met à jour l'onglet de page
	set nomOnglet $nomDocument
	
	# on supprime l'éventuel toplevel de occurence 
	destroy .topResultat 	; #ferme la fenêtre précédemment ouverte
	
	#création d'une page "nouveau"
 	text .ft.texte$nomDocument  -width 80 -height 35 -xscrollcommand  ".ft.scrollx  set"  -yscrollcommand  ".ft.scrolly set" -background pink

	#on crée une nouvelle entrée dans le menu "fichier"
	.menubar.mPages add command -label $nomDocument  -command   		"NomPages $nomDocument "
		
		#onappelle la procédure générale de création d'entrée	 
		NomPages $nomDocument
}

proc Fermer { widtexte } {

	global numNouveau 
	
	global nomOnglet

	global nomDocument
	
	global ancienNomDocument

	global fichiers 
	
 		
		# on détruit la fenetre en cours
		  destroy .ft.texte$nomDocument
		
		 		
		#on supprime l'entrée du menu Pages
		.menubar.mPages delete $nomDocument 
				  
		set nomDocument defaut


		# on met à jour l'onglet de page
			set nomOnglet $nomDocument
			
			
		# on réaffiche la page defaut en revenant à la procédure NomPages avec le paramètre "defaut"
	NomPages $nomDocument

	  }
	
	  

######################################################################

	  ###########################################################################
	  #	# LES ROUTINES d' "OCCURRENCES "
	  ###########################################################################
 #<Occurences>

 # la variable global widtexte est nécessaire. 
 # Elle désigne le widget text dans lequel il faut rechercher la suite de mots indiqués. 
 # dans cet exemple se sera le widget " text" nommé .ft.texte
 # la valeur de widtexte est définie par le logiciel hôte, 
 #ici ce sera le widget ".texte" auquel on adjoint le contenu de la variable globale "nomDocument"


	global widtexte
	set widtexte .ft.texte$nomDocument 

	
proc OuvrirAide {aide}  {
	tk_messageBox -message " AIDE  pour OCCURRENCES \n$aide"
	}
	
proc OuvrirAideRegExp {aide} {
		destroy .topRG
		# création d'une fenêtre pour les expressions régulières
		toplevel .topRG
		set largeurEcran [ winfo screenwidth . ]
		wm geometry .topRG +[expr ${largeurEcran}/2]+60
		text .topRG.fenRG -wrap none  -bg beige  -fg black\
			-tabs {1c} -font "Helvetica 10"	-yscrollcommand ".topRG.sy set" -xscrollcommand ".topRG.sx set" -relief groove  -cursor "hand1"
		scrollbar .topRG.sy -orient vertical -command ".topRG.fenRG yview" -cursor hand2
		scrollbar .topRG.sx  -orient horizontal -command ".topRG.fenRG xview" -cursor hand2
		
		pack .topRG.sx -fill x  -side top
		pack .topRG.sy -fill y -side left
		pack .topRG.fenRG -expand false -fill both -side left
		
		.topRG.fenRG insert 1.0 $aide
	
		.topRG.fenRG configure -state disabled
		bind .topRG <3> {destroy .topRG}
		
	  }
	  
proc ChoisirMot {} {
	
	#les lignes qui suivent servnet à l'intégraton des routines de Occurence dans "MuleMenu"	 et doivent être adaptée pour une utilisation de Occurence dan sun autre script.
		global nomDocument
		global widtexte
		set widtexte .ft.texte$nomDocument 
	
	if {$widtexte == ".ft.textedefaut"} {
	tk_messageBox -message "recherche impossible dans la page defaut"
	 } else {Occurence		
		} 
	}


proc Occurence {} {

global nomDocument
	
global widtexte
	set widtexte .ft.texte$nomDocument 

	catch [destroy .topMot ]	; #ferme la fenêtre précédemment ouverte
		toplevel .topMot	; #ouvre la fenêtre de recherche
		set largeurEcran [ winfo screenwidth . ]
		wm geometry .topMot +[expr ${largeurEcran}-350]+60

 #----------------------------------------
		
		variable fichierAideRegExp {
	Aide mémoire sur les 
		
 EXPRESSIONS REGULIERES
 *************************************

 ________________________
 SYNTAXE
 regexp ?option? motif chaine ?variables?
 ________________________
 options
	-about	informations sur l'expression régulière
	-all	  recherche toutes les occurences du motif défini
	-expanded la syntaxe développée est acceptée
	-indices  retourne la position des occurences trouvées
	-inline   les résultats sont retournés sous forme de liste
	-lineanchor ancrage aux extrémités des lignes
	-linestop  pas de correspondances sur plusieurs lignes
	-line	  recherche ligne par ligne
	-nocase	  recherche sans tenir compte de la casse des caractères
	-start	  recherche à partir de l'indice défini
	--	  fin des options
 ________________________
 METACARACTERES

 .	n'importe quel caractère, sauf fin de ligne
 []	n'importe quel caractère entre crochets
 *	zéro ou plusieurs fois
 +	une ou plusieurs fois
 ?	zéro ou une fois
 ^	1)en début d'expressio : début de ligne
	2) entre crochet : pas les caractères entre crochets
 $	fin de ligne
 \	caractère modifiant le sens du caractère qui le suit
 ()	sert à grouper des sous expressions
 |	ou d'alternative propre à regexp
 ________________________
 LES "ECHAPPEMENTS"

 \a	bip interne
 \b	retour arrière
 \f	saut de page
 \n	saut de ligne
 \r	retour chariot
 \t	tabulation horizontale
 \v	tabulation verticale
 \B	contre-oblique \

 \d	nombre entier
 \s	espace
 \w	lettre, chiffre ou _
 \D	tout sauf un nombre
 \S	tout sauf une espace
 \W	tout sauf lettre chiffre ou _

 \m	debut de mot
 \M	fin de mot
 \y	extrémité de mot
 \Y	pas une extrémité de mot
 \A	début de chaine
 \Z	fin de chaine

 \e	séquence ESC (octal: 033)
 \0	zéro octet nul
 \xy	code octal 0xy
 \xyz	code octal xyz
 \xhhh	code hexadécimal 0xhhh
 \uxxxx Unicode U+xxxx
 \Uxxxxxxxx Unicode U+xxxxxxxx
 \cX	mise à zéro des 3 bits forts de X

 a-z	tout caractère alpha minuscule
 A-Z	tout caractère alpha majuscule
 ___________________________
 LES CLASSES

 [:alpha:]	lettres alpha
 [:upper:]	lettres majuscules
 [:lower:]	lettres minuscules
 [:digit:]	chiffre 0 à 9
 [:xdigit:]	nombre hexadécimal
 [:alnum:]	alphanumérique
 [:print:]	caractère affichable
 [:blank:]	espace ou tabulation
 [:space:]	espace
 [:punct:]	tout caractère de ponctuation
 [:graph:]	tout caractère imprimable
 [:cntrl:]	caractère non imprimable


 ======================== }

 #-------------------------------------------------
		
		
		variable fichierAide 		"Saississez le mot ou la portion de phrase que vous recherchez dans le texte.
		Des options permettent de  préciser votre recherche.
		
		Après avoir lancé la recherche, un deuxième volet s'ouvre à droite du tableau de commande. les résultats sont affichés.
		En positionnant le curseur de la souris sur une de ces lignes, une bulle apparait contenant le paragraphe où se trouve cette occurrence du motif recherché.
		Un clic gauche sur la ligne positionne le paragraphe dans la fenêtre principale.
		
		Tant que la fenêtre de recherche n'est pas refermée, le début des occurrences est marqué par un point jaune. 
		Un clic droit dans la fenêtre de recherche la referme, et le surlignage jaune disparait."
#-------------------------------------------------
	
		frame .topMot.f	
		button .topMot.f.boutonAide -text Aide -bg beige -fg red -command {variable fichierAide ; OuvrirAide $fichierAide} 
		button .topMot.f.boutonAideRegExp  -text "Aide memoire RegExp" -bg beige -fg red -command {variable fichierAideRegExp ; OuvrirAideRegExp $fichierAideRegExp} 
	
	
		label .topMot.label1 -text "Saisissez la phrase à rechercher :"  -height 2 -fg black -width 35 -font {-size 8}  -bg beige -justify left
		entry .topMot.entreMot  -textvariable motRecherche -font {-size 12} -bg ivory -justify left
		checkbutton .topMot.ch1 -text "Différencier Maj/Min" -variable majmin -onvalue 1 -offvalue 0 -font {-size 12} -bg beige -justify left
		checkbutton .topMot.ch2 -text "Expression Régulière" -variable expressRegul -onvalue 1 -offvalue 0 -font {-size 12} -bg beige -justify left
		checkbutton .topMot.ch3 -text "Dans texte caché	" -variable texteCache  -onvalue 1 -offvalue 0 -font {-size 12} -bg beige -justify left
		
		radiobutton .topMot.ch4 -text "Après curseur	" -variable wards  -value forwards -font {-size 12} -bg beige -justify left
		radiobutton .topMot.ch5 -text "Avant curseur	" -variable wards  -value backwards  -font {-size 12} -bg beige -justify left
		radiobutton .topMot.ch6 -text "Tout le texte	" -variable wards  -value 0  -font {-size 12} -bg beige -justify left
		radiobutton .topMot.ch7 -text ".ft.texte sélectionné" -variable wards  -value selection  -font {-size 12} -bg beige -justify left
		
		button .topMot.ok -text "lancer la recherche" -bg beige -fg blue -font {-size 12} -bd 5 -relief raise \
			 -command { AfficheListeOccurences $widtexte $motRecherche $wards .ft.texteCache $majmin $expressRegul  } -justify left
	
	grid .topMot.f -column 1 -row 0 -padx 3 -sticky ew
		#grid .topMot.boutonAide -column 1 -row 0 -padx 3 -sticky ew
		grid .topMot.label1   -column 1 -row 1 -padx  3 -sticky ew
		grid .topMot.entreMot -column 1 -row 2 -padx 3 -sticky ew
		grid .topMot.ch1 -column 1 -row 3 -padx 3 -sticky ew
		grid .topMot.ch2 -column 1 -row 4 -padx 3 -sticky ew
		grid .topMot.ch3 -column 1 -row 5 -padx 3  -sticky ew
		grid .topMot.ch4 -column 1 -row 6 -padx 3  -sticky ew
		grid .topMot.ch5 -column 1 -row 7 -padx 3  -sticky ew
		grid .topMot.ch6 -column 1 -row 8 -padx 3  -sticky ew
		grid .topMot.ch7 -column 1 -row 9 -padx 3  -sticky ew
		grid .topMot.ok  -column 1 -row 10 -padx 3 -sticky ew
		
		pack .topMot.f.boutonAide .topMot.f.boutonAideRegExp -side left -fill x -expand 1
		
		bind .topMot <3> {destroy .topMot }
		
	  }
	  

proc RechercherElement { widtexte element wards texteCache minMaj expressRegul } { 
 
		
		variable ListeOccurences
		
		 set indices [ $widtexte tag ranges sel ]
		  if { [llength $indices] == 0  } {
		  set debut 1.0
		  set fin end
		} else {
		  	set indices [ $widtexte tag ranges sel ]
		 	set debut [$widtexte index  [lindex $indices 0]]
			set fin [$widtexte index  [lindex $indices 1]]
			  }
		  
		
		$widtexte tag remove  surligner 1.0 end
		
	
		#différenciation des majuscules et des minuscules
		if {$minMaj == 1} {
		set  casse ""
		} else {
		 set casse "-nocase"
		}
		# recherche avec ou sans expression régulière
		set ListeOccurences ""
		if {$expressRegul==1} {
		  set com "-regexp $casse \{$element\}"
		} else {		  
		  set com \"$element\"
		}
		
		#recherche avec ou sans texte caché
		if {$texteCache == 1} {
			set masque "-elide"
		} else {
			set masque ""
		}
		
		#sens de la recherche
				
		switch $wards forwards {set debut [$widtexte index insert] ; set fin end  }
		switch $wards backwards {set fin [$widtexte index insert] ;set debut 1.0 }
		switch $wards 0 {set fin end  }
		switch $wards "" {set debut 1.0 ; set fin end  }
		switch $wards "selection" {set debut $debut ; set fin $fin  }
		
		# boucle de recherche enregistrant les indices d'occurences dans une liste "ListeOccurences"
		while 1 {
		  set lacom "$widtexte search $casse $masque -count longueur $com  \"$debut\" \"$fin\" "
		  set indice [eval $lacom]
		  if {$indice==""} { break }
		  lappend ListeOccurences $indice
		  set debut "$indice + $longueur char"
		}
		
	
	}
	
	
proc AfficheListeOccurences { widtexte element wards texteCache majmin expressRegul} {
		variable ListeOccurences
		
				
		destroy .topMot.fenoccs
		destroy .topMot.occssy
		scrollbar .topMot.occssy -orient vertical -command ".topMot.fenoccs yview" -cursor "hand2"
		text  .topMot.fenoccs -wrap word -bd 6 -relief raised -bg lavender -fg black \
			-tabs {1c} -font "Helvetica 12" -height 18 -yscrollcommand ".topMot.occssy set" -width 40 -cursor "hand1"
		
		
		
	
		
		RechercherElement $widtexte $element $wards .ft.texteCache $majmin $expressRegul
		
		grid .topMot.fenoccs  -row 1 -column 2 -rowspan 10
		grid .topMot.occssy -row 1 -column 3 -rowspan 10 -sticky ns
		
		# lancement de la boucle d'affichage dans la fenêtre crée à la ligne ci-dessus
		set compteur 0
		if {[llength $ListeOccurences]!=0} {
		  foreach el $ListeOccurences {
			
			set ligneOccurence "... ligne N° $el ème caractère..." ;# $el est un indice text (ex : 10.5 ) N°ligne.N°caractère
			
			$widtexte tag add surligner $el
			$widtexte tag configure surligner -background yellow
			
			.topMot.fenoccs insert end "Occurence $compteur : $ligneOccurence"
			.topMot.fenoccs tag add $compteur "current linestart" "current lineend"
			.topMot.fenoccs tag configure $compteur -foreground blue -underline 1
			.topMot.fenoccs tag bind $compteur <1> "$widtexte see $el ;destroy .topBulleOccurence "
			
			.topMot.fenoccs tag bind $compteur <Enter> ".topMot.fenoccs tag configure $compteur -background AntiqueWhite  -foreground blue -underline 1 ; BulleOccurence $widtexte $el"
			.topMot.fenoccs tag bind $compteur <Leave> " .topMot.fenoccs tag configure $compteur -background  lavender  ; destroy .topBulleOccurence "
			
			.topMot.fenoccs insert end \n
			incr compteur
			
			
		  }

		}
		.topMot.fenoccs insert 1.0 "$compteur occurence(s) de \"$element\"\n\n"
		
		bind .topMot.fenoccs <3> {	destroy .topBulleOccurence  ;	destroy .topMot	; $widtexte tag remove "surligner" 1.0 end }
	  }
	  
proc BulleOccurence { widtexte indice} {
		toplevel .topBulleOccurence
		text .topBulleOccurence.texte   -bg White -fg tomato -relief raised -borderwidth 2 -wrap word -width 45
		
		wm overrideredirect .topBulleOccurence  1 ; # supprime la barre de titre
		set x [ winfo pointerx . ]
		set y [ winfo pointery . ]
		wm geometry .topBulleOccurence  +[expr $x + 10]+[expr $y - 10]
		
		set contenuLigneOccurence [ string trimleft [$widtexte get "$indice linestart" "$indice  lineend" ] " \t"]
		set contenuLigneOccurence [ string trimright $contenuLigneOccurence " " ]
		.topBulleOccurence.texte insert end $contenuLigneOccurence
		pack .topBulleOccurence.texte
		.topBulleOccurence.texte configure -height [expr [string length $contenuLigneOccurence] / 45 + 1] 
		
	  }
	
		  
#<STATISTIQUES_N>
proc NombresMotsN {nomDoc} { 
variable nOkur 1

	# suppression de la ponctuation pour isoler les mots

	set T [string tolower [$nomDoc get 0.0 end]]

	set T [string map {\. " " \? " " \; " " , " " \! " " \" " "  ' " " \( " " \) " " - " " _ " " « " " » " "  : " " — " " ’ " " … " " ¿ " " ¡ " "} $T		]	


	#il faut transformer le texte en list pour avoir des mots.
	
		set TL [split $T ]
		
		set TLalpha [lsort $TL]
		
	# comptage des occurences de chaque mot.
	
	#index de fin
	set fin [llength $TL]
	
	#valeur du premier mot
	set mot [ lindex $TL  0]

	variable motsDifferents
	
	# on parcours la liste ordonnée pour compter les doublons
	
	for {set i  0 ; set  nOkur 1} { $i <= $fin} {incr i} {

		if { [string compare  [ lindex $TLalpha   [expr $i +1] ] [ lindex $TLalpha $i] ] == 0 } { 
			incr nOkur
			set mot  [lindex $TLalpha [expr $i +1]]  
			set analyse($mot) $nOkur 


	} else {
	set nOkur 1
		incr motsDifferents
		set mot  [lindex $TLalpha [expr $i +1]] 
	
		set analyse($mot) $nOkur 
		}
	}
			
#remise à zéro pour une nouvelle recherche
set nbmots $motsDifferents 
set motsDifferents 0

#affichage dans une fenêtre nouvelle
	#on supprime les entrées vides dans le tableau "analyse"
	array unset analyse ""
	#on recueuille les valeurs et les clés du tableau dan sune liste TR
	set TR [array get analyse]
	
	#on trie par nombres d'occurences 

 	foreach {clef valeur } $TR {lappend TRA " $clef $valeur " }
 set TRB [lsort -increasing $TRA]

# appel de la proc "afficher"
afficher $TRB  $nbmots

}


 ###################################

proc afficher {ana nbmots} {

destroy .topResultatN 

toplevel .topResultatN  -menu menuR -bg yellow -borderwidth 3
frame .topResultatN.f 
pack .topResultatN.f -expand 1
text  .topResultatN.f.texteR -background aquamarine -wrap word -xscrollcommand  ".topResultatN.f.scrollx  set"  -yscrollcommand ".topResultatN.f.scrolly set" -width 50
	
 scrollbar .topResultatN.f.scrollx -orient horizontal -command ".topResultatN.f.texteR xview"
 scrollbar .topResultatN.f.scrolly -orient vertical -command ".topResultatN.f.texteR yview"

pack .topResultatN.f.scrollx -side bottom -fill x 
pack  .topResultatN.f.texteR -fill both -side left
pack  .topResultatN.f.scrolly -side right -fill y

#tri par occurence
set ana [lsort  -integer -index 1 $ana]

##
 .topResultatN.f.texteR insert 0.0 $ana
 .topResultatN.f.texteR insert 0.0 " TRI PAR NOMBRES D'OCCURENCES \nIl y a $nbmots mots différents dans le texte : \n\n   MOT   NOMBRE D'OCCURENCES \n\n "

#affichage saut de lignes
 #recupération du texte  affiché
set R [.topResultatN.f.texteR get 0.0 end]

#récriture dans le "text" après l'avoir vidé
# les mots apparaissent selon leur fréquence et parmi ceux-là par ordre alphabétique. 

.topResultatN.f.texteR  delete  @0,0  end  

set R [regsub -all {\}} $R "\n"]
set R [regsub -all {\{} $R "𐏐 "]
	#£ tk_messageBox -message "RegSub = $R"
.topResultatN.f.texteR insert 0.0 $R

}

###################################

#<ANALYSE_ALPHA>

proc NombresMotsAlpha {nomDoc} { 
variable nOkur 1

	# suppression de la ponctuation pour isoler les mots

	set T [string tolower [$nomDoc get 0.0 end]]

	set T [string map {\. " " \? " " \; " " , " " \! " " \" " "  ' " " \( " " \) " " - " " _ " " « " " » " "  : " " — " " ’ " " … " " ¿ " " ¡ " "} $T		]	


	#il faut transformer le texte en list pour avoir des mots.
	
		set TL [split $T ]
		
		set TLalpha [lsort $TL]
		
	# comptage des occurences de chaque mot.
	
	#index de fin
	set fin [llength $TL]
	
	#valeur du premier mot
	set mot [ lindex $TL  0]

	variable motsDifferents
	
	# on parcours la liste ordonnée pour compter les doublons
	
	for {set i  0 ; set  nOkur 1} { $i <= $fin} {incr i} {

		if { [string compare  [ lindex $TLalpha   [expr $i +1] ] [ lindex $TLalpha $i] ] == 0 } { 
			incr nOkur
			set mot  [lindex $TLalpha [expr $i +1]]  
			set analyse($mot) $nOkur 


	} else {
	set nOkur 1
		incr motsDifferents
		set mot  [lindex $TLalpha [expr $i +1]] 
	
		set analyse($mot) $nOkur 
		}
	}
			
#remise à zéro pour une nouvelle recherche
set nbmots $motsDifferents 
set motsDifferents 0

#affichage dans une fenêtre nouvelle
	#on supprime les entrées vides dans le tableau "analyse"
	array unset analyse ""
	#on recueuille les valeurs et les clés du tableau dan sune liste TR
	set TR [array get analyse]
	
	#on trie par nombres d'occurences 

 	foreach {clef valeur } $TR {lappend TRA " $clef $valeur " }
 set TRB [lsort -increasing $TRA]

# appel de la proc "afficher"
afficherAlpha $TRB  $nbmots

}


 ###################################

proc afficherAlpha {ana nbmots} {

destroy .topResultat 

toplevel .topResultat  -menu menuR -bg yellow -borderwidth 3
frame .topResultat.f 
pack .topResultat.f -expand 1
text  .topResultat.f.texteR -background aquamarine -wrap word -xscrollcommand  ".topResultat.f.scrollx  set"  -yscrollcommand ".topResultat.f.scrolly set" -width 50
	
 scrollbar .topResultat.f.scrollx -orient horizontal -command ".topResultat.f.texteR xview"
 scrollbar .topResultat.f.scrolly -orient vertical -command ".topResultat.f.texteR yview"

pack .topResultat.f.scrollx -side bottom -fill x 
pack  .topResultat.f.texteR -fill both -side left
pack  .topResultat.f.scrolly -side right -fill y


##
 .topResultat.f.texteR insert 0.0 $ana
 .topResultat.f.texteR insert 0.0 " TRI ALPHABETIQUE\nIl y a $nbmots mots différents dans le texte : \n\n   MOT   NOMBRE D'OCCURENCES \n\n "

#affichage saut de lignes
 #recupération du texte  affiché
set R [.topResultat.f.texteR get 0.0 end]

#récriture dans le "text" après l'avoir vidé
# les mots apparaissent selon leur fréquence et parmi ceux-là par ordre alphabétique. 

.topResultat.f.texteR  delete  @0,0  end  
.topResultat.f.texteR configure -bg tan 
set R [regsub -all {\}} $R "\n"]
set R [regsub -all {\{} $R "𐏐 "]
	#£ tk_messageBox -message "RegSub = $R"
.topResultat.f.texteR insert 0.0 $R

}

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