#!/usr/bin/perl -W

# TP texte en perl
#
# Question II - 2
# 
# Antoine Miné
# 26/01/2007

# penser à faire "export COMLUMNS" avant de lancer le script!
# si COLUMNS n'est pas défini, on utilise 80 par défaut
$cols = $ENV{COLUMNS} || 80;

# lit les arguments
while ($ARGV[0])
{
    if ($ARGV[0] eq "-c")
    {  
	shift; # décale un tableau, @ARGV par défaut
	$cols = $ARGV[0];
    }
    else 
    {
	push @files,$ARGV[0];
    }
    shift; # décale @ARGV par défaut
}

# si pas de fichier, on prend l'entrée standard
if ($#files<0) { @files=("-"); }


$vide=1;  # la dernière ligne était-elle vide ?
$par="";  # accumulateur de paragraphe

# boucle principale
for $FILE (@files)
{
    # version courte d'open: ouvre $FILE dans FILE
    open (FILE) or die "$FILE: $!";
    while (<FILE>)
    {
	if (/^\s*$/)
	{
	    # fin de pagraphe
	    &paragraphe;
	    $par="";
	}
	else
	{
	    # accumule la ligne dans le paragraphe
	    $vide=0;
	    $par="$par $_";
	}
    }

    # affiche le dernier paragraphe
    &paragraphe;

    close FILE
}


# découpe $par en lignes
sub paragraphe
{
    $_ = $par;
    return if /^\s*$/;  # saute un paragraphe vide
    s/^\s*//g;          # mange les espaces en début de ligne
    s/\s*$//g;          # mange les espaces en fin de ligne
    s/\s*([)\]])/$1 /g; # mange les espace avant ) ] et ajoute-en un après
    s/([(\[])\s*/ $1/g; # mange les espace après ( [ et ajoute-en un avant
    s/([;:!?])/ $1 /g;  # ajoute un espace avant ; : ! ?
    s/\s*([.,])/$1 /g;  # mange les espace avant , . et ajoute-en un après
    s/\s+/ /g;          # mange les espaces multiples
    $pos=0;      # colonne courante
    foreach (split)
    {
	if ($pos+length>=$cols-2)
	{
	    # plus de place sur la ligne, on passe à la suivante
	    print "\n";
	    $pos=0;
	}
	elsif ($pos>0) { print " "; }
	print "$_";
	$pos += 1+length;
    }
    print "\n\n";
}
