#  (gH)   -_-  alldsc.pl  ;  TimeStamp (unix) : 20 Octobre 2005 vers 11:28

$version = "3.7" ;
print " alldsc (gH) ; version $version \n" ;

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

# ceci n'est pas un IPOD !

=head1 NAME

alldsc : tous les fichiers descriptifs du répertoire

=head1 DESCRIPTION

ce programme met en forme la liste de tous les fichiers descriptifs du répertoire
(fichiers dont l'extension est DSC, en majuscule, minuscule ou mixte)
pour le rapport hebdomadaire du comité de direction.

la mise en forme aboutit à un fichier RTF.

=cut

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

 use File::stat;
 use Time::localtime;

 # pour un affichage 'à la française' sans passer par les "LOCALE"

 %lstmois = ("Jan","Janvier","Feb","Février","Mar","Mars","Apr","Avril","May","Mai","Jun","Juin",
             "Jul","Juillet","Aug","Août","Sep","Septembre","Oct","Octobre","Nov","Novembre","Dec","Décembre") ;

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

# y a-t-il eu un paramètre de passé ?

if ($#ARGV==-1) {
        # non ! on le dit et on rappelle la syntaxe avant de sortir
        print "\n" ;
        print "   Mais... vous n'avez pas indiqué où chercher les fichers descriptifs !\n\n" ;
        print "   La syntaxe est : alldsc LIEU\n\n" ;
        print "   - si vous êtres sous Windows, il faut écrire donc quelque chose comme : \n\n" ;
        print "        alldsc K:\Stat_Ad\ \n\n" ;
        print "   - si vous êtres sous Linux, il faut écrire quelque chose comme : \n\n" ;
        print "        alldsc ~/Cours/Stockage/ \n\n" ;
        print "   - dans les deux cas, pour chercher à l'endroit où vous êtes, il faut écrire : \n\n" ;
        print "        alldsc .\n" ;
        print "\n" ;
        exit(-1) ;
} ; # fin de si

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

# si nous sommes arrivés ici, c'est qu'il y avait un paramètre :
# on le complète éventuellement par le symbole slash pour indiquer qu'il s'agit d'un répertoire

$lieu = $ARGV[0] ;
if (substr($lieu,-1,1) ne "/") { $lieu .= "/" ; } ;

# on efface éventuellement le fichier de sortie et ouvre le "fhandle"

$fs = "alldsc.rtf" ;
unlink($fs) if -M $fs ;
open(FRTF,">$fs") or die ("impossible d'écrire dans $fs") ;

# début (fixe) du fichier RTF

print FRTF << 'DEBUT_RTF' ;
{\rtf1
{\fonttbl
{\f0\fswiss Arial;}
{\f1\fmodern Courier New;}
}
{\stylesheet
{\s0 Nom de liste;}
{\s1 Description de fichier;}
}
\pard\plain\lang1036
DEBUT_RTF

# construction de la liste des fichiers

opendir(DSCDIR, $lieu) || die " je ne peux pas ouvrir le répertoire $lieu\n\n";
@listefic = readdir(DSCDIR);
closedir DSCDIR;

# la date courante correspond au fichier RTF de sortie

$belledate = &ageFichier("",$fs) ;

# on passe la liste en revue pour ne retenir que les fichiers dont l'extension
# aboutit à dsc en maju, minu ou mixte

foreach $idf (@listefic) {
  push(@lstdsc,"$idf") if ($idf =~ /\.dsc$/i) ;
} ; # fin pour idf

# on calcule le nombre de pages

$nbFic         = $#lstdsc ;
$lignesParpage = 50 ;
$nbPages       = int( $nbFic / $lignesParpage ) ;
$nbPages      += 1 if $nbFic % $lignesParpage ;
$nbPages      *= 2 ; # car on a deux listes

# on écrit le premier numéro de page
$numPage       = 1 ;
&ecritNumerodePage() ;

## print " $nbFic fichiers donc $nbPages pages\n" ;

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

print "\n   # préparation de la liste par ordre alphabétique direct\n" ;
print FRTF "\\par\\s0\\f0\\fs28\{\\b Liste alphabétique des fichiers au $belledate\}\n" ;

# l'instruction suivante (en commentaire) est sans doute plus rapide à l'exécution
# foreach $nomfic (sort igncas @lstdsc) {
# mais celle-ci est plus explicite :

$nbfdsc = 0 ;
foreach $nomfic (sort { lc($a) cmp lc($b) } @lstdsc) {
  &montreFichierEnRtf(++$nbfdsc,$nomfic) ;
} ; # fin pour $nomfic

# on insère un saut de page (ce qui augmente le numéro de page courante)

&nouvellePage() ;

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

print "\n   # préparation de la liste par age croissant \n" ;
print FRTF "\\par\\s0\\f0\\fs28\{\\b Liste par date des fichiers au $belledate\}\n" ;

# on complète chaque nom de fichier avec le lieu
# et on stocke devant la date en jours ; pour éviter
# les ex-aequo, on ajoute le nom du fichier en bout de date

@nltdsc = map { ( -M "$lieu$_" , $_ ) } @lstdsc ;

# conversion en table de hachage

%lstdat  =  @nltdsc ;

# affichage trié : il ne faut pas oublier de
# forcer le tri en numérique à cause des noms
# de fichier en bout de date.

$nbfdsc = 0 ;
foreach $datfic (sort { $b <=> $a } keys %lstdat) {
  &montreFichierEnRtf(++$nbfdsc,$lstdat{$datfic}) ;
} ; # fin de tant que sur datfic

# on finit le fichier RTF et on le ferme

print FRTF << 'FIN_RTF' ;
{\par }
}
FIN_RTF

close(FRTF) ;

# sortie normale du programme

print "\n vous pouvez utiliser le fichier $fs\n\n" ;
exit(0) ;

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

# sous programme pour bien afficher les fichiers

sub montreFichierEnRtf {
     local ($numf,$nomf) = @_ ;
     $ligne = sprintf(" %3d.  %-25s  ",$numf,uc($nomf)).&ageFichier($lieu,$nomf)."   $nomf\n" ;
     print FRTF "\\par\\s1\\f1\\fs22\{$ligne\}\n" ;
     &nouvellePage() unless ($numf % $lignesParpage) ;
} ; # fin sub montreFichierEnRtf

# gestion de l'age du fichier
# http://www.perl-gratuit.com/traduction/docfr/perllocale.html

sub ageFichier {
  local ($mlieu,$nomf) = @_ ;
  $agefichier   = ctime(stat("$mlieu$nomf")->mtime) ;
  @ageinfos     = split(/\s+/,$agefichier) ;
  $jour         = sprintf("%3d",$ageinfos[2]) ;
  $mois         = sprintf("%-10s",$lstmois{$ageinfos[1]}) ;
  $an           = $ageinfos[4] ;
  $agelisible   = "$jour $mois $an" ;
  return($agelisible) ;
} ; # fin sub ageFichier

# fonction de tri pour les noms de fichier
# on IGNore la CASse majuscule ou minuscule

sub igncas { lc($a) cmp lc($b) } ;

# pour gérer rapidement les numéros de page

sub ecritNumerodePage {
    print FRTF "{page $numPage sur $nbPages}\n" ;
} ; # fin sub ecritNumerodePage

# gestion du saut de page

sub sautDePage {
    print FRTF "\{\\page\}\n" ;
    $numPage++ ;
} ; # fin sub ecritNumerodePage

sub nouvellePage {
    &sautDePage() ;
    &ecritNumerodePage() ;
} ; # fin sub nouvellePage
